关于String类的赋值

String str =new String("abc");
String str1 =new String(str);
System.out.print(str.equal(abc));
结果为://true
难道new String(str)赋值给str1的是内容?而不是str引用对象(new String("abc"); )的地址值吗?

equals是值比较。所以无所谓地址。

Java运行环境有一个字符串池,由String类维护
执行语句String str = new String("abc");时。不管字符串池中是否存在字符串“abc”,直接新建一个字符串“abc”,(注意,新建的字符串“abc”不是在字符串池中), 然后将其赋给str
new 创建字符串时,首先查看池中是否有相同的字符串,如果有则拷贝一份放到堆中,然后返回堆中的地址;如果池中没有则在堆中创建一份,然后返回堆中的地址

所以执行String str1 =new String(str); str在堆中指向串池的“abc”,等价于String str1 =new String(“abc”); 这个时候创建对象,串池中已经有了“abc”,所以只需要返回对中的地址,str和str1的地址,指向都一样,所以使用equals才会为true

JVM的内部机制,相同内容的字符串,都是引用同一个地址,返回true很正常啊

string的eq比较就是单纯比较值。你看一下String的eq源码,就遍历字节数组比较,不一样就直接返回false。

String类中重写了equals方法,并不是类似正常对象一样比较的地址

img

equals 就是比较值,==是比较的地址