永发信息网

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

答案:3  悬赏:50  手机版
解决时间 2021-01-27 17:01
  • 提问者网友:留有余香
  • 2021-01-27 04:02
ArrayList的clone方法是浅表复制,clone的结果却是复制了对象?
最佳答案
  • 五星知识达人网友:酒者煙囻
  • 2021-01-27 05:17
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里的东西是同一个对象。所以两个全变了。
全部回答
  • 1楼网友:轻熟杀无赦
  • 2021-01-27 07:40
浅表复制是指只复制一层,不会再次复制下级对象。
比如:A 包括一个B对象,那么浅表复制相当于:
clone ()
{
a = new A () ;
a.B = this.B
}
而深层复制就是:
clone ()
{
a = new A () ;
a.B = this.B.clone () ;
}
也就是说:复制B的引用还是创建新的B的实例的问题。
你用字符串不好说明。如果换成object,你看他的输出结果就是一样的了。而如果深度复制,结果就会不同。
  • 2楼网友:笑迎怀羞
  • 2021-01-27 06:43
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中。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯