首页 > 解决方案 > 字符串实习生()方法

问题描述

据我所知, String s1 = new String("abc") 创建两个对象 -

  1. 一个在堆中
  2. 字符串常量池(SCP)中的另一个。

因此,每当我们使用“new”关键字创建字符串对象时,它都会在 SCP 中创建一个对象。

是否有可能在堆中存在 String 对象但在 SCP 中不存在?

  1. 如果否,那么 intern() 方法的用途是什么,因为它添加了 String 对象,如果它不存在于 SCP 中。
  2. 如果是,请您举个例子。

标签: javastring

解决方案


intern() 方法通过查看预先存在的字符串字面量池,帮助使用 == 运算符比较两个 String 对象,它比 equals() 方法更快。

尽管默认情况下 Java 会自动实习所有字符串,但请记住,我们只需要在字符串不是常量时实习,并且我们希望能够快速将它们与其他实习字符串进行比较。intern() 方法应该用于使用 new String() 构造的字符串,以便通过 == 运算符比较它们。

包装测试;

公共类TestString {

public static void main(String[] args) {
    String s1 = "Test";
    String s2 = "Test";
    String s3 = new String("Test");
    final String s4 = s3.intern();
    System.out.println(s1 == s2);
    System.out.println(s2 == s3);
    System.out.println(s3 == s4);
    System.out.println(s1 == s3);
    System.out.println(s1 == s4);
    System.out.println(s1.equals(s2));
    System.out.println(s2.equals(s3));
    System.out.println(s3.equals(s4));
    System.out.println(s1.equals(s4));
    System.out.println(s1.equals(s3));
}

}


推荐阅读