浅谈对Java中String intern()方法的理解

必须认识到的前提

所有Java程序中使用到的String都是在JVM堆中实际存在的对象实例,包括字面量"ab"

new String()、字符串拼接和字面量的比较

String s1 = new String("a") + new String("b");
String s2 = "ab";
  • 字面量

    字面量会在编译后进入字节码文件中的非运行时常量池,接着在被JVM执行引擎调用时:①在堆中新建该字面量的String对象;②将该对象引用放入字符串常量池;

    之后再用到此字面量时,会首先搜索字符串常量池得到池中存的对象引用,然后再进行调用。

  • 字符串拼接

    分三种情况

    1. "a" + "b"

      可以理解为常量+常量,在编译时会进行编译优化,替换成"ab",接下来的过程就是上面字面量的存储调用过程。

    2. new String("a") + "b"

      注意"a"和"b"是字面量

      变量+常量,只要字符串拼接中有变量存在,这里的变量可以简单理解为new出来的对象,就会进行new StringBuilder("a").append("b").toString()的过程,最终返回一个没有进入字符串常量池的String对象引用。

    3. new String("a") + new String("b")

      同2。

  • new String()

    使用了new String(),也就是调用了String类的构造函数,我们知道new指令是创建一个类的实例对象并完成加载初始化的,因此这个字符串对象是在运行期才能确定的,创建的字符串对象是在堆内存上。

    //StringBuilder.java
    @Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
    

    其实上面字符串拼接中,StringBuilder的toString方法底层就是new String(),所有运行时产生的String对象,不主动调用intern()方法,是不会进入字符串常量池的。

intern()的作用

在这里插入图片描述

intern()是native方法,底层用C++实现。

大概作用是:调用该方法后,会先查看字符串常量池中是否有该字符串,有的话返回池中存的String对象引用地址;没有的话则会创建String对象并将该对象及引用地址存入字符串常量池。

基于上面new String()、字符串拼接和字面量的比较部分,对intern()的作用应该会有更深的认识。

总结

  1. 对于程序中大量使用存在的字符串时,尤其存在很多已经重复的字符串时,使用intern()方法能够节省很大的内存空间。
  2. 大的网站平台,需要内存中存储大量的字符串。比如社交网站,很多人都存储:北京市、海淀区等信息。这时候如果字符串都调用intern() 方法,就会很明显降低内存的大小。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值