首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-25 
JAVA系列笔记之二:JAVA内存分析及String类型详解总结(转自我的renren)JAVA字符串比较问题,从开始学就没弄

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

(转自我的renren)

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

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

言归正传:

先看点简单的比较:

    String?str1?=?"abc";??? String?str2?=?"abc";??
    String str3 = new String ("abc"); String str4 = new String ("abc"); System.out.println(str1==str2);?//true?
    System.out.println(str3==str4);?//false 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一个指向字符串常量区,一个指向堆,显然是不相等的。

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

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

    String?str1?=?"abc";????String?str2?=?"def";? String str3 =?str1+str2;??? String str4 = "abc"+"def"String str5 = "abcdef" System.out.println(str4==str5);?//true System.out.println(str3==str4);?//false
    System.out.println(str3==str5);?//false ???

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

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

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

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

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

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

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

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

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

热点排行