java中String优化之intern()方法

本文详细介绍了Java中String的intern()方法,包括其在JDK1.7之后的作用,即检查字符串常量池并返回引用。文章探讨了intern()在节省内存和提高性能方面的应用场景,并通过例子展示了如何在实际代码中应用。同时,解释了为何在某些情况下,直接使用intern()可能是无意义的,因为它避免了不必要的堆内存分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、intern()的简介

1.1、jdk1.7之后的intern()方法的作用:

1、若是字符串常量池中不存在这个字符串,那么,就创建一个引用,把该字符串实例对象的引用复制过来,并返回该地址。
2、若是字符串常量池中已存在该字符串,那么直接返回该字符串的地址。

1.2、使用场景

String.intern()方法主要适用于程序中需要保存有限个会被反复使用的值的场景,这样可以减少内存消耗,同时在进行比较操作时减少时耗,提高程序性能。

1.3、各大框架String的操作都有使用intern()方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BcFjdrJ-1644391808646)(../../图片/1644390091271.png)]

2、例子

如一美团点评团队的《深入解析String#intern》文中举的一个例子:

static final int MAX = 1000 * 10000;
static final String[] arr = new String[MAX];

public static void main(String[] args) throws Exception {
    Integer[] DB_DATA = new Integer[10];
    Random random = new Random(10 * 10000);
    for (int i = 0; i < DB_DATA.length; i++) {
        DB_DATA[i] = random.nextInt();
    }
    for (int i = 0; i < MAX; i++) {
        arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern();
    }
}

在以上代码中,我们明确的知道,会有很多重复的相同的字符串产生,但是这些字符串的值都是只有在运行期才能确定的。所以,只能我们通过intern显示的将其加入常量池,这样可以减少很多字符串的重复创建

总结

按照上面的回答,就是说new String也会检查常量池,如果有的话就直接引用,如果不存在就要在常量池创建一个,那么还要intern干啥?难道以下代码是没有意义的吗?

String s = new String("hollo world").intern();

new String 所谓的“如果有的话就直接引用”,指的是Java堆中创建的String对象中包含的字符串字面量直接引用字符串池中的字面量对象。也就是说,还是要在堆里面创建对象的。

而intern中说的“如果有的话就直接返回其引用”,指的是会把字面量对象的引用直接返回给定义的对象。这个过程是不会在 Java 堆中再创建一个 String 对象的。

用直接返回给定义的对象。这个过程是不会在 Java 堆中再创建一个 String 对象的。

所以上面的代码是无意义的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值