Java8中String创建&intern方法

先给出几个大家都接受的定义:

  1. Java中所有字符串都是被实例化为String对象的. 以下为Java8官方文档.

在这里插入图片描述

  1. Java中 “==” :
    1. 引用类型则表示两个引用都指向同一个对象.
    2. 简单类型 字面量值相等.

StringTable中不存具体的对象, 存的全是引用. 理由:

  1. StringTable的大小是有限且固定的. 如果直接存对象, 严重影响存储能力.
  2. 如上面第二条所说==的概念. String s=“ss”; 则s.intern()==s为true. 说明两者都是对同一个东西的引用. 而intern方法返回的正是StringTable中保存的那个东西.

最后总结几种方式创建字符串时内存中的分配布局, 及各种情况下调用intern方法的效果. 看了很多很多博客, 下面的总结可以解释所有案例.

String s = "aa";
// table中没有值为"aa"的String对象的引用, 创建value为aa的String对象, 并将对象的地址加入到StringTable中.
// 如果发现table中已有值为该字符串的引用, 则复制该引用.
// s直接是table中的引用的副本
// intern 无效果

String ss = new String("aa");
// 先加载"aa", 与第一种方式等价:
// 如果table中没有值为"aa"的String对象的引用, 则创建String对象, 将String对象地址加入到table中
// 如果已有, 则不做多余动作.
// 然后执行new动作, 创建一个String对象, 取table中指向[value为"aa"的String对象]的引用->得到该[value为"aa"的String对象]->
// 将该[value为"aa"的String对象]的value(value是一个指针)赋值给新创建的这个String对象的value.
// intern 无效

String sss = new String(new char[]{'a','a'});
// 创建String对象, value指向一个独立的char数组, 与table无关
// intern
// 如果table中有指向[value为"aa"的String对象]的引用, 则返回table中的引用;
// 没有 则将自己复制到table(复制的是引用), 并返回该引用.
// 其他字符串相加等或直接或间接调用StringBuilder生成的字符串对象与这种方式相同. 想验证可以查看StringBuilder的toString()方法实现.

欢迎给出任何特例. 欢迎讨论.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值