моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Давайте сначала посмотрим на фрагмент кода
int a0=127;
int a1=127;
Integer a2=127;
Integer a3=127;
System.out.println(a0==a1); // 1、运行结果是true
System.out.println(a0==a2); // 2、运行结果是true
System.out.println(a2==a3); // 3、运行结果是true
System.out.println(a2.equals(a0)); // 注意这里必须是包装类的a2才能使用equals,a0不能使用
// 4、运行结果是true
System.out.println(a2.equals(a3)); // 5、运行结果是true
System.out.println("-----------------------------");
int b0=200;
int b1=200;
Integer b2=200;
Integer b3=200;
System.out.println(b0==b1); // 6、运行结果是true
System.out.println(b0==b2); // 7、运行结果是true
System.out.println(b2==b3);// 8、运行结果是false
System.out.println(b2.equals(b0)); // 9、运行结果是true
System.out.println(b2.equals(b3)); // 10、运行结果是true
Соответствует ли результат бега моим ожиданиям?
Фактически, 8-й результат – это так называемая ловушка 128.
Ловушка Java 128 означает: когда значение, сохраненное классом инкапсуляции данных базового типа, больше или равно 128, адрес каждого класса не равен.Чтобы появиться, не обязательно должно быть 128.
Проще говоря: когда оно меньше или равно 127 и больше или равно -128, значение, которое автоматически помещается в коробку, — это значение, которое существует по тому же адресу. Когда оно больше 127, это значение. автоматически упакованный - это не тот же самый. То есть, пока диапазон не [-128,127], использование == приведет к ложному результату. Если используется равенство, результат будет истинным. Даже если значение не находится в текущем диапазоне, если используется Integer, оно будет автоматически распаковано, поэтому не будет проблемы с ловушкой 128, поэтому седьмой запуск будет истинным;
/**解释精简一部分后
* This method will always cache values in the range -128 to 127
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
проиллюстрировать:
1. Значение IntegerCache.low равно -128, а значение IntegerCache.high — 127.
2. В методе valueOf класса Integer хранится массив кеша, эквивалентный кешу, в диапазоне от -128 до 127 закрытого интервала.
3. Когда принимаемое нами значение находится в диапазоне [-128, 127], возвращается значение, определенное в массиве IntegerCache.cache, и нет необходимости создавать новый объект.
4. Если значение выходит за пределы диапазона, необходимо создать новый объект. Новый объект == — это адрес оценки, который является ложным; равен значению оцениваемого объекта, который является истинным.
Integer k1 = new Integer(100);
Integer k2 = new Integer(100);
System.out.println(k1==k2); // 运行结果false
System.out.println(k1.equals(k2)); // 运行结果true
Справочная документация:
https://blog.csdn.net/niu_8865/article/details/110791911
https://blog.csdn.net/DianLanHong/article/details/119617352
https://blog.csdn.net/Yangyeon_/article/details/135611919