`
月亮不懂夜的黑
  • 浏览: 154174 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

list对象复制问题

阅读更多

Java中的List.addAll复制对象

测试代码

import java.util.ArrayList;
import java.util.List;

/** 
* @author  yannis
* @date create time:2016年10月31日 上午11:10:31 
* @version 1.0 
* @parameter  
* @since  
* @return  
*/

public class Demo {
	public static void main(String[] args) {
		List<Person> list1 = new ArrayList<Person>();
		list1.add(new Person("li","2", 23));
		list1.add(new Person("wang","1", 30));
		list1.add(new Person("zhang","2", 40));
		list1.add(new Person("hu","2", 35));
		list1.add(new Person("chen","1", 60));
		
		List<Person> list2 = new ArrayList<Person>();
		list2.addAll(list1);
		list2.get(0).setName("hanmeimei");
		
		list1.get(1).setName("kkkk");

		for(Person person:list1){
			System.out.println(person.name);
		}
		
		for(Person person:list2){
			System.out.println(person.name);
		}
	}
	
	
	static class Person{
		private String name;
		private String sex;
		private Integer age;
		
		public Person(String name, String sex, Integer age) {
			super();
			this.name = name;
			this.sex = sex;
			this.age = age;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getSex() {
			return sex;
		}
		public void setSex(String sex) {
			this.sex = sex;
		}
		public Integer getAge() {
			return age;
		}
		public void setAge(Integer age) {
			this.age = age;
		}
		
	}
}

 通过测试发现,无论此时修改list1,或者list2 都会影响到两个list.运行结果如下

hanmeimei
kkkk
zhang
hu
chen
hanmeimei
kkkk
zhang
hu
chen

 

 由此可见,使用list.addAll只是把后者的对象的地址指向复制给了前面的list。所以造成一改全改

0
1
分享到:
评论
2 楼 月亮不懂夜的黑 2016-11-08  
cxjhiueannn 写道
查看addAll方法的实现其实并不是将后者的引用对象赋值给前面的list.
之所以会出现一改全改是因为两个list里面所存的对象是指向的同一个对象。
就像 Object obj = new Object();Object obj2 = obj;一样。如果你需要复制后分开 你需要在复制对象的时候克隆对象,就像Object obj = new Object(); Object obj2 = obj.clone();
也就是说如果list没有提供相应的实现 你需要自己实现。

感谢您的指正。确实是 这部分写的有问题。是您说的这个样子,不一样的引用但是指向同样的内存地址。在具体对象做了改动之后,没有修改另一个对其的引用。这里附上API,
addAll

boolean addAll(Collection<? extends E> c)
添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。如果在操作正在进行中修改了指定的 collection,那么此操作的行为是不确定的(注意,如果指定的 collection 是此列表,并且它是非空的,则会发生这种情况。)
指定者:
接口 Collection<E> 中的 addAll
参数:
c - 包含要添加到此列表的元素的 collection
返回:
如果此列表由于调用而发生更改,则返回 true
抛出:
UnsupportedOperationException - 如果列表不支持 addAll 操作
ClassCastException - 如果指定 collection 的元素的类不允许它添加到此列表
NullPointerException - 如果指定的 collection 包含一个或多个 null 元素,并且该列表不允许 null 元素,或者指定的 collection 为 null
IllegalArgumentException - 如果指定 collection 的元素的某些属性不允许它添加此列表
另请参见:
add(Object)
1 楼 cxjhiueannn 2016-10-31  
查看addAll方法的实现其实并不是将后者的引用对象赋值给前面的list.
之所以会出现一改全改是因为两个list里面所存的对象是指向的同一个对象。
就像 Object obj = new Object();Object obj2 = obj;一样。如果你需要复制后分开 你需要在复制对象的时候克隆对象,就像Object obj = new Object(); Object obj2 = obj.clone();
也就是说如果list没有提供相应的实现 你需要自己实现。

相关推荐

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等)...1、对于引用类型的List无法用以上方法进行复制,只会复制List中对象的引用,可以用以下扩展方法复制: static class Extensions { public static IList&lt;T&gt; Clone(t

    java不同对象及集合的多次复制

    在Java编程中,对象复制是一项常见的任务,特别是在处理模型(Model)和视图对象(VO)时。模型对象通常用于封装业务数据,而视图对象则用于展示这些数据。值复制,即对象属性值的复制,是保持数据一致性和简化代码...

    java List 深度复制方法

    如果List中的元素是基本类型,这种复制方式是没问题的,但如果元素是对象,修改复制后的对象会影响到原始对象,因为它们共享同一份引用。 为了实现深复制,我们需要创建一个新的List,并逐个复制原始List中的每个...

    java不同对象之间及集合的复制

    在Java应用中,我们可能需要将Model对象转换为VO对象,这时就需要进行对象复制。 2. **值复制**: 值复制是指复制一个对象时,创建一个新的对象并复制原对象的所有属性值。在Java中,如果类的属性都是基本类型,可以...

    java 对象克隆

    浅克隆创建的新对象只复制了原对象的引用,这意味着如果原对象中包含可变的引用类型,如数组或复杂的数据结构,那么新对象和原对象会共享这些引用。因此,对这些引用的修改会影响到两个对象。相反,深克隆不仅复制了...

    list to list 将list内容移到另一个list

    `list to list` 操作通常指的是将一个列表(list)的内容移动到另一个列表中,这可能涉及到列表的复制、合并或者元素的迁移。下面我们将深入探讨这个主题,同时也会关注到`listtolist.js`这个文件,它可能是...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    这样,即使`YourObject`中包含复杂的数据结构,也能确保新对象与原对象完全独立,避免了共享状态的问题。 总结来说,理解并熟练掌握Java的浅复制和深复制在Android开发中至关重要。通过实现`Cloneable`接口并覆写`...

    浅谈C#中List&lt;T&gt;对象的深度拷贝问题

    如果简单地使用构造函数复制List,新列表将持有原列表中对象的相同引用,而不是新的独立对象。这意味着修改其中一个列表会影响另一个列表,因为它们都指向内存中的同一个对象。 为了解决这个问题,我们可以采用以下...

    jQuery实现简单复制json对象和json对象集合操作示例.docx

    在提供的示例中,`jQuery.extend()` 方法被用来复制 JSON 对象和 JSON 对象集合。`jQuery.extend()` 有两个主要用途:浅拷贝(shallow copy)和深拷贝(deep copy)。浅拷贝只会复制对象的顶层属性,而深拷贝会递归...

    List转换为List

    在某些情况下,我们可能需要将List中的对象转换为另一种类型的对象,但保持其List的结构不变。 ### list转换为JsonArray 在Web开发中,尤其是前后端分离的项目,经常需要将后端Java对象转换为JSON格式的数据,以便...

    C#创建对象列表(List)的不同方法.rar_list_对象

    在C#编程语言中,`List&lt;T&gt;` 是一个非常常用的数据结构,它是一个泛型集合,用于存储同一类型的对象数组。这个数据结构提供了许多便利的功能,如动态扩展、索引访问以及各种操作方法。本篇文章将详细介绍在C#中创建`...

    java对象复制

    标题中的"java对象复制"主要涉及到Java中对象复制的基本概念、实现方法以及相关的注意事项。 首先,Java中的对象复制问题源于其默认的参数传递方式——按引用传递。这意味着当你将一个对象作为参数传递给函数时,...

    JS数组中对象去重操作示例

    通过这个示例,我们可以学习到在JavaScript中处理数组中对象去重的一种有效方法,这对于优化代码性能和避免重复数据存储非常有用。同时,了解和掌握相关工具和专题知识能帮助我们更好地应对各种编程挑战。

    Java copy对象的工具类

    Java CopyUtil工具类,可以进行对象的深copy,比如:对象里面包含对象,对象里面包含Map,List,Set...等复杂类型的属性都可以copy,copy后的对象与原有对象没有联系,即改变原有对象内容,不会改变copy后的对象里面的...

    List Clone.zip_c list深度复制_list clone_list的深度复制 C#

    List的深度复制 浅谈C#中List&lt;T&gt;对象的深度拷贝问题

    对象属性值的复制工具类

    对象属性值的复制工具类 1.全复制 2.部分复制 3.部分不复制

    用序列化实现ListT 实例的深复制(推荐)

    在标题和描述中提到的问题中,当List中的T是引用类型,如myClass类的实例,直接使用`new List(lists1)`创建新的列表lists2,实际上只是创建了一个指向相同元素引用的新列表。这意味着对lists1或lists2的任何修改都会...

    基于java8新特性+反射机制实现list不同实体类互转.zip

    在这个实现中,流API可能被用来遍历List中的元素,然后通过映射(map)操作将每个元素转换为另一种类型的对象。 反射机制是Java的另一个强大特性,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并...

    c#list添加数据

    标题“c#list添加数据”指的是如何向已经实例化的`List&lt;T&gt;`对象中添加数据。描述中提到“list&lt;&gt;.count==0”的情况,即列表为空时,需要向列表中添加数据。下面我们将详细讲解如何操作。 首先,我们来看代码中的`...

Global site tag (gtag.js) - Google Analytics