java的Arraylist.clone()的拷贝问题

梦觉游仙 2019-09-12 04:53:09
我今天看了sun的说明,说Arraylist的clone是浅拷贝:Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.) 。
但是我今天写了一段代码,结果感觉更像是深拷贝,
代码如下:

ArrayList<String> t=new ArrayList<String>();
for(int i=0;i<10;i++){
t.add(String.valueOf(i));
}
System.out.println(t.get(1));
ArrayList<String> t1=(ArrayList<String>) t.clone();
t1.set(1, "tcd");
System.out.println(t.get(1));
System.out.println(t1.get(1));
System.out.println(t1.get(2)+"||||"+t.get(2));


输出结果:
1
1
tcd
2||||2
...全文
366 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
嘻嘻曦大王 2020-11-03
  • 打赏
  • 举报
回复
String类型都是不可变类,如果使用自定义的类就会发现里面实际拷贝的只是指向类的指针
qybao 2019-09-12
  • 打赏
  • 举报
回复
我觉你没理解深拷贝和浅拷贝
深拷贝就是不光拷贝出来的是一个新的对象,该对象的属性也是新的对象(也就是拷贝出来的对象和原来的对象没有任何交集,只是内容一样)
浅拷贝就是拷贝出来的是一个新的对象,但是该对象的属性和原来对象的属性是同一个对象(也就是拷贝出来的对象和原来的对象有交集,并不完全独立)
你的测试代码的思路就不正确,应该这样测试

ArrayList<String> t=new ArrayList<String>();
for(int i=0;i<10;i++){
t.add(String.valueOf(i));
}
ArrayList<String> t1=(ArrayList<String>) t.clone();
System.out.println(t==t1); //这里必然是false,因为拷贝出来的对象和原来对象不是同一个
for (int i=0; i<10; i++) {
System.out.println(t.get(i)==t1.get(i)); //然是,如果是前拷贝,这里就是true,属性有交集;而如果是深拷贝,这里就是false
}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧