A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangxin540 中级黑马   /  2013-8-20 09:56  /  2299 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangxin540 于 2013-8-21 08:46 编辑

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

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

7 个回复

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

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
1.寄存器:最快的存储区,由编译器根据需求分配,我们在程序中无法控制.
回复 使用道具 举报
可以理解为内存里面专门为string类型变量开辟的一片区域

譬如String a = "abc"; 当你定义这样一个变量的时候,java此时先会去常量池寻找有没有"abc"这样的字符串,如果有,直接把内存地址交给a, 否则就生成一个"abc"的字符串
当下一个String b = "abc";的时候,发现常量池已经有"abc"了,此时JVM不会再次生成"abc",而是直接交给"abc"引用给b, 所以此时你会发现a == b

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 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
      

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报

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

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

回复 使用道具 举报
高手就在民间
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马