String类的内部化方法释疑

本文主要介绍Java中String类的intern方法,它是一个本地方法,返回字符串对象的内部化引用。通过示例说明当两个字符串相等时,其intern方法返回的是同一实例。还提到字符串文字和常量表达式的值会被内部化,同时指出该方法在JBuilder 2005和Eclipse中的不同表现。

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

   相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下:
    public native String intern();

    文档告诉我们该方法返回一个字符串对象的内部化引用:由String类维护一个初始为空的字符串的对象池,当intern方法被调用时,如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,否则添加字符串到对象池并返回该字符串的引用。

    从程序的角度上怎么来看这个方法呢,我们假设有两个字符串s1,s2,当s1.equals(s2)时,s1.intern()==s2.intern(),也就是说这两个字符串在内存中使用的是同一个实例。

    Java语言规范中定义了字符串文字以及更一般的常量表达式的值的字符串是被内部化的,以便它们共享同一个实例。我们试验一下下面代码

String s1 = "你好,Java自由人";
String s2 = "你好," + "Java自由人";
System.out.println(s1==s2);
System.out.println(s1.intern()==s2.intern());


    这段代码将打印两个true,也就是说字符串s1和s2是共享同一个实例。不过前提是尽管使用了表达式,但是表达式中必须都是常量。

    当然我现在还想不出这个方法到底有什么用,不过算是对Java虚拟机内部组织结构的一些了解,同时了解这个处理机制也可以让我们在用到字符串常量的时候了解如何节省这些字符串所占用的内存。

    很奇怪的是intern这个方法居然在JBuilder 2005上被告知是一个未定义的方法,在Eclipse中表现很正常。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值