字符串常量池到底存放的是字符串引用还是字符串对象
答案:3 悬赏:60 手机版
解决时间 2021-03-20 08:13
- 提问者网友:雪舞兮
- 2021-03-19 16:32
字符串常量池到底存放的是字符串引用还是字符串对象
最佳答案
- 五星知识达人网友:往事隔山水
- 2021-03-19 16:53
你看看String源码就明白了,是对象!
s="123";
写这句话的时候,会在常量池先找有没有123这个字符串对象如果没有,他就开始抽取,1,2,3
然后拼接成一个对象即:"123";
假如后面又来一个也需要这个对象,比如说s1="123";
这个时候在操作s1的时候还是先去常量池找有没有这个对象,如果有,直接把地址拿过来,因为常量池数据为共享的,
假如这个时候s1="1234";那么常量池是没有的,就会重新抽取,1,2,3,4,然后重新拼接成一个新的对象放在常量池!
String源码里面有一个私有变量一个字符类型的数组,他就是用来抽取这些单个字符,然后拼接成
一个字符串对象!
s="123";
写这句话的时候,会在常量池先找有没有123这个字符串对象如果没有,他就开始抽取,1,2,3
然后拼接成一个对象即:"123";
假如后面又来一个也需要这个对象,比如说s1="123";
这个时候在操作s1的时候还是先去常量池找有没有这个对象,如果有,直接把地址拿过来,因为常量池数据为共享的,
假如这个时候s1="1234";那么常量池是没有的,就会重新抽取,1,2,3,4,然后重新拼接成一个新的对象放在常量池!
String源码里面有一个私有变量一个字符类型的数组,他就是用来抽取这些单个字符,然后拼接成
一个字符串对象!
全部回答
- 1楼网友:猎心人
- 2021-03-19 17:38
众所周知,JDK1.8版本中,String常量池已经从方法区中的运行时常量池分离到堆中了,那么在堆中的String常量池里存的是String对象还是引用呢?我在网上查了一晚上,各有各的说法,最后索性直接查看API(果然API才是最强大的!!!),废话少说,直接上图:
(此图为JavaAPI中的阐述,我是用手机在网页打开的百度,不能复制图片,想看的原图可以去下面的原文链接里面看一下)
翻译一下,String类的intern()方法:一个初始为空的字符串池,它由类String独自维护。当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。 对于任意两个字符串s和t,当且仅当s.equals(t)为true时,s.intern() == t.intern()才为true。所有字面值字符串和字符串赋值常量表达式都使用 intern方法进行操作。
所以答案显而易见,官方都给了明确说明,还有什么好争论的呢?
转载自CSDN博主(木舟遥)————https://blog.csdn.net/weixin_39460458/article/details/79982765
(此图为JavaAPI中的阐述,我是用手机在网页打开的百度,不能复制图片,想看的原图可以去下面的原文链接里面看一下)
翻译一下,String类的intern()方法:一个初始为空的字符串池,它由类String独自维护。当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。 对于任意两个字符串s和t,当且仅当s.equals(t)为true时,s.intern() == t.intern()才为true。所有字面值字符串和字符串赋值常量表达式都使用 intern方法进行操作。
所以答案显而易见,官方都给了明确说明,还有什么好争论的呢?
转载自CSDN博主(木舟遥)————https://blog.csdn.net/weixin_39460458/article/details/79982765
- 2楼网友:动情书生
- 2021-03-19 17:06
引用,相同内容的字符串,会返回同一个引用
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯