2013-09-01 2 views
2

я вроде рассказывал кто-то, что мы должны использовать метод String.equals для сравнения значений двух строк, мы не можем просто использовать == оператора в Java для сравнения строк, и сказал, что == вернет false, так как не сравнивает строковое значение, а значение объекта String.Сравнение двух строк с одинаковым (==) оператора

Я написал этот пример, чтобы показать ему, но мое удивление, он всегда печатает верно для оператора == .. здесь код

public void exampleFunc1(){ 

    String string1 = "ABC"; 
    String string2 = "ABC"; 

    if(string1 == string2) 
     System.out.println("true"); 
    else{ 
     System.out.println("false"); 

    } 
    System.out.println(" Are they equal "+(string1 == string2)); // this shouldn't print True but it does 
    System.out.println(" Are they equal "+(string1.equals(string2))); 

} 

Выхода: -

ли они равны истинными

ли они равны истинным

Так вопрос здесь, в каких обстоятельствах == оператор на объектах может печатать true, за исключением того, что оба объекта являются одним и тем же экземпляром?

+1

См. Ответ на [Сравнение строк и интернирование строк в Java] (http://stackoverflow.com/questions/3885753/string-comparison-and-string-interning-in-java), в котором указывается, временные константы могут быть интернированы, поэтому два литерала заканчиваются ссылкой на один и тот же строковый объект. – Simon

+0

Спасибо, симон, это то, что я ищу, :) – AAnkit

ответ

2

String является одним из нескольких особых случаев.

Класс String хранит специальный бассейн «интернированного» String s. Метод myString.intern() поднимает вверх myString в этом бассейне. Если еще один String с тем же содержимым уже существует в пуле, возвращается указатель на него. Если нет, добавляется myString (и возвращается указатель).

Когда вы говорите myString= myString.intern() ;, вы фактически делаете myString обратитесь к общей копии или к ее основанию String, доступному для будущего совместного использования (и без дублирования). Большинство методов библиотеки, создающих String с, подчиняются этому, в частности String литералам.

Других случаи «интернирование» встречаются с типами оболочек Integer, Long и т.д. Они не имеют конструкторов, но статические методы, которые возвращают valueOf() преднастроенных, общие объекты, когда они могут (как правило, 256 значений близких к нулю), и новые объекты, когда они не могут. Позже это не очень проблематично, потому что эти типы более легкие, чем String с. Long, например, имеет полезную нагрузку всего 8 байтов. String содержит char[], что даже пустое составляет 16 байтов или около того.

Чтобы ответить на ваш вопрос, вы не можете рассчитывать на любые механизмы «интернирования». Они изменились в прошлом, и они могут измениться в будущем (или даже с одной JVM на другую), что сделает ваш код непригодным для использования. Всегда используйте equals.

+0

спасибо, А что произойдет, если мы изменим одно строковое значение – AAnkit

+0

@Ankit How? С конкатенацией? Мое впечатление, что конкатенация ставит результат. С функциями 'String'? То же самое. Единственный выход из этого заключается в том, чтобы ** заставить ** создавать новые 'String' с помощью конструкторов String. Если бы Java-команда подумала о интернате раньше, они бы не существовали, и все было бы похоже на типы-оболочки (без конструкторов, только с помощью конструкторских статических методов). –

+0

thats sound nice, Thanks :), Happy code. – AAnkit

1

Вы должны использовать

String string1 = new String("ABC");

String string2 = new String("ABC");

Тогда все будет правильно, как то, что вы думаете,

В этом случае, "ABC" просто ссылка на константную строку ,

+0

@Ankit Это потому, что 'new' заставляет создавать новую' String'. Конструкторы не могут возвращать другой объект, кроме того, который они создают. Однако, если вы подвергли обеим целям интернированию, вы вернетесь к 'string1 == string2'. –

0

Компилятор может оптимизировать назначения и только создание одного объекта String. Если вы используете явный конструктор String, операция == должна вести себя так, как ожидалось.

Смежные вопросы