黑马程序员技术交流社区

标题: 有关字符串存放的常量池 [打印本页]

作者: yangxin540    时间: 2013-8-20 09:56
标题: 有关字符串存放的常量池
本帖最后由 yangxin540 于 2013-8-21 08:46 编辑

毕老师说字符串是存放在常量池中的,而且是以字符的形式存放。当创建一个字符串时,就会去常量池中查找是否有对应的字符,如先前已经存放了两个字符串是abc和def,当我们再存入一个叫bcd的字符串时就会去常量池中找相对应的字符组成一个字符串。
我的疑问:1、bcd的对象是实实在在存在的么;2、我要存一个叫efg的字符串,在常量池中会是怎样的变化呢,是在常量池中只加入一个g字符还是把efg都加入一遍。

作者: gulup    时间: 2013-8-20 10:38
这个问题问的好,我不会回答,我也想知道答案。等大神回答。
作者: 许云龙    时间: 2013-8-20 10:40
这就是传说中的享元模式,为了节约内存存在的。
当你存入了abc后常量池中只有abc,紧跟着你存入def和efg,这个时候常量池用只有abcdefg,
常量池中的元素没有重复,且每个元素都有自己的内存地址值。当调用元素的时候,引用了
它的地址值。
String str = “abc”;
str = “bcd”;
这里的str只是修改了自己的引用
希望我的回答对你能够有所帮助,与你一同进步!

作者: ily521125    时间: 2013-8-20 10:41
1.寄存器:最快的存储区,由编译器根据需求分配,我们在程序中无法控制.
作者: 黑马-文鸿利    时间: 2013-8-20 10:45
可以理解为内存里面专门为string类型变量开辟的一片区域

譬如String a = "abc"; 当你定义这样一个变量的时候,java此时先会去常量池寻找有没有"abc"这样的字符串,如果有,直接把内存地址交给a, 否则就生成一个"abc"的字符串
当下一个String b = "abc";的时候,发现常量池已经有"abc"了,此时JVM不会再次生成"abc",而是直接交给"abc"引用给b, 所以此时你会发现a == b
作者: ily521125    时间: 2013-8-20 10:54
本帖最后由 ily521125 于 2013-8-20 10:56 编辑

1.寄存器:最快的存储区,由编译器根据需求分配,我们在程序中无法控制.
2.栈:存放基本类型的变量数据和对象的引用,当对象本身不存放在栈中,而是存放在(new出来的对象)或者常量池中(字符串常量对象存放在常量池中)
3.堆:存放所有new出来的对象.
4.静态域:存放静态成员(static定义的).
5.常量池:存放字符串常量和基本类型常量(public static final)
6.非RAM存储:硬盘永久存储空间
如:String s1="abc";
      String s2="abc";
      这里的abc是存放在常量池中的,s1,s2是指向同一个abc,即s1,s2共享同一个abc.
      String s3=new String("abc");
      这里的abc是存放在堆中的,是新创建出来的对象,也就是说可以创建多个内容相同的对象
      String s4=new String("abc");  
      s4,s3是两个对象他们指向的是在堆中处在不同地址的abc
      

作者: 刘劲松    时间: 2013-8-20 11:09

第一次存
b c d
假设下次存cdf,
b c d f

每个字符单独有自己的地址。


作者: EYE_SEE_YOU    时间: 2013-8-20 12:38
高手就在民间




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