如何实现ArrayList<E>泛型的复制
来源:互联网 发布:常用数据结构和算法 编辑:程序博客网 时间:2024/06/06 21:16
问题解释:
现在一个类ImmutableQueue里有一个私有变量iQueue,这是一个ArrayList<E>泛型变量。我现在要得到他的一个副本,以便对这个私有变量的内容进行访问,并且不修改iQueue的内容。
解决:
首先说System.arraycopy(),直接写System.arraycopy(iQueue,0,CopyQueue,0,size),会报错:
ArrayStoreException。似乎是因为arraycopy不支持泛型。
用Addall倒是不会报错,奇怪的是Addall其实是System.arraycopy()实现的,不太清楚为什么。但是无论是addall还是arraycopy(),都是浅复制,如果对CopyQueue,可能会影响到原来变量的内容。
下面回顾一下深复制和浅复制。
比如一个类:
</pre><pre name="code" class="java">class A{ int value; B b}class B{ char key;}
a中有另一个类b的对象的引用,那么对A的一个对象a1的浅复制a2,他们的b都指向同一个B的对象。如果是深复制,则他们的b指向不同的B对象。clone是浅复制,arraycopy也是浅复制。深复制使用序列化来完成,这里借鉴下别人的代码: 首先要在原来的类后面加implements Serializable:
然后写deepcopy的函数:
public ArrayList<E> getQueueCopy() throws Exception{ ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(iQueue); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); @SuppressWarnings("unchecked")ArrayList<E> CopyQueue = (ArrayList<E>) in.readObject(); return CopyQueue; }
但是要求你的E也是实现了序列化的类。不然似乎也不行……希望以后能找到比较好的方法。
0 0
- 如何实现ArrayList<E>泛型的复制
- java jdk是如何实现ArrayList的?
- 深入学习java集合:ArrayList<E>实现
- ArrayList 的深复制与浅复制
- ArrayList<E>
- java集合ArrayList<E>的自身嵌套
- ArrayList的泛型
- c++ 如何实现vector内容的复制
- ArrayList.add(int index, E e)的数组越界
- 基于泛型实现ArrayList的复合排序
- ArrayList中的remove方法是如何实现的
- List<List<E>> list = new ArrayList<ArrayList<E>>()报错的解决方法
- ArrayList类的实现
- ArrayList的实现原理
- ArrayList的实现
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList的实现
- 图片旋转和复位类似于qq空间的图片
- 当硬件创新遇到传统供应链,十个重点
- HDU 4752 Polygon
- 报表查询页面js(柜员comboGrid)
- 一个大学毕业生的反思《下》
- 如何实现ArrayList<E>泛型的复制
- memache减少数据库的更新次数
- 呵呵!
- javascript面向对象包装类Class的类库解析
- 关于回车与换行
- helloworld驱动程序
- OCP 1Z0 051 128
- 多态性之运算符重载(二)
- Java 解决采集UTF-8网页空格变成问号乱码