Обмен технологиями

Ява 128 ловушка

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Что такое ловушка 128?

Давайте сначала посмотрим на фрагмент кода

		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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • Соответствует ли результат бега моим ожиданиям?
    Фактически, 8-й результат – это так называемая ловушка 128.

  • Ловушка Java 128 означает: когда значение, сохраненное классом инкапсуляции данных базового типа, больше или равно 128, адрес каждого класса не равен.Чтобы появиться, не обязательно должно быть 128.

    Проще говоря: когда оно меньше или равно 127 и больше или равно -128, значение, которое автоматически помещается в коробку, — это значение, которое существует по тому же адресу. Когда оно больше 127, это значение. автоматически упакованный - это не тот же самый. То есть, пока диапазон не [-128,127], использование == приведет к ложному результату. Если используется равенство, результат будет истинным. Даже если значение не находится в текущем диапазоне, если используется Integer, оно будет автоматически распаковано, поэтому не будет проблемы с ловушкой 128, поэтому седьмой запуск будет истинным;

Почему появляется ловушка 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

проиллюстрировать:
1. Значение IntegerCache.low равно -128, а значение IntegerCache.high — 127.
2. В методе valueOf класса Integer хранится массив кеша, эквивалентный кешу, в диапазоне от -128 до 127 закрытого интервала.
3. Когда принимаемое нами значение находится в диапазоне [-128, 127], возвращается значение, определенное в массиве IntegerCache.cache, и нет необходимости создавать новый объект.
4. Если значение выходит за пределы диапазона, необходимо создать новый объект. Новый объект == — это адрес оценки, который является ложным; равен значению оцениваемого объекта, который является истинным.

На что следует обратить внимание, столкнувшись с ловушкой 128

  • Если объект создается новым (как показано ниже), то ловушки 128 не будет. (Это предполагает автоматическую распаковку и упаковку, введение я напишу здесь позже)
    Причина в том, что адреса памяти объектов, созданных new, различны, и сравниваемые объекты не совпадают.
	Integer k1 = new Integer(100);
    Integer k2 = new Integer(100);
    System.out.println(k1==k2);  // 运行结果false
    System.out.println(k1.equals(k2)); // 运行结果true
  • 1
  • 2
  • 3
  • 4
  • При сравнении значений вы можете использовать метод равенства


Справочная документация:
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