永发信息网

ArrayList的clone方法是浅表复制,clone的结果却是复制了对象?

答案:3  悬赏:50  手机版
解决时间 2021-01-27 17:01
ArrayList的clone方法是浅表复制,clone的结果却是复制了对象?
最佳答案
class A {

public static void main(String[] args) {
test test1 = new test(1);
test test2 = new test(2);
test test3 = new test(3);
ArrayList al = new ArrayList();
al.add(test1);
al.add(test2);
ArrayList al1 = new ArrayList();
al1 = (ArrayList) al.clone();

al1.add(test3);
for (Iterator it = al1.iterator(); it.hasNext();) {
System.out.println("al1: " + it.next());
}

for (Iterator it = al.iterator(); it.hasNext();) {
System.out.println("al: " + it.next());
}
test1.num = -1;
test2.num = -1;
test3.num = 2;
for (Iterator it = al1.iterator(); it.hasNext();) {
System.out.println("al1: " + it.next());
}

for (Iterator it = al.iterator(); it.hasNext();) {
System.out.println("al: " + it.next());
}
}

static class test {

int num = 0;

test(int i) {
num = i;
}

@Override
public String toString() {
return "" + num;
}
}
}

你看看这个类子吧,String是常量不容易理解,你看看这个吧,
test1.num = -1;
test2.num = -1;
test3.num = 2;
把两个list里的内容全改变了,这就是浅表复制了,克隆出来的list和原来list里的东西是同一个对象。所以两个全变了。
全部回答
浅表复制是指只复制一层,不会再次复制下级对象。
比如:A 包括一个B对象,那么浅表复制相当于:
clone ()
{
a = new A () ;
a.B = this.B
}
而深层复制就是:
clone ()
{
a = new A () ;
a.B = this.B.clone () ;
}
也就是说:复制B的引用还是创建新的B的实例的问题。
你用字符串不好说明。如果换成object,你看他的输出结果就是一样的了。而如果深度复制,结果就会不同。
ArrayList的clone方法是浅表复制,clone的结果却是复制了对象?
对于基本数据类型,clone方法复制其值,对于引用数据类型,则复制引用所指向对象的地址。
Student类
public class Student {
public Student(int argI, String argN) {
this.ID = argI;
this.name = argN;
}
public void setID(int id) {
ID = id;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return this.ID + " " + this.name;
}
private int ID;
private String name;
}
TestArrayList类
import java.util.ArrayList;
public class TestArrayList {
public static void main(String[] args) {
int a = 10;
Student stu1 = new Student(10, "KKKK");
Student stu2 = new Student(20, "SSSS");
ArrayList at = new ArrayList();
at.add(a); //自动装箱
at.add(stu1);
at.add(stu2);
for(Object o : at) {
System.out.print(o + " ");
}
System.out.println("\n");
a = 20;
stu1.setID(15);
stu2.setName("TTTT");
System.out.println();
for(Object o : at) {
System.out.print(o + " ");
}
System.out.println("\n");
}
}
输出结果:10 10 KKKK 20 SSSS
10 15 KKKK 20 TTTT
改变a的值对ArrayList中的对象没有影响,而引用类型Student的改变则反映到了ArrayList中。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
忘了吧地址在什么地方,我要处理点事
兔峨供电所(兔峨供电所营业厅)地址有知道的么
如何制服反手擒拿,或有什么更好的招式。
日语贱歪歪用中文怎么说
7月30日苏仨直播 赵可那与苏仨PK可那唱的一首
我想把户口转成农业户口,可是公安局要收我的
云飘飘地址好找么,我有些事要过去
网球拍直径是多少?
怎样查富德生命人寿收益
雪鬓霜毛的意思是什么啊?知道的请说下!
营盘供电所(营盘供电所营业厅)地址在哪,我要
嘴唇上长了一个黑斑怎么去掉
魅族3s突然没声了但我带上耳机却有声是怎么回
中排供电所(中排供电所营业厅)地址好找么,我
有没有关于cosplay各种角色化妆的教程书或者
推荐资讯
人物专题报道怎么写
君豪汽车装饰地址有知道的么?有点事想过去
想在电商,像京东,阿里巴巴里工作,大学应该
为什么天天酷跑电脑版qq游戏玩不了,雷霆战机
已知二次函数f(x)在x=4时取最小值-3,且它
中石油镇原孟坝加油站怎么去啊,我要去那办事
如何处理涉及军人军属合法权益的案件
红旗suv有50万的吗
海马汽车福美来2代13款要多少钱新车,中配
天下3粉翅膀通冥怎么洗
胎停两次了 是什么原因啊 我都想放弃了
跆拳道音乐
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?