黑马程序员技术交流社区

标题: 被String类搞蒙了,求大神解答。 [打印本页]

作者: 君嘘    时间: 2015-4-17 16:48
标题: 被String类搞蒙了,求大神解答。
先来看这个
String a="abc".
这段代码编译的时候在常量池中新建了“abc”。我很想问,这“abc”有在堆内存中存在么。

还有
String a=new String( “abc”);
常量池中的abc和堆内存中的abc有什么关系么。
作者: 柳叶飞刀    时间: 2015-4-17 17:04
还真没注意到这个问题
作者: 396460221    时间: 2015-4-17 17:10
我的理解是,常量池中是单个字符的,比如 a b c d或其他特殊字符都是单个的,当有英文字符串时他们会去常量池中找相对应的单个字符组成字符串。如果直接写String s = "abc",s的引用只指向常量池中的地址。如果写成String s = new String("abc"),,堆内存中会给s分配地址,并且他指向的也是常量池中的地址。常量池我不知道在哪片内存中,如果理解不对,请见谅。
作者: 君嘘    时间: 2015-4-17 20:03
396460221 发表于 2015-4-17 17:10
我的理解是,常量池中是单个字符的,比如 a b c d或其他特殊字符都是单个的,当有英文字符串时他们会去常量 ...

这方法我也懒得纠结了,网上都没有一个统一的说法。
API的解释是这样的,
String s=“abc”
相当于
char[]  c={'a','b','c'}
String s=new Stinrg(c).

按这样说法“abc”是存储在堆内存中。
但是很多人又说“abc”的引用指向的是常量池。

还有,常量池的话是在方法区的。

作者: lslkkk    时间: 2015-4-17 20:42
来看大神们解答疑难
作者: lurenge    时间: 2015-4-17 20:58
坐等答案啊   求解中
作者: showdy    时间: 2015-4-17 21:04
我给你看一张内存看,一目了然

字符串的通过new和直接赋值的区别图解.gif (10.72 KB, 下载次数: 8)

字符串的通过new和直接赋值的区别图解.gif

作者: 郝聚德    时间: 2015-4-17 21:05
"abc"在方法区中的静态区是单个字符的'a'  'b'  'c'...   你要字符串"abc"他在常量池中创建之前是没有的  所以你就得要创建   创建的时候是把字符'a' 'b' 'c'  拿出来重复的只拿一次完了就开始创建....
作者: 郝聚德    时间: 2015-4-17 21:09
D:\0322\第二个春天\day13\code
作者: 一个土豆丶    时间: 2015-4-17 21:20
哎,这个问题,太神奇了
作者: Chans_宇    时间: 2015-4-18 00:33
我的猜想:要知道键盘上的每个输入按键基本都可以通过那个什么码表转换成数值型数据,所以我想到的是String类在常量池中实现初始化有点类似于查表法(看过毕向东老师的视频的朋友应该有所了解),因此它是可以看作是在常量池中以字符数组为底层直接实现的,不用到堆内存那里去,其实内存真实运作是咋样,谁都不能完全描述,但底层运作基本都是基于硬件高低电平(数字电路表示形式为0,1)差异的叠积达到不同效果的吧:o
作者: 程梦真    时间: 2015-4-18 11:02
1.当使用String str="abc",这种方式时,先去内存的Heap中找是否存在"abc"这个字符串,若存在,则将地址引用。若不存在则创建。

2.当使用String str=new String("abc");时,不管事先是否存在"abc",每次都会创建其新的对象。
作者: lwj123    时间: 2015-4-18 11:40
两个位置都不一样,就没什么关系了
作者: 君嘘    时间: 2015-4-18 12:02
lwj123 发表于 2015-4-18 11:40
两个位置都不一样,就没什么关系了

谢谢版主啦,不过String的内存机制真的如7楼画的那样么。
堆内存存储的String对象那个“abc”是常量池的引用?


作者: 1017161726    时间: 2015-4-18 12:51
本帖最后由 1017161726 于 2015-4-18 12:54 编辑

String a="abc",堆内存中如果有,就直接引用,没有就调用new方法新建一个。String s=new String("abc"),是不管堆内存红有没有,都直接新建一个对象。
可以不用纠结常量池的问题。

作者: sunyue    时间: 2015-4-18 14:10
还真没想到这个问题 问的不错




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