==
проверяет оператор, что два Object
ссылки являются идентичными , не равной как мы обычно думаем. Это означает, что для типов Integer
он проверяет, что они относятся к тому же Integer
. Если где-то в вашем коде у вас есть две строки, которые создают новое значение Integer
s со значением 3043, вместо повторного использования одного экземпляра, то они не относятся к одному и тому же местоположению в памяти. Из-за этой проблемы может возникнуть ситуация, когда из-за этого у обеих коллекций есть разные ссылки на объекты.
Другой вариант, как Integer
непреложный типа, является то, что вы не new
ничего, и вместо этого, может быть, сделал valueOf
, и известно, что некоторые реализации Integer
содержат кэш первых 128 или 256 целочисленных значений, которые возвращается на Integer.valueOf
invocations.
От OpenJDK:
public static Integer valueOf(int i)
{
if (i < -128 || i > 127) {
return new Integer(i);
}
return valueOfCache.CACHE [i+128];
}
Может быть, в вашем коде у вас есть String
равно "3043", и дважды вызвать Integer.valueOf(thatString)
, чтобы получить ваши Integer
объекты. Но это также ошибочно, так как вы можете видеть, что по крайней мере 1 реализация будет по-прежнему внутренне new
чем-либо выше 127, и вы вернетесь к исходной проблеме.
Integer x = new Integer(120); // as @polygenelubricants pointed out, these two will
Integer y = new Integer(120); // never be == equal, but .equals equal, because new
// creates a brand new object in memory
Integer j = Integer.valueOf(15); // sometimes values < 128 will be cached, so j == k
Integer k = Integer.valueOf(15); // because valueOf will return the same cached object
Integer a = Integer.valueOf(3043); // 3043 is high enough that it probably isn't cached
Integer b = Integer.valueOf(3043); // so b is a reference to a different Integer
В нижней строке: если вы явно не взяли ни одного Integer
и поместить его в обе коллекции себя, не предполагают, что они являются тем же объектом. Даже если вы знаете, что они, вероятно, являются одним и тем же объектом, потому что вы знаете, что одна реализация JVM Integer
кэшируется до 4096, не полагайтесь на это. И всегда проверяйте объект на равенство с помощью equals
, если вы действительно не хотите спросить, ссылаются ли они на то же место в памяти. Для неизменяемых объектов, таких как Integer
и String
, это вряд ли понадобится.
Вы пробовали 'equals()' –
Если бы вы имели дело с 'int' s, это сработало бы ... –