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

时间:2015-12-16 10:43:55

标签: java string object equality

我在理解这两者之间的区别时遇到了一些麻烦:

假设我们有:

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

这两个步骤的存储器图如下:

  1. 的x> “测试”
  2. 的x> “测试”< -y
  3. 的x> “测试”y-> “不测试”
  4. 但是,考虑带有字段'int var'的A类:

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

    在这里,如果我们修改b.var,a.var也会变为5.为什么这与字符串的上述情况不同?

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

3 个答案:

答案 0 :(得分:2)

之间存在差异
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,因为它们是相同的变量。

答案 1 :(得分:2)

由于StringImmutable class,因此无法更改哪个类的。虽然A是可变的,因为您通过更改变量的值来更改它的状态。其次,ab都引用相同的内存位置,一个的更改状态将反映在第二个内容中,但如果String String则不是这种情况。 } ab Testa更改为Test1不会将Test更改为Test1,但会创建新的String Test1 a并将其分配给yii\web\DbSession

答案 2 :(得分:1)

在第二种情况下,他们都指向记忆中的同一个地方。

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