2013-05-27 2 views
8
public static void main(String[] args){ 
     one(); 
     two(); 
     three(); 
    } 

    public static void one() { 
     String s1 = "hill5"; 
     String s2 = "hill" + 5; 
     System.out.println(s1==s2); 
    } 

    public static void two() { 
     String s1 = "hill5"; 
     int i =5; 
     String s2 = "hill" + i; 
     System.out.println(s1==s2); 
    } 

    public static void three() { 
     String s1 = "hill5"; 
     String s2 = "hill" + s1.length(); 
     System.out.println(s1==s2); 
    } 

ВыходJava строковые литералы конкатенации

true 
false 
false 

строковые литералы используют процесс интернирования, то почему two() и three() это false.I может понять в случае three() но two() не clear.but нужно правильное объяснение для обоих случаев.

Может кто-нибудь объяснить причину?

+1

прочитайте этот вопрос, который я спросил http://stackoverflow.com/questions/16729045/behavior-of-string-literals-are-confusing – anshulkatta

+1

Для удовольствия вы также можете попробовать 'two' с' final int i = 5 ; вместо этого (он будет печатать true вместо false, потому что теперь 'i' является константой). – assylias

+0

«каждый раз, когда кто-то сравнивает строки с == разработчиком криками ...» –

ответ

14

В случае 2 и 3, компилятор не может вычислить значение строки, так как hill + i это среда выполнения оператор, то же самое для s1.length()

прочитать здесь, который я задал тот же самый случай - link

Думай, как это String s1 and s2 используют константу времени компиляции, s1="hill5" и s2="hill" + 5, помните, что строка, назначенная как литерал, постоянна, ее состояние не может быть изменено, так как Строка неизменяема.

Так что во время компиляции компилятор говорит «о да, они рассчитаны как одно значение, я должен назначить одну и ту же ссылку на s1 и s2».

Но в случае метода two() и three(), компилятор говорит: «я не знаю, может быть значение из я могу быть изменен в любое время, или s1.length() изменения в любое время», его выполнение вещи, поэтому компилятор не ставит s2 от two() и three() метод в пуле,

Следовательно, они являются ложными, потому что во время выполнения создается новый объект, как только он будет изменен правильно!

+0

+1 Я думаю, что это ответ –

+0

Но строковые литералы создаются как часть кучи и jvm, проверяют, существует ли строка или нет, если нет, то она создает новую строку, иначе указывает на то же место. Также в случае двух и трех холмов5 Строка есть в пуле –

+2

@ankitagahoi Не совсем - только постоянные строки помещаются в пул, если вы не используете метод 'intern' ... – assylias

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