恩呢,比较的是地址呢,只要new出来的对象都会在内存中分配一个存储空间给它,两个不同的内存空间作比较,当然为false;
对于,如下:
String s1="123";
String s2="123";
System.out.println(s1.equals(s2)); //结果为false。
java运行环境有一个字符串池。比如String str="123"时,会首先查看字符串池中是否存在字符串"123",如果存在则直接将"123"赋给str,如果不存在则会先在字符串池中新建一个字符串"123",然后再将其赋给str,所以说s1和s2指向同一个对象;
再有:
String s1=new String("123");
String s2=new String("123");
System.out.println(s1==s2); //false ,此时创建了三个对象(字符串池中1个,堆中2个)
这时用==判断就可知,虽然两个对象的"内容"相同(equals()判断),但两个引用变量所持有的引用不同,new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址
|