Фрагмент кода
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
?
Любопытный факт. Для экономии памяти в 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
==
сравнивает ссылки на строки которые у каждой строки уникальны и неизменяемые
equals
- сравнивает содержимое этих строк (в контексте строк String
будет приведено к типу String
) или Object
, данный метод принимает аргумент Object
, может быть переопределен с приведением разных типов, если это понадобится в других контекстах.
== это примитивный оператор, сравнивая объекты старайтесь использовать equals, для некоторых стандартных классов оператор == и метод equals работают идентично, но не для всех.
// + немного офотопа: и ещё обязательно переопределяйте метод equals если он вам нужен для сравнения собственных классов. Процесс переопределения метода очень хорошо описан у Хортсмана.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Когда можно инициализировать final переменную? Может ли final переменная быть аргументом метода? Есть ли у final переменной значение по умолчанию?
Как сравнить два объекта по их параметрамТо есть, например у меня есть два объекта:
Допустим есть объект organisations, содержащий в каждой ячейке объект, включающий в себя наименование организации, ИНН, ОГРН и адрес, примерно так: