java中的clone()方法的研究---(9)如何编写正确的clone()方法:Collection
2015-07-14 10:30
507 查看
在自定义类Person中,会有Collection集合类型。
下面我就不一步步测试给大家看了,我就直接贴出来正确的clone方法了。
目前针对,ArrayList<String>, ArrayList<Integer>这两个类型。
---------------------------------------------------------------下面开始测试了------------------------------------------------------------------
测试类TestMain:
debug截图:
通过debug可以发现:
p.integerList = (ArrayList<Integer>) this.integerList.clone(); 是浅克隆, 在浅克隆之后:
p.integerList(id=25)与 pclone.integerList(id=34) id不同
我们要知道ArrayList内部维护的是Object [] elementData。
p.integerList.elementData(id=36)和pclone.integerList.elementData(id=47) id不同
说白了,还是数组的id不同(和我上一篇讲数组克隆情况一样),虽然数组里面的元素的id都相同,
但是在对p.integerList操作的时候(add,remove),是不会影响到pclone.integerList的
也因为是浅克隆:数组里面的元素的id都相同。
注意,这里要结合之前的帖子(Integer,String):
当从list取出Integer,String类型的变量之后,
你修改了stringItem0,integerItem0之后,是不会影响数组里面所对应的元素的。
至于原因?看看http://blog.csdn.net/miqi770/article/details/45223191
对于p.stringList和p.integerList的现象是一样的。
下面我就不一步步测试给大家看了,我就直接贴出来正确的clone方法了。
目前针对,ArrayList<String>, ArrayList<Integer>这两个类型。
package tt.vo; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; public class Person implements Cloneable { // 基本数据类型 private int age; // Wrapper Class类型 private Integer height; // String 类型 private String name; // StringBuffer private StringBuffer address1; // StringBuilder private StringBuilder address2; // Date private Date date; // Timestamp private Timestamp timestamp; // int array private int[] intArray; // Integer Array private Integer[] integerArray; // String Array private String[] stringArray; private ArrayList<String> stringList; private ArrayList<Integer> integerList; @Override public Person clone() throws CloneNotSupportedException { Person p = (Person) super.clone(); // StringBuffer,StringBuilder 没有实现clone方法 // 只能用 new, 去完成克隆动作 if (this.address1 != null) { p.address1 = new StringBuffer(this.address1); } if (this.address2 != null) { p.address2 = new StringBuilder(this.address2); } if (this.date != null) { p.date = (Date) this.date.clone(); } if (this.timestamp != null) { p.timestamp = (Timestamp) this.timestamp.clone(); } if (this.intArray != null) { p.intArray = this.intArray.clone(); } if (this.integerArray != null) { p.integerArray = this.integerArray.clone(); } if (this.stringArray != null) { p.stringArray = this.stringArray.clone(); } // list clone 要强转类型, 此处是对list的浅克隆 if (this.stringList != null) { p.stringList = (ArrayList<String>) this.stringList.clone(); } if (this.integerList != null) { p.integerList = (ArrayList<Integer>) this.integerList.clone(); } return p; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Integer getHeight() { return height; } public void setHeight(Integer height) { this.height = height; } public String getName() { return name; } public void setName(String name) { this.name = name; } public StringBuffer getAddress1() { return address1; } public void setAddress1(StringBuffer address1) { this.address1 = address1; } public StringBuilder getAddress2() { return address2; } public void setAddress2(StringBuilder address2) { this.address2 = address2; } @Override public String toString() { return "Person [age=" + age + ", height=" + height + ", name=" + name + ", address1=" + address1 + ", address2=" + address2 + ", date=" + date + ", timestamp=" + timestamp + ", intArray=" + Arrays.toString(intArray) + ", integerArray=" + Arrays.toString(integerArray) + ", stringArray=" + Arrays.toString(stringArray) + ", stringList=" + stringList + ", integerList=" + integerList + "]"; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public Timestamp getTimestamp() { return timestamp; } public void setTimestamp(Timestamp timestamp) { this.timestamp = timestamp; } public Integer[] getIntegerArray() { return integerArray; } public void setIntegerArray(Integer[] integerArray) { this.integerArray = integerArray; } public String[] getStringArray() { return stringArray; } public void setStringArray(String[] stringArray) { this.stringArray = stringArray; } public int[] getIntArray() { return intArray; } public void setIntArray(int[] intArray) { this.intArray = intArray; } public ArrayList<String> getStringList() { return stringList; } public void setStringList(ArrayList<String> stringList) { this.stringList = stringList; } public ArrayList<Integer> getIntegerList() { return integerList; } public void setIntegerList(ArrayList<Integer> integerList) { this.integerList = integerList; } }
---------------------------------------------------------------下面开始测试了------------------------------------------------------------------
测试类TestMain:
package tt; import java.util.ArrayList; import java.util.Arrays; import tt.vo.Person; public class TestMain { public static void main(String[] args) throws CloneNotSupportedException { // initialize Person p Person p = new Person(); // String List ArrayList<String> stringList = new ArrayList<String>(); stringList.addAll(Arrays.asList(new String("0"), new String("1"))); p.setStringList(stringList); // Integer List ArrayList<Integer> integerList = new ArrayList<Integer>(); integerList.addAll(Arrays.asList(new Integer("0"), new Integer("1"))); p.setIntegerList(integerList); System.out.println("p:" + p); Person pclone = p.clone(); System.out.println("pclone:" + pclone); System.out.println("-------------after set-------------------"); // string list String stringItem0 = p.getStringList().get(0); stringItem0 = "0000"; p.getStringList().add("111111"); // integer list Integer integerItem0 = p.getIntegerList().get(0) ; integerItem0 = 999; p.getIntegerList().add(88888); System.out.println("p:" + p); System.out.println("pclone:" + pclone); } }
debug截图:
通过debug可以发现:
p.integerList = (ArrayList<Integer>) this.integerList.clone(); 是浅克隆, 在浅克隆之后:
p.integerList(id=25)与 pclone.integerList(id=34) id不同
我们要知道ArrayList内部维护的是Object [] elementData。
p.integerList.elementData(id=36)和pclone.integerList.elementData(id=47) id不同
说白了,还是数组的id不同(和我上一篇讲数组克隆情况一样),虽然数组里面的元素的id都相同,
但是在对p.integerList操作的时候(add,remove),是不会影响到pclone.integerList的
也因为是浅克隆:数组里面的元素的id都相同。
注意,这里要结合之前的帖子(Integer,String):
当从list取出Integer,String类型的变量之后,
你修改了stringItem0,integerItem0之后,是不会影响数组里面所对应的元素的。
至于原因?看看http://blog.csdn.net/miqi770/article/details/45223191
对于p.stringList和p.integerList的现象是一样的。
相关文章推荐
- JavaCodeTra 判断质数
- Spring定时任务的几种实现
- (转)Spring定时任务的几种实现
- Eclipse加载源码
- Java XMl解析DOM4j实例
- Eclipse设置、调优、使用
- java之二叉搜索树转换为双向链表
- java_简单的售票系统
- 一步一步JavaEE
- 【JavaWeb】(6)Servlet
- SpringMVC实战(三种映射处理器)
- struts jxl导出Excel
- java 异常处理机制及说明。
- 【Java】检查二叉树是否平衡。
- java 异常处理机制
- Java报表工具
- java多线程两种实现方式
- Java入门常见问题
- 关于json-lib将mysql中的date(time)转换成json对象出现java.sql.time not gethours问题
- Java StuNote 1