Фрагмент кода
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 - содержимое этих строк
== это примитивный оператор, сравнивая объекты старайтесь использовать equals, для некоторых стандартных классов оператор == и метод equals работают идентично, но не для всех.
// + немного офотопа: и ещё обязательно переопределяйте метод equals если он вам нужен для сравнения собственных классов. Процесс переопределения метода очень хорошо описан у Хортсмана.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Необходимо подключить Rhino (интерпретатор JavaScript) к приложению на AndroidИспользуется Gradle, зависимость добавляется без проблем:
У меня есть следующая проблема, и я даже не знаю решаема ли она в принципеЕсть ентити с отношением многие-ко-многим: