关于String对象的值存在哪了

       String是一个Final类, 一旦赋值之后,就不能再修改了, 但平时编码时经常会遇到对String对象修改的情况, 那就只有一种解释:

                  平时对String的值的每次修改都是创建了一个新的String对象 ,并将引用指向了这个新的对象 .

       因为String的值永远不会变,那么多处引用如果存储同一个字符串就没有必要为这一个不会变的字符串分配多份存储空间,可以推测出, 所有同一个值的引用最终指向的都是一块存储空间. 查询JVM规范之后,证实了这一点:

        

  • Literal strings within the same class (§8 (Classes)) in the same package (§7 (Packages)) represent references to the same String object (§4.3.1).

  • Literal strings within different classes in the same package represent references to the same String object.

  • Literal strings within different classes in different packages likewise represent references to the same String object.

参考链接: Oracle官方文档JDK8   https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5

       String的值到底存在哪呢?  根据以上文档5.1章节, 可以知道应该是在运行时常量池中,运行时常量池属于方法区, JVM结构如下图:

                                

    方法区是由所有线程共享的数据区.下面用代码来验证一下这一点:

 public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String str1="abc";
        String str2="abc";
        String str3=new String("abc");
        System.out.println(str1==str2);
        System.out.println(str1==str3);

        Class str3Clazz=str3.getClass();
        Field field=str3Clazz.getDeclaredField("value");
        field.setAccessible(true);
        char[] str3Chars= (char[]) field.get(str3);
        str3Chars[0]='b';
        System.out.println(str1+" "+str2+" "+str3);

    }

此处的输出结果为:

true
false
bbc bbc bbc
 

用反射来验证的思路参考于:  https://blog.csdn.net/qq_36418435/article/details/81623756

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值