ArrayList 初始化的三种方式

1. 使用 Arrays.asList() 实现

ArrayList<Object> obj = new ArrayList<Type>(Arrays.asList(Object o1, Object o2, Object o3, ....so on));

案例:

List<String> strList = new ArrayList<String>(Arrays.asList("2", "5", "8", "0"));

ArrayList值:[2, 5, 8, 0]

2. 通过 匿名内部类 调用 add 方法实现

List<Object> objList = new ArrayList<Object>() {{ add(Object o1); add(Object o2); add(Object o3); ...}};

案例:

       List<String> strList = new ArrayList<String>(){{add("str1"); add("str2"); add("str3");}};

ArrayList值:[str1, str2, str3]

3. 使用 Collections.ncopies() 复制实现指定数目相同内容的赋值

 // 把元素 element 复制指定次数 num 次,赋值给ArrayListList<Object> objList = new ArrayList<Object>(Collections.nCopies(Integer num, Object element));

案例:

  List<String> strList = new ArrayList<>(Collections.nCopies(10, "str"));

ArrayList值:[str, str, str, str, str, str, str, str, str, str]


List集合复制

User类

class User{private String a;private String b;
}

1. 通过循环遍历复制List集合

        List<User> userList = new ArrayList<>();User user0 = new User("a0", "b0");userList.add(user0);userList.add(new User("a1", "b1"));userList.add(new User("a2", "b2"));//创建临时集合,通过循环遍历赋值List<User> temp = new ArrayList<>();for(User user: userList){temp.add(user);}//或者通过new 来赋值/*for(User user: userList){User u = new User();u.setA(user.getA());u.setB(user.getB());temp.add(user);}*///修改其中任意集合中的对象属性(修改userList或者temp中的对象)userList.get(0).setA("修改AAA000");userList.get(0).setB("修改BBB000");userList.get(1).setA("修改AAA111");userList.get(1).setB("修改BBB111");System.out.println("userList : " + userList);System.out.println("temp : " + temp);

运行结果:

userList : [User{a=‘修改AAA000’, b=‘修改BBB000’}, User{a=‘修改AAA111’, b=‘修改BBB111’}, User{a=‘a2’, b=‘b2’}]
temp : [User{a=‘修改AAA000’, b=‘修改BBB000’}, User{a=‘修改AAA111’, b=‘修改BBB111’}, User{a=‘a2’, b=‘b2’}]

发现:修改列表中的对象的属性值,另一个列表的值也发生了改变。

原因:对象之间的值是复制的引用地址,对User的属性A,B修改都是修改的同一常量池的值。

解决办法:通过new对象,开辟新的内存空间,来修改值。

     List<User> userList = new ArrayList<>();User user0 = new User("a0", "b0");userList.add(user0);userList.add(new User("a1", "b1"));userList.add(new User("a2", "b2"));//创建临时集合,通过循环遍历赋值List<User> temp = new ArrayList<>();for(User user: userList){temp.add(user);}//通过new对象,开辟新的内存空间,来修改值userList.set(0, new User("AAA000", "BBB000"));System.out.println("userList : " + userList);System.out.println("temp : " + temp);

运行结果:

userList : [User{a=‘AAA000’, b=‘BBB000’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}]
temp : [User{a=‘a0’, b=‘b0’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}]

发现:对userList列表的修改,对temp的值没有发生变化

原因:因为new对象,开辟了新的内存空间,所以两个指向的内存是不同的。

同理:new一个对象,增加到列表中去,对另一个列表也是没有影响的

         List<User> userList = new ArrayList<>();User user0 = new User("a0", "b0");userList.add(user0);userList.add(new User("a1", "b1"));userList.add(new User("a2", "b2"));//创建临时集合,通过循环遍历赋值List<User> temp = new ArrayList<>();for(User user: userList){temp.add(user);}///通过new对象,然后新增到列表中User userAdd = new User("addA", "addB");userList.add(userAdd);System.out.println("userList : " + userList);System.out.println("temp : " + temp);

运行结果:

userList : [User{a=‘a0’, b=‘b0’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}, User{a=‘addA’, b=‘addB’}]

temp : [User{a=‘a0’, b=‘b0’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}]

发现:新增是不会对复制的列表有什么影响的。

2. 可以采用ArrayList的addAll()方法来进行复制集合

addAll()方法:传入参数List,将List中所有的元素加入到新的List集合去,前List会增加的元素个数等于传入的List的大小。

     List<User> userList = new ArrayList<>();User user0 = new User("a0", "b0");userList.add(user0);userList.add(new User("a1", "b1"));userList.add(new User("a2", "b2"));//创建临时集合,通过addAll方法复制userList集合List<User> temp = new ArrayList<>();temp.addAll(userList);userList.get(0).setA("修改AAA000");userList.get(0).setB("修改BBB000");System.out.println("userList : " + userList);System.out.println("temp : " + temp);

运行结果:

userList : [User{a=‘修改AAA000’, b=‘修改BBB000’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}]

temp : [User{a=‘修改AAA000’, b=‘修改BBB000’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}]

3. 其他方式

//创建临时变量(toArray返回Object)
List<Object> temp =  Arrays.asList(userList.toArray());
//直接使用 =
//  这种方式只是定义一个引用,指向源集合userList的内容,对其修改新增,两个集合内容变化相同
List<User> temp = userList;
//这种方式,修改两个集合变化相同,新增,另一个无变化
List<User> temp = new ArrayList<>(userList);

上述方式其实都是浅层复制,当修改原list时,新list也会改变(增加不会),不能达到生成一个完全新的互不影响的list的效果。

4. 通过Stream复制List生成两个互不影响的集合

        List<User> userList = new ArrayList<>();User user0 = new User("a0", "b0");userList.add(user0);userList.add(new User("a1", "b1"));userList.add(new User("a2", "b2"));//stream流复制(深度复制)List<User> temp = userList.stream().map(user -> {//new对象,开辟空间User u = new User();u.setA(user.getA());u.setB(user.getB());return u;}).collect(Collectors.toList());//修改userList.get(0).setA("修改AAA000");userList.get(0).setB("修改BBB000");System.out.println("userList : " + userList);System.out.println("temp : " + temp);

运行结果:

userList : [User{a=‘修改AAA000’, b=‘修改BBB000’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}]
temp : [User{a=‘a0’, b=‘b0’}, User{a=‘a1’, b=‘b1’}, User{a=‘a2’, b=‘b2’}]

发现:通过Stream对List进行复制之后,对其中一个list进行修改,不会影响另一个list的值。

List初始化、集合复制相关推荐

  1. 阿里巴巴为什么让初始化集合时必须指定大小?

    来源 | Java中文社群(ID:javacn666) 哈喽,亲爱的小伙伴们,技术学磊哥,进步没得说!欢迎来到新一期的性能解读系列,我是磊哥. 今天给大家带来的是关于阿里巴巴<Java开发手册& ...

  2. 2 resize 到指定大小_阿里巴巴为什么让初始化集合时必须指定大小?

    这是我的第 205 期分享 作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 哈喽,亲爱的小伙伴们,技术学磊哥,进步没得说!欢迎来到 ...

  3. C++直接初始化与复制初始化的区别深入解析

    首先:这是原文地址,这个哥们的文章解决了我的问题.谢谢这个哥们了.下面把原文地址放在这里: https://www.jb51.net/article/54773.htm C++中直接初始化与复制初始化 ...

  4. java初始化集合_Java 中初始化 List 集合的 6 种方式!

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 如果想学习Java工程化.高性能及分布式.深入浅出. ...

  5. Java_数组(声明、创建、初始化、复制、增强型for循环、二维数组、排序、Arrays类)

    Java_数组 数组的基本概念 声明数组 创建数组 初始化数组 方法一:分配空间与赋值分步进行 方法二:分配空间,同时赋值 增强型for循环 复制数组 二维数组 排序 Arrays类 copyOfRa ...

  6. C++直接初始化和复制初始化

    (1)复制初始化的基本原理 我们知道,对象在内存中的直接表象是在内存中占有一个一定大小的空间.分配空间是建立对象的第一步.但是刚刚分配的空间就像一个没有开垦的荒田,或者是前面对象占有之后留下来的残余, ...

  7. 各大网站CSS代码初始化集合

    转自http://www.cnblogs.com/liumobai/p/5005623.html css代码之所以初始化,是因为能尽量减少 各浏览器之间的兼容性问题! 腾讯QQ官网 样式初始化 bod ...

  8. [转载] Java复制对象与集合工具类

    参考链接: Java中的类和对象 项目中经常需要将某个对象的属性值复制给另一个对象,或者将一个集合复制到另一个集合.利用spring提供的BeanUtils,自己简单封装了一个工具类. public ...

  9. .db怎么复制到java里_如何在MongoDB中将集合从一个数据库复制到另一个数据库

    回答(17) 2 years ago 你可以这样做: db..find().forEach(function(d){ db.getSiblingDB('')[''].insert(d); }); 请注 ...

最新文章

  1. 设备节点注册和操作方法连接
  2. 怎么用MYSQL分析财务数据_如何使用Mysql正确的处理财务数据
  3. android 地图服务开发 INSTALL_FAILED_MISSING_SHARED_LIBRARY 错误解决
  4. prometheus和grafana、node_exporter监控服务资源
  5. PHP — Cookie and Session篇
  6. IntelliJ IDEA常用的快捷键(代码提示/注释代码/加入类注释和方法注释Javadoc)
  7. mysql主从配置错误_mysql主从配置常见错误处理
  8. php 目录管理,PHP_php目录管理函数小结,chdir : 改变目录。 dir : 目录类 - phpStudy...
  9. 力扣637. 二叉树的层平均值(JavaScript)
  10. 一文读懂公有云的现状与未来
  11. python拦截数据包_使用Python进行TCP数据包注入(伪造)
  12. Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法
  13. fork函数与execve函数
  14. 回波损耗和电压驻波比
  15. GreeDAO 使用
  16. 2022苹果AppStore应用商店上传与APP上传流程必看(基础篇)
  17. 教大家用python画皮卡丘的脸
  18. 机器学习中precision和accuracy区别
  19. 进一步的飞鸽传书官方网站消息
  20. es数据库查询API

热门文章

  1. java list 多线程add_Java多线程并发中支持并发的list对象
  2. Python3----多线程并发post请求
  3. IB DP 语言怎么选?
  4. Python解码、编码Json的方法详解
  5. 面向对象编程原则(07)——接口隔离原则
  6. kali-dmitry
  7. webstorm安装教程详解
  8. 2023中国智能仓储领域最具商业合作价值企业盘点
  9. 卫士通Linux C面试笔试题
  10. Unity真机非全屏播放视频