String sh = "Hello";
String str = sh+"20";
String str1 ="Hello20";
String s = "Hello20";
if(s == str1){
System.out.println("相等");
}else{
System.out.println("不相等");
}
求大神解释一下,为什么 s 和 str1是比较 返回的是true呢
== 不是还要比较地址吗? 分别定义的两个对象地址是一样的?????
因为常量池的存在。而运行时常量池其实是属于方法区的一部分。通俗的说,s 和 str1 其实都是都是指向 “Hello20”这个常量。
equals()方法只比较变量的值,只要值相等就返回true
==则比较是不是同一个对象
我记得书上的解释是这样的,当创建对象的时候没有声明是新的对象,而他们的值是一样的时候,这时候内存中只会创建一个值,两个对象同时指向这一块内存区域
如果你先声明这是两个对象String s=new String("Helllo");这时候内存中就会有两个值
编译器在编译的时候能直接求值的,那么会预先算好放在程序里。这导致s str1 str指向同一个字符串引用,结果相等。
不但如此,一个经典的考题是
a = 100;
b = 100;
Integer i1 = a;
Integer i2 = b;
a == b//真
如果a,b>128,则返回假
这是因为Integer也有缓存。
String类创建时会先去常量池中寻找,如果有就返回在常量池中的地址,大致过程是首先创建str1,就会先看看常量池中有没有“helllo20”,没有,那么就在常量池中申请一块内存,把“hello20”放进去,当s创建时,也是先去常量池中寻找,发现有,就直接指向这个内存,所以==虽然比较的是地址,但是s和str1都是指向同一个地址,所以会返回true;