对象和字符串相等和内存图
Objects and Strings equality and memory digrams
我有点难以理解这两者之间的区别:
假设我们有:
String x = "Test";
String y = x;
y = "Not Test"; //x is not modified here
这两步的内存图如下:
- x->"Test"
- x-> "Test" <-y
- 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
引用一个新实例。
第一个语句更新了 a
和 b
引用的实例的状态,因此两者都会受到影响。
这是显示您的第二个片段的图表:
a -> object of class A <- b
containing an int
variable `var`
var <- 5
a.var
和 b.var
都包含 5,因为它们是相同的变量。
因为String
是Immutable class,状态其中class是不能改变的。虽然 A
是可变的,因为你通过改变变量的值改变了它的状态。其次,a
和 b
都引用相同的内存位置,其中一个的更改状态将反映在第二个中,但 String
的情况并非如此 if String
a
和 b
是 Test
将 a
更改为 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
我有点难以理解这两者之间的区别:
假设我们有:
String x = "Test";
String y = x;
y = "Not Test"; //x is not modified here
这两步的内存图如下:
- x->"Test"
- x-> "Test" <-y
- 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
引用一个新实例。
第一个语句更新了 a
和 b
引用的实例的状态,因此两者都会受到影响。
这是显示您的第二个片段的图表:
a -> object of class A <- b
containing an int
variable `var`
var <- 5
a.var
和 b.var
都包含 5,因为它们是相同的变量。
因为String
是Immutable class,状态其中class是不能改变的。虽然 A
是可变的,因为你通过改变变量的值改变了它的状态。其次,a
和 b
都引用相同的内存位置,其中一个的更改状态将反映在第二个中,但 String
的情况并非如此 if String
a
和 b
是 Test
将 a
更改为 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