Κοινή χρήση τεχνολογίας

Java 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. Εάν χρησιμοποιηθεί το ίσο, το αποτέλεσμα θα είναι αληθές. Παρόλο που η τιμή δεν βρίσκεται στο τρέχον εύρος, εάν χρησιμοποιηθεί Ακέραιος, θα αφαιρεθεί αυτόματα το πλαίσιο, επομένως δεν θα υπάρχει πρόβλημα παγίδας 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. (Αυτό περιλαμβάνει αυτόματη αποσυσκευασία και συσκευασία, θα γράψω μια εισαγωγή εδώ αργότερα)
    Ο λόγος είναι ότι οι διευθύνσεις μνήμης των αντικειμένων που παράγονται από το νέο είναι διαφορετικές και τα αντικείμενα που συγκρίνονται δεν είναι τα ίδια.
	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