对象和字符串相等和内存图

Objects and Strings equality and memory digrams

我有点难以理解这两者之间的区别:

假设我们有:

 String x = "Test";
 String y = x;
 y = "Not Test"; //x is not modified here

这两步的内存图如下:

  1. x->"Test"
  2. x-> "Test" <-y
  3. x->"Test"y->"Not Test"

但是,考虑 class A 字段 'int var':

A a = new A();
A b = a;
b.var = 5; 

这里,如果我们修改b.var,a.var也会变成5,为什么和上面的字符串不同呢?

此外,如果有人不介意解释这些字符串和对象的内存图,我将不胜感激。如果 a 和 b 是不同 classes 的对象设置相等,结果会不同吗?谢谢。

有区别

b.var = 5;

b = new A();

第二个语句类似于您在第一个代码段中所做的,因为 y = "Not Test"; 使 y 引用一个新实例。

第一个语句更新了 ab 引用的实例的状态,因此两者都会受到影响。

这是显示您的第二个片段的图表:

a -> object of class A <- b
     containing an int
     variable `var`
        var <- 5

a.varb.var 都包含 5,因为它们是相同的变量。

因为StringImmutable class状态其中class是不能改变的。虽然 A 是可变的,因为你通过改变变量的值改变了它的状态。其次,ab 都引用相同的内存位置,其中一个的更改状态将反映在第二个中,但 String 的情况并非如此 if String abTesta 更改为 Test1 不会将 Test 更改为 Test1 但它会创建新的String Test1 并将其分配给 a.

在第二种情况下,它们都指向内存中的同一个地方。

A a = new A();     a-->[MEMORY SPOT NR1]
A b = a;           a-->[MEMORY SPOT NR1] AND b-->[MEMORY SPOT NR1]
b.var = 5;         a-->[MEMORY SPOT NR1] AND b-->[MEMORY SPOT NR1] 
                   and the value in var in [MEMORY SPOT NR1] is 5, 
                   so both a.var and b.var take the value 5