
При сравнении оболочек "==" сравнивает ссылки, а equals - значение.
boolean b = true; // прямое присвоение
Boolean B = true;
Boolean Br = new Boolean("true"); // присвоение через конструктор
Boolean Br2 = new Boolean(true);
Boolean Bv = Boolean.valueOf(true); // присвоение через статический метод valueOf()
int i = 10;
Integer I = 10;
System.out.println(b == B); // true - сравнение по значению, т.к. b - примитив
System.out.println(I == i); // true - сравнение по значению, т.к. i - примитив
System.out.println(Bv); // true
System.out.println(Br == Bv); // false - сравнение ссылок
System.out.println(Br2 == Br); // false - сравнение ссылок
System.out.println(Br2.equals(Br)); // true - сравнение объектов по значению
Метод intern() объекта String возвращает содержимое строки из строкового пула. При вызове этого метода выполняется проверка, есть ли такое значение в пуле. Если такого значения нет, то оно туда добавляется. Т. о. можно сравнивать строки оператором "==".
String s1 = new String("Stickers");
String s2 = new String("Stickers");
System.out.println(s1 == s2); // false - сравнение ссылок
System.out.println(s1.intern() == s2.intern()); // true - сравнение по значению
В массивах не переопределён метод equals(), поэтому для двух массивов с одинаковым содержимым он вернёт false.
int i[] = {1,2,3};
int k[] = {1,2,3};
System.out.println(i.equals(k)); //false
В ArrayList этот метод переопределён, он сравнивает элементы списка и их порядок.
List<Integer> li = new ArrayList<>();
List<Integer> lk = new ArrayList<>();
for(int j = 1; j < 4; j++){
li.add(j);
lk.add(j);
}
System.out.println(li.equals(lk)); //true