字符串a ==字符串b的规则

Ced*_*Ced 5 java string heap-memory

我试图理解字符串池的工作原理以及字符串与另一个字符串相等的规则是什么.

例如,这个片段:

public static void main(String[] hi){
    String s1 = "lol";
    String s2 = "lol";
    String s3 = new String("lol");
    System.out.println( s1 == s2 );// true
    System.out.println( s2 == s3); // false
    s3.intern(); //line 1
    System.out.println( s1 == s3); // false
    testString(s1);

}

private static void testString(String s1){
    String s4 = "lol";
    System.out.println( s1 == s4); // true
}
Run Code Online (Sandbox Code Playgroud)
  1. 在第1行:字符串被添加到字符串池中.由于它不等于s1,我假设字符串池中有重复.正确吗?

  2. 在池中复制的规则是什么?换句话说,someString == someString即使两个字符串具有相同的char序列,何时返回false?

PS:无论如何,我在任何地方都使用string1.equals(string2).我只是想深入了解潜在的机制.

Kay*_*man 5

s3.intern();应该是s3 = s3.intern();为了获得正确的行为.


Jes*_*per 3

  1. //第1行:字符串被添加到字符串池中。由于它不等于 s1,我假设字符串池中有重复项。正确的 ?

不,不正确。字符串池中已经有一个字符串“lol”,因此不会创建重复的字符串。但是,您没有对调用的返回值执行任何操作,intern()所以s3仍然引用String不在池中的对象。

尝试s3 = s3.intern();而不只是s3.intern();

  1. 池中存在重复项的规则是什么?换句话说,即使两个字符串具有相同的字符序列,someString == someString 何时返回 false?

字符串池的全部意义在于避免内存中重复的字符串,因此字符串池中不会有任何重复的字符串。