🤖
AI审核中

String 的 intern 方法与字符串相等判断

文章摘要

代码演示了 Java 中字符串比较的细节。`s1` 通过 `new String("xiaozou")` 在堆中创建了独立对象,`s2` 直接引用常量池中的字面量,两者地址不同,`s1 == s2` 为 `false`。调用 `s1.intern()` 时,若常量池已有相同内容的字符串,则返回该池中对象的引用,否则将其加入池中。因为常量池已经存在 `"xiaozou"`,`s3` 获得的正是 `s2` 的引用,故 `s2 == s3` 为 `true`。文章通过源码解释说明了 `intern()` 的工作原理及其在字符串共享中的作用。

如以下代码所示,s1 == s2 ?s2 == s3 ?

package interview.day02;

/**
 * @author: 邹祥发
 * @date: 2022/1/20 20:12
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = new String("xiaozou");
        String s2 = "xiaozou";
        //s1 == s2?
        System.out.println(s1 == s2);
        String s3 = s1.intern();
        //s2 == s3?
        System.out.println(s2 == s3);
    }
}

首先能够判断的是,s1与s2是肯定不相等的。

s1中创建了两个对象,1个字符串常量"xiaozou"放在字符串常量池中,1个String对象,放在堆里面。
s2的值来源于字符串常量池,如果字符串常量池中存在"xiaozou",则赋值给s2;

s1是一个String对象,s2是字符串常量对象,故二者是不相等的。
看一下intern()方法源码。

public native String intern();

String对象的intern()方法,首先会检查字符串常量池中是否存在"xiaozou"。
如果存在则返回该字符串引用,如果不存在,则把"xiaozou"添加到字符串常量池中,并返回该字符串常量的引用。
由于字符串常量池中已经存在"xiaozou",故s2与s3是相等的。

0 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论