Java intern() 方法

2021-08-03  本文已影响0人  明月几何8

intern() 方法返回字符串对象的规范化表示形式。

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

语法

public String intern()

参数

返回值
一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。

实例

public class Test {
    public static void main(String args[]) {
        String Str1 = new String("www.runoob.com");
        String Str2 = new String("WWW.RUNOOB.COM");

        System.out.print("规范表示:" );
        System.out.println(Str1.intern());

        System.out.print("规范表示:" );
        System.out.println(Str2.intern());
    }
}

以上程序执行结果为:

规范表示:www.runoob.com
规范表示:WWW.RUNOOB.COM

尽管在输出中调用intern方法并没有什么效果,但是实际上后台这个方法会做一系列的动作和操作。在调用”ab”.intern()方法的时候会返回”ab”,但是这个方法会首先检查字符串池中是否有”ab”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用。

业务场景:当我们使用java中的synchronized关键字进行并发处理的时候,我们用字符串当锁,例如

public void test(String str) {
    synchronized (str) {
          ...
    }
}

当出现并发访问时,这里的同步代码块并不能解决并发问题,因为不同请求获取到的字符串对象是不一样的,怎么解决呢?

public void test(String str) {
    synchronized (str.intern()) {
          ...
    }
}

intern()方法会先检查字符串池中是否存在这个字符串,如果有返回该字符串引用地址,没有则添加到字符串池然后返回引用地址。这样获取到的锁对象就是同一个对象。

上一篇 下一篇

猜你喜欢

热点阅读