这是一个老生常谈的问题了,不过我最近才仔细看。
一点体会,笔而记之。
先看这几句代码
结果为:
true
true
这个结果说明什么呢?
==在java中是比较引用的,即在内存中的地址。而String的equals()是比较字符串的内容。
第二个true无可争议,因为s1和s2的内容显然 相同。
第一个true呢?
这说明s1和s2的地址相同,s1和s2的地址为什么会相同?
查阅资料,发现 :
String s1 = "String";
这种方式,java首先会在缓冲区查找是否有"String"这个常量对象,有就直接将其地址赋给s1,没有就创建一个"String",然后将其赋给s1;然后
String s2 = "String";
java同样会在缓冲区中查找"String",这次能查找到了,因为s1创建了一个"String",所以会将其地址赋给s2,如此,s1和s2便有了相同的地址。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OK。
再看这一段代码
结果为:
false
true
第二个true同样无争议。
第一个false说明s3和s4不是指向同一地址。
查阅资料发现,
String s3 = new String("String");会直接在内存中开辟一个空间存储一个"String",并讲引用赋给s3;
同样 String s4 = new String("String");也会开辟一个空间,降低至给s4;
所以s3和s4的地址不一样。
即
System.out.println(s3 == s4); 会打印出false。
///*/
附
关于String的equals方法:
这是直接从jdk源码复制的equals方法代码:
java的String是用字符数组模拟的。
从上面的代码可以看出String的equals()的工作原理——
1、首先比较引用,如果引用相同,返回true;
2、比较类型,如果不是比较的不是String对象,返回false;
3、比较长度,字符串长度不等时,返回false;
4、逐个字符比较两个字符串,遇到不一样的字符,返回false;
5、到最后都一致,返回ture;