2013-05-01 2 views
1

как же печатается верно:Неизменные строки в Java

String sOne = new String(); 
sOne = "one"; 
String sTwo = new String(); 
sTwo = "one"; 
System.out.println(sOne == sTwo ? "true": "false"); 

но это печатает ложь:

String sOne = new String("one"); 
String sTwo = new String("one"); 
System.out.println(sOne == sTwo ? "true": "false"); 

не должны они оба печатать ложь ... Я понимаю, что строки являются неизменными и все, но я не понимаю, почему НЕ инициализация с помощью конструктора вызывает разные выходные данные

ответ

7

Поскольку буква "one" относится к тому же объекту String везде он появляется; Строковые литералы всегда интернированы. Две переменные в первом примере будут ссылаться на один и тот же объект.

Во втором случае вы принудительно создаете строковый объект в двух назначениях, и поэтому строки равны, но являются разными экземплярами; две переменные ссылки эквивалентны, но разные объектов.

Выражение sOne.equals(sTwo) должно возвращать значение true в обоих примерах, поскольку оно будет выполнять тест равенства на содержимое строки.

+0

Это не только простые литералы, которые интернированы - это любая константа строка, которая означает, что строковый литерал _or_ конкатенации (с помощью '+') из двух (или более) строковые литералы. См. [JLS 15.28] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28) и [JSL 3.10.5] (http: // docs. oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5). – yshavit

1

В Java, если вы сравниваете, например, в C x == y, сравниваются объекты (например, указатели), но не их содержимое. Вот почему вам нужно использовать obj.equals (other_obj), чтобы убедиться, что они функционально одни и те же объекты. Это похоже на сравнение указателя на C. Если указатель один и тот же, вы смотрите на один и тот же объект. если указатели отличаются друг от друга, два объекта могут иметь одинаковые значения, но это разные объекты.

String v1 = "Test"; 
    String v2 = v1; 

    if(v1 == v2) 
     System.out.println("1true"); 

    v2 = "Test"; // referencing the same object 
    if(v1 == v2) 
     System.out.println("2true"); 
    if(v1.equals(v2)) 
     System.out.println("3true"); 

    v2 = new String("Test"); // new object/pointer same content 
    if(v1 == v2) 
     System.out.println("4true"); 
    if(v1.equals(v2)) 
     System.out.println("5true"); 

Выход:

1true 
2true 
3true 
5true