(转自我的renren)
JAVA字符串比较问题,从开始学就没弄怎么懂,偏偏今天心血来潮,总想搞明白,于是查阅大量书籍,google大量资料,结果总结出来:仍然是X疼。。
堆栈,字符串常量,内存分析,鼓捣了几个小时,总不能完全明白,所以奉劝大家,在学习的过程中千万不要钻牛角尖,留着那个牛角去钻哥德巴赫猜想去吧~~
言归正传:
先看点简单的比较:
str1 和str2:编译器首先处理str1时,在栈中创建一个值为str1的引用,然后查找字符串常量中是否有“abc”这个常量,没有则在字符串常量中创建; 当执行str2时,由于常 量池中已有“abc”字符串,所以将str2直接指向字符串常量“abc”,这样,str1和str2就是指向同一个对象。
str3和str4:new出来的东西是放在堆里的,每new一个对象,就要在堆里重新创建一个对象。所以str3和str4分别指向堆里的不同对象,是在运行时才确定的。
str1和str3:str1是在程序编译器确定的,“abc”确定在字符串常量中。而str3是在程序运行时候才能确定,是在堆中动态创建的。str1和str3一个指向字符串常量区,一个指向堆,显然是不相等的。
----------------------------------------------休息一会,可能不回来了------------------------------------------------------------
如果上面的么有问题,那么继续往下面看吧~
如果这些你都一眼看出来的话,那就笑吧,尽情鄙视我的智商吧。看半天没看出来的咱们接着往下看
str4和str5: 仍然是字符串常量,str4在编译器就被确定了,它在编译期将abc和def两个字符串连接成abcdef后放在字符串常量区。
str3和str4:这两个让我很郁闷。。。解释起来有点费劲,str4不用说了。看str3,这个家伙是字符串常量中的两个对象相+,这不能在编译期确定,所以只能在运行时确定。在运行时在堆中重新创建一个对象,str3指向的是堆中的对象。因此,所以,so……
还是不明白是吧?如果你一遍就真正明白了,那你可以笑了,尽情鄙视我的IQ吧!
--------------------------------------------没有广告,可能也没有片子了--------------------------------------------
如果将“==”换成“equals”,那么结果就不用我说了吧。。equals方法只关心内容是否想到。
另外在API中还有个intern ()方法,这个还有点门道
--------------------------------------------暂停,停止,中止,或者是终止--------------------------------------------
(其实还没有完。。。。。后面还有个final)