今天发现单独的将一个ArrayList的对象添加到另外一个ArrayList的时候,总是源列表和目的列表相同的内存地址。原因如下:

偶然看到了Collections的copy(List desc,List src)方法.当时就想这个方法和初始化一个List desc = new  ArrayList(List c)【参数必须实现Collection接口】的区别。



两者的差别很大,后者是一个浅拷贝,只是对源list的元素进行拷贝,拷贝的只是引用。拷贝后两个list的元素(引用)不同,但是引用所指向的对象是一

样的。即是两个list的每个元素指向的还是通一内存。然而前者是深拷贝,不光拷贝的是src的元素(引用),src内每个元素的所指向的对象都进行一次
拷贝。即是两个list的每个元素所指向的不是同一内存。

所以使用了Collections.copy()方法来进行拷贝,但是这样就接触到了此方法所报出的异常:

使用后者进行拷贝的结果是:当你的desc链表发生改变时,src也将会随之改变。

使用前者进行拷贝时你又必须要注意目标链表的长度必须要比源链表的长度大或者相等。



举例如下:

List src1
=
new
 ArrayList(
3
)

src1.add(
"
a
"
);

src2.add(
"
b
"
);

src3.add(
"
c
"
);



如果你使用下面方法copy链表

/**
****************************
*/


List des1
=
new
 ArrayList(
3
);

Collections.copy(des1,src1);

/**
****************************
*/


将会出错,抛出数组越界异常。

当时我怎么想都想不明白为什么,明明已经设置了长度为3,为什么还会出错!

后来打印出des1.size()才知道des1的长度为0;3表示的是这个List的容纳能力为3,并不是说des1中就有了3个元素。查看api才知
道,它的capacity(容纳能力大小)可以指定(最好指定)。而初始化时size的大小永远默认为0,只有在进行add和remove等相关操作
时,size的大小才变化。然而进行copy()时候,首先做的是将desc1的size和src1的size大小进行比较,只有当desc1的
size 大于或者等于src1的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常。



所以可以通过下面的方法指定目标desc的大小

/**
****************************
*/


List des1
=
new
 ArrayList(Array.asList(
new
 object[src1.size]));
//
注意:new ArrayList(Collection col)参数必须要实现Collection 接口。

Collections.copy(des1,src1);

/**
****************************
*/


执行第一句后size的大小是3,其实它是对一个空数组的浅拷贝。

使用这位仁兄的方法,我这边一直报错说找不到此构造函数,估计是因为我使用了jdk6的原因,后来使用了替代方法,用apache的CollectionUtils:

dest1 
=
 
new
 ArrayList();

CollectionUtils.addAll(dest1, 
new
 Object[src1.size()]);

Collections.copy(dest1, src1);

java.util.Collections.copy()方法注意点的更多相关文章

  1. java.util.Collections.copy():列表List浅拷贝

    今天同事问我怎样将一个列表(list1)拷贝到另一个列表(list2),然后修改新的列表(list2)不会影响到旧的列表(list1),想了一想,这是深拷贝啊. 可是,除了循环new还有别的办法吗,想 ...

  2. java.util.Collections.synchronizedSet()方法的使用

    下面的例子显示java.util.Collections.synchronizedSet()方法的使用 package com.; import java.util.*; public class C ...

  3. 类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。

      类 java.util.Collections 提供了对Set.List.Map进行排序.填充.查找元素的辅助方法. 1. void sort(List) //对List容器内的元素排序,排序的规 ...

  4. 要点Java20 java.util.Collections

    java.util.Collections 集合帮助类 演示样例程序(JUnit演示) 排序 @Test public void testSort() { List<Integer> de ...

  5. 集合-强大的集合工具类:java.util.Collections中未包含的集合工具

    任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法.这是Guava最流行和成熟 ...

  6. java.util.Collections.unmodifiableMap 示例

    1. 概述 public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m) ...

  7. 005-guava 集合-集合工具类-java.util.Collections中未包含的集合工具[Maps,Lists,Sets],Iterables、Multisets、Multimaps、Tables

    一.概述 工具类与特定集合接口的对应关系归纳如下: 集合接口 属于JDK还是Guava 对应的Guava工具类 Collection JDK Collections2:不要和java.util.Col ...

  8. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  9. [Google Guava] 强大的集合工具类:java.util.Collections中未包含的集合工具

    转载的,有问题请联系我 原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collecti ...

随机推荐

  1. git删除未被追踪的文件

    # 先看看会删掉哪些文件,防止重要文件被误删 git clean -n # 删除 untracked files git clean -f # 连 untracked 的目录也一起删掉 git cle ...

  2. 在代码生成工具Database2Sharp中增加Vue&Element 工作流页面的快速生成

    在我们基于框架开发系统的时候,往往对一些应用场景的页面对进行了归纳总结,因此对大多数情况下的页面呈现逻辑都做了清晰的分析,因此在我们基于框架的基础上,增量式开发业务功能的时候,能够事半功倍.代码生成工 ...

  3. 计算机网络tcp

    tcp/ip协议 什么是这个协议:计算机与网络设备之间通信的时候,两者需要使用相同的语言,如何侦察到对方,如何传输,谁先传输,都需要规定有一系列的协议,而tcp/ip协议则是这样的一种 tcp/ip的 ...

  4. Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)

    Django 小实例S1 简易学生选课管理系统 第9节--创建课程模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 对于课程模块, ...

  5. 【Git 系列】基础知识全集

    Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具. 一.Git 基础 ...

  6. [spojQTREE5]Query on a tree V

    合理的正解大概是动态点分治,这里给出其实现 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 st ...

  7. [hdu6990]Directed Minimum Spanning Tree

    模板题:在有向图中,对每一个点求以其为根的最小(外向)生成树 (当图是强连通时)可以使用朱刘算法,算法过程如下: 1.对每一个节点,选择指向该点的边权最小的边,即得到一张子图 2.任选这张子图的一个简 ...

  8. [gym102268E]Expected Value

    令$X$为移动次数,答案即$\sum_{i=0}^{\infty}P(X>i)$,后者记作$S_{i}$ 关于$S_{i}$,令$f_{i,j}$表示走了$i$步后位于$j$且未到达过$k$的概 ...

  9. 什么是JIT?

    目录 什么是JIT? 为什么HotSpot虚拟机要使用解释器与编译器并存的架构? 编译的时间开销 什么是JIT? 1.动态编译(dynamic compilation)指的是"在运行时进行编 ...

  10. DirectX12 3D 游戏开发与实战第十一章内容

    仅供个人学习使用,请勿转载.谢谢! 11.模板 模板缓冲区(stencil buffer)是一种"离屏"(off-screen)缓冲区,我们可以利用它来实现一些效果.模板缓冲区.后 ...