2013-11-18 4 views
4

Я столкнулся с этим вопросом в группе Facebook. Я знаю, что я должен использовать equals() метод, но я хочу знать, почему это происходитJava == ведет себя неоднозначно

class Main 
{ 
    public static void main (String[] args) 
    { 
     String s1="abc:5"; 
     String s2="abc:5"; 
     System.out.println(s1==s2); 
     System.out.println("s1 == s2 " + s1==s2); 
    } 
} 

ВЫВОД

true 
false 
+1

я бы ожидать вторую линию для печати s1 == s2false –

+5

'System.out.println (("s1 == s2" + s1) == s2); ' – Codo

+0

@JeffHawthorne Я бы тоже! Но это не так. –

ответ

5

О, я просто внести некоторые изменения в коде и получить, что + первый делает "s1 == s2 s1"== затем с s2, которая не является правдой. Новый код

class Main 
{ 
    public static void main (String[] args) 
    { 
     String s1="abc:5"; 
     String s2="abc:5"; 
     System.out.println(s1==s2); 
     System.out.println("s1 == s2 " + (s1==s2)); 
     System.out.println("s1 == s2 " + s1==s2); 
    } 
} 

ВЫВОД

true 
s1 == s2 true 
false 
2

это легко понять, когда вы думали, что и так: 2. Println первый добавляет «s1 == s2» и ваши строки s1, а затем сравнивает его с s2 , поэтому он выводит false, потому что «s1 == s2abc: 5» не «abc: 5»

6

Путаница находится в порядке операций. Что происходит, так это то, что вы объединяете "s1 == s2 " и s1, затем используя == по этому результату и s2.

Это разные предметы, поэтому напечатан false"s1 == s2" не печатается). Поместите круглые скобки:

System.out.println("s1 == s2 " + (s1==s2)); 

Это будет печатать s1 == s2 true, потому что оба s1 и s2 относятся к одной и той же интернирован строкового литерала, "abc:5".

2

Он добавляет строки "s1 == s2 " + s1, а затем вычисляет, равен ли он s2. Это не так, это печать false.

Java Operator Precedence может вам помочь.

2

Я думаю, что при использовании «==» система просто проверит, имеют ли две вещи одно и то же местоположение в системной памяти. Однако, если вы используете метод «.equals», система проверит, имеют ли две строки одни и те же символы.

1

Я думаю, что из-за того, что у оператора есть что-то подобное, если вы делаете System.out.println(""+(s1==s2));, он напечатает правду.

1

Ваш код

System.out.println(s1==s2); 
    System.out.println("s1 == s2 " + s1==s2); 

Поскольку s1 и s2 являются одни и те же строковые литералы

`s1==s2` is true 

Таким образом, код может быть записан в виде

System.out.println(true); => true 
    System.out.println("true" + s1==s2); 

Теперь, "истинный" + s1 == s2 понимается как («true» + s1) == s2 из-за более высокого приоритета, заданного «+». Таким образом,

"true"+s1 => trueabc:5 and 
s2 => "abc:5" 

Следовательно

System.out.println("true" + s1==s2); => false 
Смежные вопросы