JAVA系列笔记之二:JAVA内存分析及String类型详解总结

(转自我的renren)

JAVA字符串比较问题,从开始学就没弄怎么懂,偏偏今天心血来潮,总想搞明白,于是查阅大量书籍,google大量资料,结果总结出来:仍然是X疼。。

堆栈,字符串常量,内存分析,鼓捣了几个小时,总不能完全明白,所以奉劝大家,在学习的过程中千万不要钻牛角尖,留着那个牛角去钻哥德巴赫猜想去吧~~

言归正传:

先看点简单的比较:

  1. String str1 =  "abc" ;   
  2. String str2 = "abc" ;  
  3. String str3 = new String ("abc");
  4. String str4 = new String ("abc");
  5. System.out.println(str1==str2); //true  
  6. System.out.println(str3==str4); //false
  7. System.out.println(str1==str3); //false

str1 和str2:编译器首先处理str1时,在栈中创建一个值为str1的引用,然后查找字符串常量中是否有“abc”这个常量,没有则在字符串常量中创建; 当执行str2时,由于常 量池中已有“abc”字符串,所以将str2直接指向字符串常量“abc”,这样,str1和str2就是指向同一个对象。

str3和str4:new出来的东西是放在堆里的,每new一个对象,就要在堆里重新创建一个对象。所以str3和str4分别指向堆里的不同对象,是在运行时才确定的。

str1和str3:str1是在程序编译器确定的,“abc”确定在字符串常量中。而str3是在程序运行时候才能确定,是在堆中动态创建的。str1和str3一个指向字符串常量区,一个指向堆,显然是不相等的。

----------------------------------------------休息一会,可能不回来了------------------------------------------------------------

如果上面的么有问题,那么继续往下面看吧~

  1. String str1 = "abc";    
  2. String str2 = "def"; 
  3. String str3 = str1+str2;   
  4. String str4 = "abc"+"def"
  5. String str5 = "abcdef"
  6. System.out.println(str4==str5); //true
  7. System.out.println(str3==str4); //false
  8. System.out.println(str3==str5); //false    

如果这些你都一眼看出来的话,那就笑吧,尽情鄙视我的智商吧。看半天没看出来的咱们接着往下看

str4和str5: 仍然是字符串常量,str4在编译器就被确定了,它在编译期将abc和def两个字符串连接成abcdef后放在字符串常量区。

str3和str4:这两个让我很郁闷。。。解释起来有点费劲,str4不用说了。看str3,这个家伙是字符串常量中的两个对象相+,这不能在编译期确定,所以只能在运行时确定。在运行时在堆中重新创建一个对象,str3指向的是堆中的对象。因此,所以,so……

还是不明白是吧?如果你一遍就真正明白了,那你可以笑了,尽情鄙视我的IQ吧!

--------------------------------------------没有广告,可能也没有片子了--------------------------------------------

如果将“==”换成“equals”,那么结果就不用我说了吧。。equals方法只关心内容是否想到。

另外在API中还有个intern ()方法,这个还有点门道

--------------------------------------------暂停,停止,中止,或者是终止--------------------------------------------

(其实还没有完。。。。。后面还有个final)

你可能感兴趣的:(java,Google)