将一个对象复制到另一个对象会在java中产生不同的结果

时间:2015-03-03 06:36:30

标签: java

public static void main(String[] args) {
    Integer a = 1;
    Integer b = 0;
    b=a;
    System.out.println(a);
    System.out.println(b);
    ++a;
    System.out.println(a);
    System.out.println(b);
}
输出:1 1 2 1

public static void main(String[] args) {
    ArrayList<Integer> a = new ArrayList<Integer>();
    ArrayList<Integer> b = new ArrayList<Integer>();
    a.add(1);
    a.add(1);
    a.add(1);
    a.add(1);
    b=a;
    System.out.println(a.size());
    System.out.println(b.size());
    b.add(2);
    System.out.println(a.size());
    System.out.println(b.size());
}

输出:4 4 五 5

对于上面的代码,为什么两个对象都没有引用相同的内存位置。

5 个答案:

答案 0 :(得分:3)

这是因为Integer是不可变的。创建后,您无法更改它。如果要强制更改值,它将指向新的内存位置。完成++a后,a成为新对象。


从String的角度来看它可能会更容易。 (字符串也是不可变的)

    String s1 = "aaa";
    String s2 = s1;

    s1 = "bbb";
    System.out.println("s1: " + s1);
    System.out.println("s2: " + s2);

<强>输出:

s1: bbb
s2: aaa

答案 1 :(得分:3)

所有包装类实际上都是Java不可变的。我们知道String是一个着名的不可变类。除此之外,像Integer这样的其他包装器也是不可变的。

请参阅此http://www.javaworld.com/article/2077343/learn-java/java-s-primitive-wrappers-are-written-in-stone.html

答案 2 :(得分:2)

    Integer a = 1;
    Integer b = 0;
    b=a;
    System.out.println(a);
    System.out.println(b);
    if(a == b){
        System.out.println("Both objects are equal");
    }
    ++a;
    if(a != b){
        System.out.println("Both objects are different");
    }
    System.out.println(a);
    System.out.println(b);

答案 3 :(得分:1)

案例-1:

public static void main(String[] args) {
    Integer a = 1;
    Integer b = 0;
    b=a;                      // 2 references a and b point to same Integer object
    System.out.println(a);
    System.out.println(b);
    ++a;                      // now a references to a new integer object with value 2 where as b refers to old integer object with value 1
    System.out.println(a);
    System.out.println(b);
}

案例2:

同样,ab都引用并处理相同的 arrayList实例。因此,使用一个引用进行修改也会反映在其他引用中

答案 4 :(得分:0)

++a创建一个新对象=a+1,然后设置a =这个新对象。 b未更改,因为赋值不会影响正在重新分配的变量中包含的对象。

另一方面,.add(2)2添加到a指定的列表中,该列表与b指定的列表相同,因为它们已被等同。