站在前面诸位的肩膀上我总结一下哈:
1.“==”与equals;字符串直接赋值与new出字符串对象
前面一个原因大家都知道的,使用“==”,基本变量比较内容,对象比较内存地址。而equals方法比较要看是否重写了,没有重写,那就是object老大说的算了。后面一个,字符串直接赋值——就像谭威所说:JVM会将这种方式创建的字符串放入字符串池进行缓存。在一般情况下,字符串池中字符串对象不会被垃圾回收,当程序在此需要该字符串时,无需重新创建一个新的字符串,而是直接让引用变量指向字符串池中已有的的字符串。但new出来的不同——new出来的东东都在内存的堆中,而new出来的东东都是纯对象(虽然我们一再声称所有的东西都是对象,但这是我们java语义中实实在在new出来的对象),需要引用来标示它,因此对于他们的比较要基于equals。所以楼主的疑问:
new都是在堆内存建立对象。
那String str="x" 有没有建立对象?是存在堆 内存中的吗???
确切说str没有所谓的对象实例(最起码不是在堆中),而是在code区的字符串池里。
而谭威所说提到的:“前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。”即是因为前者可能只需要传递一下引用就可以了,而后者必须要在堆中老老实实的按照步骤开辟内存空间、给对象赋初值、将栈中的引用指向堆中的这个对象。
不过我看大家没有提到的一点是:关于字符串的使用可能也是java内存泄露的原因之一:当你不断使用一个相同的引用而不断改变其String字符串的值时就有可能发生这种情况:String str = "liu"; str = "liuCong" str = "刘聪" 你不断的改变str的指向,而String类型是不会变的,因此它会在池里不断的创建出新的字符串,而原有的字符串就没有再用了,而且没有引用指向它们,这样垃圾回收不也定时,就可能会造成内存泄露。
|