Berbagi teknologi

Perangkap Java 128

2024-07-12

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

Apa itu jebakan 128

Mari kita lihat sepotong kodenya terlebih dahulu

		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
  • Apakah hasil yang saya peroleh sesuai dengan yang saya harapkan?
    Faktanya, hasil lari ke-8 disebut jebakan 128.

  • Perangkap Java 128 mengacu pada: ketika nilai yang disimpan oleh kelas enkapsulasi data tipe dasar lebih besar dari atau sama dengan 128, alamat setiap kelas tidak sama.Tidak harus 128 untuk muncul.

    Sederhananya: bila kurang dari atau sama dengan 127 dan lebih besar dari atau sama dengan -128, nilai yang otomatis dimasukkan ke dalam kotak adalah nilai yang ada di alamat yang sama otomatis yang dikotak tidak sama. Artinya, selama rentangnya bukan [-128,127], penggunaan == akan menghasilkan false. Jika yang digunakan sama, maka hasilnya akan benar. Walaupun nilainya tidak berada pada range saat ini, namun jika digunakan Integer maka akan otomatis di unboxing, sehingga tidak akan ada masalah trap 128, sehingga proses ketujuh benar;

Mengapa jebakan 128 muncul?

Lihat kode sumber
	/**解释精简一部分后
     * 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

menjelaskan:
1. Nilai IntegerCache.low sebesar -128 dan nilai IntegerCache.high sebesar 127.
2. Dalam metode valueOf Integer, array cache disimpan, yang setara dengan cache, berkisar antara -128 hingga 127 interval tertutup.
3. Ketika nilai yang kita ambil antara [-128, 127], nilai yang dikembalikan adalah nilai yang ditentukan dalam array IntegerCache.cache, dan tidak perlu membuat objek baru.
4. Bila nilainya tidak berada dalam kisaran, maka perlu dibuat objek baru. Objek baru == adalah alamat penilaian, yang salah sama dengan nilai objek yang dinilai, yang benar;

Hal yang perlu diperhatikan saat menghadapi jebakan 128

  • Jika objek dibuat baru (seperti gambar di bawah), maka tidak akan ada 128 trap. (Ini melibatkan pembongkaran dan pengemasan otomatis, saya akan menulis pengantar di sini nanti)
    Alasannya adalah alamat memori objek yang dihasilkan baru berbeda, dan objek yang dibandingkan tidak sama.
	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
  • Saat membandingkan nilai, Anda bisa menggunakan metode sama dengan


Dokumentasi referensi:
https://blog.csdn.net/niu_8865/artikel/detail/110791911
https://blog.csdn.net/DianLanHong/artikel/detail/119617352
https://blog.csdn.net/Yangyeon_/artikel/detail/135611919