Android 以流的形式复制集合所有元素到另一个集合
来源:互联网 发布:淘宝为什么打压外贸店 编辑:程序博客网 时间:2024/06/15 16:05
一:单个对象复制
Fruit fruit = new Fruit();fruit.setNameString("apple");fruit.setWeight(2);Fruit fruit2 = fruit;上面代码是把 fruit的引用复制给fruit2,这样,fruit和fruit2同时指向一个内存地址,通过任何一个对象修改属性值都会影响到另一个Fruit对象,这里介绍一种通过流的方式把对象复制给另一个对象的方法。
主要用到的两个类:ObjectOutputStream、ObjectInputStream;并且,要被复制的类必须实现接口Serializable
下面给出bean的代码:
public class Fruit implements Serializable {private String nameString;private int weight;public String getNameString() {return nameString;}public void setNameString(String nameString) {this.nameString = nameString;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}}下面是测试类代码:
public class CopyTest {public static void main(String[] args) {// TODO Auto-generated method stubFruit fruit = new Fruit();fruit.setNameString("apple");fruit.setWeight(2);Fruit fruit2 = null;// 内存输出流ByteArrayOutputStream bos = new ByteArrayOutputStream();// 内存输入流ByteArrayInputStream bis;try {// object输出流ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(fruit);bis = new ByteArrayInputStream(bos.toByteArray());// object输入流ObjectInputStream ois = new ObjectInputStream(bis);fruit2 = (Fruit) ois.readObject();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(fruit.toString());System.out.println(fruit2.toString());}}
运行结果:
com.zy.bean.Fruit@edf3f6com.zy.bean.Fruit@b25b9d
从运行结果可以看出来 fruit和fruit2分别有自己的内存空间,这样就实现了把fruit的内容复制给fruit2,并重新开辟一块新的内存空间的效果。当然,你也可以直接new一个Fruit对象,然后赋和fruit一样的属性值,效果是一样的。
二:集合复制
看下面代码:
Fruit fruit = new Fruit();fruit.setNameString("apple");fruit.setWeight(2);Fruit fruit2 = new Fruit();fruit2.setNameString("orange");fruit2.setWeight(3);ArrayList<Fruit> arrayList = new ArrayList<Fruit>();arrayList.add(fruit);arrayList.add(fruit2);ArrayList<Fruit> arrayList2 = new ArrayList<>();arrayList2.add(fruit);arrayList2.add(fruit2);<pre name="code" class="java">System.out.println(arrayList.toString());System.out.println(arrayList2.toString());
运行结果:
[com.zy.bean.Fruit@1de256f, com.zy.bean.Fruit@16bd8ea][com.zy.bean.Fruit@1de256f, com.zy.bean.Fruit@16bd8ea]
可见,虽然两个list都是new出来的,但它们所添加的元素都是拥有相同内存的,这样修改一个肯定会改变另一个集合中的元素属性值。
改变arrayList2的赋值方式,通过调用addAll()方法来试一下:
ArrayList<Fruit> arrayList2 = new ArrayList<>();//arrayList2.add(fruit);//arrayList2.add(fruit2);arrayList2.addAll(arrayList);运行结果:
[com.zy.bean.Fruit@16bd8ea, com.zy.bean.Fruit@16e1fb1][com.zy.bean.Fruit@16bd8ea, com.zy.bean.Fruit@16e1fb1]
同上。下面以流的方式把arraryList的元素复制给arrayList2,代码如下:
public class ClassTest {@SuppressWarnings("unchecked")public static void main(String[] args) {// TODO Auto-generated method stubFruit fruit = new Fruit();fruit.setNameString("apple");fruit.setWeight(2);Fruit fruit2 = new Fruit();fruit2.setNameString("orange");fruit2.setWeight(3);ArrayList<Fruit> arrayList = new ArrayList<Fruit>();arrayList.add(fruit);arrayList.add(fruit2);ArrayList<Fruit> arrayList2 = null;//arrayList2.add(fruit);//arrayList2.add(fruit2);//arrayList2.addAll(arrayList);// System.out.println(fruit.toString());// System.out.println(fruit2.toString());ByteArrayOutputStream byteout = new ByteArrayOutputStream();ObjectOutputStream stream;try {stream = new ObjectOutputStream(byteout);stream.writeObject(arrayList);ByteArrayInputStream bytein = new ByteArrayInputStream(byteout.toByteArray());ObjectInputStream in = new ObjectInputStream(bytein);arrayList2 = (ArrayList<Fruit>) in.readObject();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(arrayList.toString());System.out.println(arrayList2.toString());}}
运行结果:
[com.zy.bean.Fruit@e6f7d2, com.zy.bean.Fruit@9be79a][com.zy.bean.Fruit@1a28362, com.zy.bean.Fruit@5fcf29]
这样就实现了把一个集合中的元素复制到另一个集合中,而两个集合中具有相同属性值的对象拥有不同内存空间的效果,这样,修改arrayList的值就不会影响到arrayList2的值了。
0 0
- Android 以流的形式复制集合所有元素到另一个集合
- 怎么把一个集合的数据复制到另一个集合 不是引用传递(地址传递)
- 一个类在另一个类中以集合形式声明为属性时应该注意的问题
- 集合(3)把一个集合插入到另一个集合中
- 33、C#:linq查本集合中不包含于另一个集合的元素
- 集合框架(一)续 向集合中添加一个集合、数组和List之间的相互转换、从集合中删除另一个集合所包含的元素
- ASP Request对象的ServerVariables集合的所有元素名称
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
- Java中如何判断一个集合中的一个元素不在另一个集合中?把不存在的元素移除
- 求集合元素的所有非空子集
- [leetcode 46] Permutations------数组中元素的所有排列组合集合
- 不包含重复元素的集合S,求其所有子集
- 页面数据以弹出框的形式提交到另一个action中
- 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文
- 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文
- Hibernate 集合的加载形式
- 集合(2)把一个list集合中特定字段插入到另一个集合的特定字段中
- 循环时不可以修改集合元素
- iOS开发如何判断字符串是否是整数,浮点数,纯数字
- std::string用法总结
- 插入排序
- 简单的用户信息管理
- 代理——AOP框架实例
- Android 以流的形式复制集合所有元素到另一个集合
- Oracle(十二)PL/SQL 触发器
- SSL/TLS的Java实现--JSSE
- 第一次复习课--eclipse快捷代码输入/Android架构/Android资源/Intent/Activity/Service
- SpringMVC的四个基本注解annotation(控制层,业务层,持久层) -- @Component、@Repository @Service、@Controller
- UIday1401:可视化编程xib
- Jquery跨域获得Json(实例)
- c语言-位运算
- 心理学定律第二篇