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. sap上线前的十大思考
  2. PHPRPC for PHP
  3. 卡夫卡队列_卡夫卡编年史队列基准
  4. MySQL性能指标及计算方法
  5. Accumulator
  6. 不能头脑一热,就布局颠覆性技术、上马未来产业
  7. java静态初始化块无法直接调用,关于JAVA静态初始化块,初始化块,构造器调用顺序的有关问题...
  8. SUSE12SP3-Mycat(2)Schema.xml配置详解
  9. 【Linux】目录中 / 和 ~ 的区别
  10. Flex Builder教程
  11. Sublime Text3的安装和使用
  12. JVM常见面试题及详解
  13. java ing印版,Be alaways javaing...
  14. 分离整数的各个数位的两种方法
  15. 计算机视觉项目-文档扫描OCR识别
  16. 四川长虹IHO-3300AD_高安版_S905L3芯_精简优化_线刷固件包
  17. 公司产品移动端网页-前端网页设计技术精美网站源码HTML+CSS+JS
  18. COUNT计算机公式,countif函数的使用方法(统计考勤函数计算公式)
  19. FRM 5.2 资本资产定价模型
  20. 执行 npm install -g grunt-cli 安装grunt发生错误问题

热门文章

  1. android记事本程序需求分析文档,记事本程序的需求分析
  2. 函数cvtColor
  3. .cs是什么文件_python自动化能发挥到什么程度,两个有趣的个人案例告诉你
  4. html中 label里for属性和form属性
  5. 结构体、枚举类型和联合体
  6. 第146章 SQL函数 TO_POSIXTIME
  7. django 单表查询
  8. c语言万年历论文3000字,万年历C语言报告3
  9. 有过错方可以主张离婚经济帮助
  10. 【论文翻译_知识蒸馏】Distilling Holistic Knowledge with Graph Neural Networks