Метод equals и ==

160
20 июля 2019, 06:30

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

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 - сравнивает содержимое этих строк (в контексте строк String будет приведено к типу String) или Object, данный метод принимает аргумент Object, может быть переопределен с приведением разных типов, если это понадобится в других контекстах.

Answer 3

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

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

READ ALSO
Финализированные переменные

Финализированные переменные

Когда можно инициализировать final переменную? Может ли final переменная быть аргументом метода? Есть ли у final переменной значение по умолчанию?

144
Как сравнить объекты по параметрам

Как сравнить объекты по параметрам

Как сравнить два объекта по их параметрамТо есть, например у меня есть два объекта:

171
Раскрывающийся список select и несколько баз данных

Раскрывающийся список select и несколько баз данных

Допустим есть объект organisations, содержащий в каждой ячейке объект, включающий в себя наименование организации, ИНН, ОГРН и адрес, примерно так:

145