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)


相关推荐

发表回复

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

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