日期:2014-05-20  浏览次数:20767 次

java == 运算符
String aStr = new String("Hello");
String bStr = "Hello";

System.out.println(aStr == "Hello");
System.out.println(bStr == "Hello");

为什么aStr==Hello会是false?而bStr=Hello可以为true

------解决方案--------------------
引用:
楼主看看java的内存分配,看看堆栈就明白了 堆栈

放屁。
String 有个字符串缓冲池,每次直接赋值的字符串会放在里面,如果下次在用的话,就从里面取。
new的时候不会放进去,是新的。

------解决方案--------------------
引用:
那你能别瞎指导么?
TMD,那是内存分配的事么????操
 其实堆栈可以讲明白java引用中绝大多数的问题,包括这个,直接定义的在栈中,栈中的不重复,new出来的在堆中,aStr == "Hello" 让一个栈中的引用对象和一个栈中的常量比较,那肯定不相等了。bStr 就在栈中定义,栈中的对象又不重复,所以bStr == "Hello"  就相等了。好了,这个问题就说到这里吧,如有意见,也请不要骂人,可以好好讨论技术。
------解决方案--------------------
这是我个人见解:
aStr引用堆里的地址,而bStr引用的是常量池的地址,首先new String("Hello")时,就会在堆里开劈一个空间,然后去常量池看有没有Hello这个常量,如果没有就创建一个,并把引用存放在堆开劈的空间里。而aStr引用的是堆里的地址,所以当aStr与"Hello"比较时两者的地址都不一样所以为false.而bStr却是直接去常量池找,并获取"Hello"的引用