Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象和字符串相等和内存digrams_Java_String_Object_Equality - Fatal编程技术网

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
这两个步骤的内存图如下所示:

  • x->“测试”
  • x->“测试”y->“非测试”
  • 但是,考虑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