List初始化、集合复制

List初始化、集合复制List集合复制User类classUser{privateStringa;privateStringb;}1.通过循环遍历复制List集合List<User>userList=newArrayList<>();Useruser0=newUser(“a0″,”b0”);userList.add(user0);userList.add(newUser(“

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

ArrayList 初始化的三种方式

1. 使用 Arrays.asList() 实现

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

Jetbrains全家桶1年46,售后保障稳定

案例:

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 次,赋值给ArrayList
    List<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的值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/200774.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 网管工具软件_netscan

    网管工具软件_netscan转发:http://baike.baidu.com/view/1358799.htmCacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。Cacti是通过snmpget来获取数据,使用RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、

  • 项目范围管理:项目范围管理的概念是什么_项目范围管理规划案例

    项目范围管理:项目范围管理的概念是什么_项目范围管理规划案例项目范围管理包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程。 项目范围管理关注的焦点是:什么是包括在项目之内的,什么是不包括在项目之内的,即为项目工作明确划定边界。 对项目范围管理和控制的有效性,是衡量项目是否达到成功的一个必要标准,项目范围的管理不仅仅是项目整体管理的一个主要部分,同时在项目中不断地重申项目工作范围,有利于项目不偏离轨道,是项目中实施控制管理的一个主要手段。 项目范围是项目其他各方面管理的基础。如果范围都弄不清楚,成本、进度和质量等就无从谈起。确认项目范围对项目管理有如

  • 遍历ArrayList,并删除某些元素的方法实现「建议收藏」

    遍历ArrayList,并删除某些元素的方法实现「建议收藏」本文是根据https://blog.csdn.net/qq_32575047/article/details/78902254的帖子进行整理的,在此感谢一下。题目:一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为”abc”的字符串元素,请用代码实现。publicclassTest1{public…

  • Beta版是什么意思

    Beta版是什么意思

    2021年10月18日
  • zip文件后缀改成什么可以用_zip格式转rar格式

    zip文件后缀改成什么可以用_zip格式转rar格式案例2,批量修改文件扩展名\后缀名1上面介绍的是只修改某一类的后缀名,那么如果我整个文件夹下面的所有类型的文件都要修改怎么办呢?如下图什么类型的文件都有呢【强烈推荐】如何批量修改文件后缀名?超详细2其实也很简单,只需要修改一个参数就好了。如下图找到刚刚那个bat文件,右键编辑–或者用记事本打开。(注意:在*之前有一个英文的空格把命令改成,ren.*.gif  格式 ren空格星点星空格星点文件后缀名【强烈推荐】如何批量修改文件后缀名?超详细【强烈推荐】如何批

    2022年10月12日
  • Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout)

    Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号