黑马程序员技术交流社区

标题: String 对象初始化的2种方式到底有什么区别 [打印本页]

作者: 2528870651    时间: 2014-4-3 10:12
标题: String 对象初始化的2种方式到底有什么区别
本帖最后由 2528870651 于 2014-4-4 18:46 编辑

老师上课的时候说了2种方式的区别

String 字符串 = "字符串内容";
使用了缓冲池机制,在内存中只开辟了一个内存空间
String 字符串 = new String("字符串内容");
没有使用缓冲池机制,在内存中开辟了两个内存空间

那么,缓冲池机制到底是什么? 以及开辟的内存到底有什么不同呢?
通过String 字符串 = new String("字符串内容"); 方式开辟的2个内存空间的具体情况是怎样的啊 ???
作者: 残梦共飞雪    时间: 2014-4-3 11:03
"字符串内容"是在内存中的字符串池中
而new String("字符串内容")是个对象,不是存放在字符串池中的。

进而System.out.println("字符串内容"==new String("字符串内容")); //false
作者: Engle    时间: 2014-4-3 12:08
我在另一篇回帖中提到了这个问题:

String s="aaa" 和 String s=new String("aaa")底层都做了什么。

String s = “aaa”;(采用字面值方式赋值)
1)  查找 String Pool(字符串池)中是否存在“aaa”这个对象,如果不存在,则在 String Pool 中创建
一个“aaa”对象,然后将 String  Pool 中的这个“aaa”对象的地址返回来,赋给引
用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2)  如果存在,则不创建任何对象,直接将 String Pool中的这个“aaa”对象地址返回来,
赋给 s 引用。
String s = new String(“aaa”);
1)  首先在String Pool 中查找有没有“aaa”这个字符串对象,如果有,则不在 String Pool
中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对
象,然后将堆中的这个“aaa”对象的地址返回来,赋给 s 引用,导致 s 指向了堆中
创建的这个“aaa”字符串对象。
2)  如果没有,则首先在 String Pool中创建一个“aaa“对象,然后再在堆中(heap)创
建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给 s 引用,
导致 s 指向了堆中所创建的这个”aaa“对象。


作者: linweiwen    时间: 2014-4-3 12:25
本帖最后由 linweiwen 于 2014-4-3 12:26 编辑

楼主,关于这两个的区别,
我再另外一个帖子回复过:http://bbs.itheima.com/thread-112351-1-1.html

你这里说的缓冲池机制,其实就是方法区里面的常量池(内含字符串常量池),
两种方式其实都要开辟内存空间,其实最终来看还是一样的,
如果字符串常量池没有,还是要在里面创建那个字符串,

但是,new String(),还另外多了一个字符串对象又指向那个常量池的字符串而已。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2