是这样的,
java里有优化处理机制,
这个机智就是:
如果你直接:String s="AAA",
注意,是直接给了数值,而不是通过new String("AAA"),
则,jvm会在内部一个列表内给你分配地址,
等你再String s2="AAA"时,jvm会查这个列表,看是否有“AAA”,如果有,就重用。但,对于new String("AAA")则每次都会申请新的地址,不会做优化处理。
所以,产生了你的现象。
java里有优化处理机制,
这个机智就是:
如果你直接:String s="AAA",
注意,是直接给了数值,而不是通过new String("AAA"),
则,jvm会在内部一个列表内给你分配地址,
等你再String s2="AAA"时,jvm会查这个列表,看是否有“AAA”,如果有,就重用。但,对于new String("AAA")则每次都会申请新的地址,不会做优化处理。
所以,产生了你的现象。
new String后等于在另一内存区写了“free”
所以为false。当你把str2 重新赋值为 free时,它和str1同时指向free的地址,所以又是true了。如果你把str1 = new String("free");//相当于又在另一个内存区写了“free”
str2= new String("free");
然后比较str1 == str2还将是false的
str1.equals(str2) 判断str1同 str2 是否相等!!
varName1 = "XXX";
varName2 = "XXX";
来赋值的时候,varName1 ,varName2 将指向同一地址,所以 (varName1 == varName2)返回true.
str1.equals(str2) 判断两个str的值是否相等
如果单纯的判断两个string的值是否相等,用如下方法:
if((str1 != null) && (str2 != null)) {
if(str1.equals(str2)) {
//如果相等的处理
}
}注意,如果不判断是否是null,可能会引起NullPointerException。