Метод equals и ==

356
30 августа 2017, 14:39

Фрагмент кода

for(int i =0; i<mas.length; i++){
  if(mas[i]=="-"){             //проверка является ли символ mas[i]равен -
    int[] m =new int[2];
    m[0]=Integer.valueOf(mas[i+2]);
    m[1]=Integer.valueOf(mas[i+3]);
  }
}

В данном случае в проверке равенства не возвращается true, если вместо == применить метод equals - то все в порядке.

Попробовал применить отдельно вариант сравнения используя ==

String s ="-";
system.out.println(s=="-");

возвратило true, в чем разница от первого примера, почему там не возвращает true?

Answer 1

Любопытный факт. Для экономии памяти в Java используется пул литералов. Все строки, созданные так:

String s = "abc";

помещаются в пул. Сравнивать две строки, лежащие в пуле можно оператором ==

String s1 = "abc";
String s2 = "abc";
s1 == s2; // true

Так как эти строки созданы литералами, они ссылаются на одно место в пуле, поэтому они равны. А вот строки, созданные оператором new или конкатенацией строк (пусть даже литералов) в пул не кладутся. Они кладутся в объекты, хранящиеся в куче (heap). Поэтому сравнивать их оператором == нецелесообразно, здесь нужен метод equals:

String s1 = "abc";
String s2 = "ab" + "c";
String s3 = new String("abc");
String s4 = s3;
s1 == s2; // false
s1 == s3; // false
s3 == s4; // true
s1.equals(s2); // true
Answer 2

== сравнивает ссылки на строки (которые у каждой строки свои), equals - содержимое этих строк

Answer 3

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

// + немного офотопа: и ещё обязательно переопределяйте метод equals если он вам нужен для сравнения собственных классов. Процесс переопределения метода очень хорошо описан у Хортсмана.

READ ALSO
Gradle - исключить пакет из зависимости

Gradle - исключить пакет из зависимости

Необходимо подключить Rhino (интерпретатор JavaScript) к приложению на AndroidИспользуется Gradle, зависимость добавляется без проблем:

335
Android Studio: Генерация textView

Android Studio: Генерация textView

Ребят, помогите, в общем

424
Маппинг Many-to-Many в DTO с помощью Criteria в Hibernate

Маппинг Many-to-Many в DTO с помощью Criteria в Hibernate

У меня есть следующая проблема, и я даже не знаю решаема ли она в принципеЕсть ентити с отношением многие-ко-многим:

433
Удаление символов

Удаление символов

Имеется следующий код:

317