Здравствуйте. Задачу уже решил на один вопрос всё-таки остался. Это тот код по которому задача не проходила. После замены строки
if (list.get(i) == list.get(i-1))
на
if (list.get(i).equals(list.get(i-1)))
валидатор принял решение.
Можете, пожалуйста, объяснить почему не работало ==, а необходимо equals
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(Integer.parseInt(reader.readLine()));
}
int a = 1;
int b = 0;
for (int i = 1; i < list.size(); i ++) {
if (list.get(i) == list.get(i-1)) {
a++;
}
else if (b<=a){
b=a;
a=1;
}
else if (b>a){
a=1;
}
}
if (a >= b) {
System.out.println(a);
}
else
System.out.println(b);
}
}
Dzmitry Slayek
16 уровень
Комментарий ментора "проверить с последовательностью чисел больше 127"
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
30 августа 2020, 17:03
int n -> примитив.
Integer n -> объект.
Через == мы сравниваем примитивы.
А объекты через == сравниваются по ссылкам (на адрес в памяти JVM конкретного объекта).
Для скорости и удобства, класс Integer кеширует значения от - 128 до 127. И при присваивании значения из заданного диапазона переменной присваивается ссылка на заранее сгенерированный объект. Поэтому при использовании оператора "==" по сути сравниваются две ссылки, которые будут указывать на один объект для диапазона -128..127.
Здесь ссылки ссылаются на один и тот же объект, ведь его Джава дает уже готовым, хоть 1000 раз создавай, это будет ссылка на один и тот же объект. А значит можно сравнивать через ==.
i и j это две ссылки, которые ссылаются на разные объекты.
ВНЕ диапазона -128...127 создается новый объект через оператор new.
Хоть значение этих объектов совпадает. Но для программы это два разных объекта в памяти. А значит разные ссылки.
Нужно запомнить правило:
Примитивы мы сравниваем через ==.
Объекты через equals.
p.s. Данный кеш работает не только для Integer. Он работает также для целочисленных оберток примитивов - Byte, Short, Long, Character. Boolean кстати тоже кешированы, сколько бы мы не создавали Boolean isSomething = true;
p.p.s. Размер кеша контролируется параметрами запуска программы, и верхняя граница (по умолчанию 127) может меняться. Именно поэтому нельзя рассчитывать что если программа работает с таким диапазоном значений, то и == сойдет, этот кеш это оптимизация памяти, обшего правила не отменяет.
Примитивы сравниваем по значению это ==.
Объекты по значению сравниваем через equals. +5
Dzmitry Slayek
30 августа 2020, 19:03
Спасибо.
0
Dzmitry Slayek
30 августа 2020, 17:00
Спасибо
0
hidden #2322530
30 августа 2020, 16:39
потому что int примитивный сравнивают через ==, а Integer ссылочный тип, его сравнивают через equals
в гугле есть информация
0