기술나눔

자바 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]이 아닌 한 ==를 사용하면 false가 됩니다. 같음을 사용하면 결과는 true가 됩니다. 값이 현재 범위에 있지 않더라도 Integer를 사용하면 자동으로 unboxing되므로 128 트랩 문제가 발생하지 않으므로 7번째 실행이 true입니다.

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. Integer의 valueOf 메소드에는 캐시와 동일한 캐시 배열이 저장되며 범위는 -128에서 127까지입니다.
3. 우리가 취하는 값이 [-128, 127] 사이인 경우 반환되는 값은 IntegerCache.cache 배열에 정의된 값이며 새 개체를 만들 필요가 없습니다.
4. 값이 범위를 벗어나면 새로운 객체를 생성해야 합니다. 새 객체 ==는 판단된 주소이며, 이는 판단된 객체의 값입니다.

128 트랩에 직면할 때 주의할 점

  • 아래 표시된 것처럼 객체가 new에 의해 생성되면 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
  • 값을 비교할 때 equals 메소드를 사용할 수 있습니다.


참조 문서:
https://blog.csdn.net/niu_8865/article/details/110791911
https://blog.csdn.net/DianLanHong/기사/세부정보/119617352
https://blog.csdn.net/양연_/article/details/135611919