Java 对象和字符串相等和内存digrams
我在理解这两者之间的区别时有点困难: 假设我们有:Java 对象和字符串相等和内存digrams,java,string,object,equality,Java,String,Object,Equality,我在理解这两者之间的区别时有点困难: 假设我们有: String x = "Test"; String y = x; y = "Not Test"; //x is not modified here 这两个步骤的内存图如下所示: x->“测试” x->“测试”y->“非测试” 但是,考虑A类的字段“int var”: A a = new A(); A b = a; b.var = 5; 这里,如果我们修改b.var,a.var也会变为5。为什么这与上面使用字符串的情况不同 此外,如果
String x = "Test";
String y = x;
y = "Not Test"; //x is not modified here
这两个步骤的内存图如下所示:
但是,考虑A类的字段“int var”:
A a = new A();
A b = a;
b.var = 5;
这里,如果我们修改b.var,a.var也会变为5。为什么这与上面使用字符串的情况不同
此外,如果有人不介意解释这些字符串和对象的内存图,我将不胜感激。如果a和b是不同类别的对象,设置为相等,结果会不同吗?谢谢 两者之间有区别
b.var = 5;
及
第二条语句与您在第一个代码段中所做的类似,因为y=“nottest”代码>使y
引用新实例
第一条语句更新由a
和b
引用的实例的状态,因此两者都会受到影响
下面的图表显示了您的第二个代码段:
a -> object of class A <- b
containing an int
variable `var`
var <- 5
a->a类的对象,因为String
是,该类的状态不能更改。而A
是可变的,因为您通过更改变量的值来更改它的状态。其次a
和b
都引用了相同的内存位置,其中一个的更改状态将反映在第二个内存位置中,但是String
的情况并非如此,如果String
a
和b
是Test
将a
更改为Test1
,则不会更改内存位置Test
到Test1
,但它将创建新的字符串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
字符串在Java中是不可变的。因此,当您执行“y=”Not Test“时,将创建新字符串。
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