


Cara menggunakan tinju automatik Java, nyah kotak automatik dan cache Integer
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.
