Rumah  >  Artikel  >  Java  >  Cara menggunakan tinju automatik Java, nyah kotak automatik dan cache Integer

Cara menggunakan tinju automatik Java, nyah kotak automatik dan cache Integer

WBOY
WBOYke hadapan
2023-04-24 22:28:121594semak imbas

1. Pengenalan

Apakah auto-tinju dan auto-nyahkotak? Apakah cache Integer? Apakah hubungan antara mereka?

Mari kita lihat soalan dahulu.

Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a==b);
Integer c = 1;
Integer d = 1;
System.out.println(c==d);
Integer e = 128;
Integer f = 128;
System.out.println(e==f);

Jawab dulu, tengok jawapan kemudian.

Jawapannya palsu benar salah, adakah anda betul?

Sekarang satu bahagian telah muncul, mari kita berkongsi mata pengetahuan bersama

2 Kelas pembungkusan

Terdapat lapan jenis data asas di Jawa, yang boleh dibahagikan kepada tiga. kategori:

  • Jenis aksara: char

  • Jenis Boolean: boolean

  • Jenis angka: bait short int long float double

Kelas pembalut membungkus lapan jenis data asas ke dalam kelas supaya mereka boleh menggunakan tiga ciri utama Java: enkapsulasi, pewarisan dan polimorfisme. Hubungan yang sepadan adalah seperti berikut:

基本数据类型 对应的包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character

Enam kelas pembungkusan yang sepadan dengan jenis berangka semuanya diwarisi daripada kelas Nombor.

3. Tinju automatik dan nyahkotak automatik

Lapan jenis data asas sepadan dengan lapan kelas pembungkusan, jadi bagaimana ia melakukan penukaran data?

//基本数据类型转包装类
//1.有参构造
Integer a = new Integer(1);
//2.实际上,有参构造的参数也可以是字符串,不过要使用正确的数据,“123abc”不可能会转换为Integer类型
Integer b = new Integer("123");
//3.valueOf()
Integer c = Integer.valueOf(123);
//包装类转基本数据类型(xxxValue()  float是floatValue() double是doubleValue())
int d = a.intValue();

Borang di atas agak konsisten dengan kognisi Untuk mendapatkan objek, anda boleh menggunakan kaedah baharu atau memanggil kaedah tertentu Untuk mendapatkan nilai, panggil atribut tertentu objek.

Selepas Java 5.0, anda tidak perlu terlalu menyusahkan ciri-ciri baharu tinju automatik dan penyahkotak automatik telah ditambah, sebenarnya, kedua-dua konsep itu sangat mudah difahami.

int a = 10;
Integer b = a;  //自动装箱
int c = b;  //自动拆箱

Pada pandangan pertama, bentuk objek = nilai berangka tidak menepati kognisi, tetapi ia boleh direalisasikan dengan bantuan tinju automatik dan unboxing automatik. Malah, pengkompil masih melaksanakannya dengan bantuan valueOf() dan xxxValue().

Mari kita lihat kod sumber valueOf().

/**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

valueOf() tidak hanya mengembalikan objek Integer, tetapi mula-mula membuat pertimbangan Jika data input sepadan dengan julat tertentu, objek tertentu akan dikembalikan daripada ulasan, Julat ini menjadi lalai [-128,127], dan mungkin julat yang lebih besar jika ia melebihi julat ini, objek baharu akan dikembalikan. Data IntegerCache yang digunakan ialah cache Integer.

4. Cache Interger

Pengiraan berangka kerap digunakan dalam kehidupan seharian Jika anda terus mendapat objek Integer baharu, overhead akan menjadi sangat besar secara automatik apabila melaksanakan program. Tatasusunan statik digunakan sebagai cache Julat tatasusunan cache lalai yang sepadan dengan Integer ialah [-128,127].

Lihat kod sumber IntegerCache.

/**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */
private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];
    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }
    private IntegerCache() {}
}

Seperti yang anda lihat, IntegerCache ialah kelas dalaman statik IntegerCache.cache yang dipanggil oleh valueOf() ialah objek tatasusunan bergantung pada nilai maksimum dan minimum dalam julat. Lalai ialah [-128, 127], sudah tentu (komen mengatakan) julat ini juga boleh diubah suai melalui JVM (saya tidak faham ini). Kemudian setiap elemen dalam tatasusunan akan diberikan objek Integer, dan cache akan terbentuk.

Terdapat cache tatasusunan, yang bermaksud bahawa jika nilai berada dalam [-128,127], objek Integer yang dibuat menggunakan valueOf() atau tinju automatik dikeluarkan daripada tatasusunan, jadi alamat memori ditunjuk oleh objeknya adalah sama. Jika anda menggunakan baharu atau melebihi julat ini, objek mesti dibuat semula.

Sudah tentu, bukan sahaja Integer mempunyai mekanisme caching, Byte, Short, Long, dan Character semuanya mempunyai mekanisme caching. Julat Bait, Pendek, Integer dan Panjang ialah -128 hingga 127, dan julat Aksara ialah 0 hingga 127.

5. Jawab soalan

Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a==b);
Integer c = 1;
Integer d = 1;
System.out.println(c==d);
Integer e = 128;
Integer f = 128;
System.out.println(e==f);

1 Walaupun kedua-dua objek yang dicipta oleh yang baru mempunyai nilai yang sama, ia menunjuk ke alamat memori yang berbeza menggunakan == untuk perbandingan mengembalikan palsu

2. Mekanisme tinju dan caching automatik, kedua-dua objek itu sebenarnya sama, hasil pulangan adalah benar

3 Di luar julat cache, objek baru akan menjadi baharu semasa pelaksanaan, kedua-duanya objek berbeza , hasil pulangan adalah palsu

Atas ialah kandungan terperinci Cara menggunakan tinju automatik Java, nyah kotak automatik dan cache Integer. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam