回答如下
/*输出结果abc false
* 函数运行时main函数进栈
* 1、定义了一个String类型的变量s,在方法区中的常量池中生成了一个字符串"abc",在将这个字符串的引用(假设为0x01)赋值给变量s
* 2、字符串s调用substring方法截取了一个新的字符串 "bc" ,这时在方法区中的常量池中生成了一个字符串"bc",这个字符串的有一个引用(假设为0x02)
* 3、字符串s调用replace生成了一个新的字符串 "axyz",这时在方法区中的常量池中生成了一个字符串"axyz",这个字符串的有一个引用(假设为0x03)
* 上面的2、3两步都在方法区中的常量池中生成了一个新的字符串,但是没有将新生成的字符串的引用地址赋值给变量s
* 所以此时变量s 的引用地址还是指向最开始的字符串"abc"的引用地址(0x01)
* 4、所以输出的s的值为 字符串 "abc"
* 5、定义了一个String类型的变量value,并在堆内存中开辟了一个空间(假设为0x22),并将这个空间的引用地址(0x22)赋值给 变量value,(空间里有一个引用地址(0x01)指向字符串"abc")
* 6、s==value是在比较两个变量的引用地址,而此时s指向的方法区常量池中的地址为0x01 value指向的是堆内存中的0x22 所以输出结果为false
*/
|