Collections的copy()方法和ArrayList的大小问题

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

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

使用后者进行拷贝的结果是:当你的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,其实它是对一个空数组的浅拷贝。

Collections的copy()方法和ArrayList的大小问题相关推荐

  1. 【转】Collections的copy()方法和ArrayList的大小问题

    Collections的copy()方法和ArrayList的大小问题 偶然看到了Collections的copy(List desc,List src)方法.当时就想这个方法和初始化一个List d ...

  2. Java创建数组的三种方法和ArrayList的用法

    Java创建数组的三种方法和ArrayList的用法 Java创建数组的三种方法 一.声明并赋值 二.声明数组名开辟空间 三.声明数组并指定元素个数 四.多维数组 ArrayList的用法 一.添加元 ...

  3. Python:序列的copy() 方法和 copy 模块

    一.序列中的 copy() 方法 此方法为浅度复制:复制的数会随着被复制数的嵌套序列的元素的改变而改变: 功能:将一个列表复制给另一个列表 格式:list_1 = list_2.copy(),(字典. ...

  4. ArrayList中remove方法和set(null)的区别

    在分析源码ArrayList.remove()时,偶然发现了一个疑惑的点,就是:源码也是将最后一个对象的引用指向null(源码:elementData[--size] = null; // clear ...

  5. 用dos命令破解网吧限制的方法和dos命令全集[color]

    用dos命令破解网吧限制的方法和dos命令全集[color] 这是我收集的破解网吧限制的一些方法仅供大家学习参考哈~~ 一:就是网吧限制本地硬盘的访问. 一般情况下这有两种可能,一种就是简单的隐藏掉, ...

  6. C#中的委托,匿名方法和Lambda表达式

    简介在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Firs ...

  7. Loader的load方法和loadBytes方法LoaderContext参数

    (1)在看代码的时候还发现一个以前没有这么注意的问题,也mark一下. 关于Loader的load方法和loadBytes方法LoaderContext参数的问题.. 要加载某个SWF到自己的安全域内 ...

  8. hashcode()方法和equals()方法

    一.hashcode()方法和equals()方法的介绍 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.eq ...

  9. php静态方法场景,深入介绍PHP中的static的修饰方法和yield的使用场景

    相信PHP程序员对于生成器并不陌生,但是也有很多人并不知道生成器这个功能,因为它是后期才能大家熟知的,下文是爱站技术频道小编带给大家的深入介绍PHP中的static的修饰方法和yield的使用场景,一 ...

最新文章

  1. Redis入门到精通-Redis高级命令
  2. Linux Shell编程基础
  3. Arduino产生PWM的3种方法
  4. Struts初步知识
  5. 使用C#把Tensorflow训练的.pb文件用在生产环境
  6. Spring MVC会话教程
  7. 物联网与万物互联有什么区别?
  8. EndNote X9导入论文投稿的期刊参考文献格式
  9. 创建服务器定时运行程序
  10. 【codeforces round#800 B. Paranoid String】DP
  11. 深入理解Flash的沙箱 – Application Domains
  12. P3P求解相机姿态原理介绍
  13. yapi 权限_YAPI安装方法
  14. win7安装office2013过程中出现 office 15 click-to-run extensibility component提示
  15. 接口测试有那些工具,他们的优劣势?
  16. 思科交换机 3560配置
  17. 格式工厂 由于应用程序配置不正确,应用程序未能启动的解决方法
  18. ENVI教程:InSAR技术选择GCP ,用于轨道精炼
  19. 程序猿的意义--纪念那些曾经辉煌过和即将辉煌的程序猿
  20. 关于DFS(分布式管理系统)——独立空间,文件夹的隶属关系和设置——安装和参数

热门文章

  1. c语言分治法求众数重数_分治法求众数问题 (配图)
  2. 哪个家用投影仪性价比高?全面测评50天后盘点高性价比投影仪推荐
  3. 如何做到,在35岁后不被猎头嫌弃???
  4. 一文清晰解读:数字化转型的行进路线与全景图
  5. phpstorme -》Typo: In word 拼写检查
  6. 雷哥带你走进Javascript
  7. 【基础】——HTML VS Web窗体
  8. shell 中 if 和 else 用法详解
  9. 9. Matlab仿真二阶弹簧阻尼系统
  10. 需要将表格做成web端应用 表格大概200多个 表格字段基本上都差不多 每张表的字段差不多100多个 每张表的接口就2个业务都是一样的 请问该怎么做?