深入理解java中的自动装箱与拆箱
一、什么是装箱,什么是拆箱
装箱:把基本数据类型转换为包装类。
拆箱:把包装类转换为基本数据类型。
基本数据类型所对应的包装类:
int(几个字节4)- Integer
byte(1)- Byte
short(2)- Short
long(8)- Long
float(4)- Float
double(8)- Double
char(2)- Character
boolean(未定义)- Boolean
免费在线视频学习教程推荐:java视频教程
二、先来看看手动装箱和手动拆箱
例子:拿int和Integer举例
Integer i1=Integer.valueOf(3); int i2=i1.intValue();
手动装箱是通过valueOf完成的,大家都知道 = 右边值赋给左边,3是一个int类型的,赋给左边就变成了Integer包装类。
手动拆箱是通过intValue()完成的,通过代码可以看到 i1 从Integer变成了int
三、手动看完了,来看自动的
为了减轻技术人员的工作,java从jdk1.5之后变为了自动装箱与拆箱,还拿上面那个举例:
手动:
Integer i1=Integer.valueOf(3); int i2=i1.intValue();
自动
Integer i1=3; int i2=i1;
这是已经默认自动装好和拆好了。
四、从几道题目中加深对自动装箱和拆箱的理解
(1)
Integer a = 100; int b = 100; System.out.println(a==b);结果为 true
原因:a 会自动拆箱和 b 进行比较,所以为 true
(2)
Integer a = 100; Integer b = 100; System.out.println(a==b);//结果为true Integer a = 200; Integer b = 200; System.out.println(a==b);//结果为false
这就发生一个有意思的事了,为什么两个变量一样的,只有值不一样的一个是true,一个是false。
原因:这种情况就要说一下 == 这个比较符号了,== 比较的内存地址,也就是new 出来的对象的内存地址,看到这你们可能会问这好像没有new啊,但其实Integer a=200; 200前面是默认有 new Integer的,所用内存地址不一样 == 比较的就是 false了,但100为什么是true呢?这是因为 java中的常量池 我们可以点开 Integer的源码看看。
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; }
在对 -128到127 之间的进行比较时,不会new 对象,而是直接到常量池中获取,所以100是true,200超过了这个范围然后进行了 new 的操作,所以内存地址是不同的。
(3)
Integer a = new Integer(100); Integer b = 100; System.out.println(a==b); //结果为false
这跟上面那个100的差不多啊,从常量池中拿,为什么是false呢?
原因:new Integer(100)的原因,100虽然可以在常量池中拿,但架不住你直接给new 了一个对象啊,所用这俩内存地址是不同的。
(4)
Integer a = 100; Integer b= 100; System.out.println(a == b); //结果true a = 200; b = 200; System.out.println(c == d); //结果为false
原因:= 号 右边值赋给左边a,b已经是包装类了,200不在常量池中,把int 类型200 赋给包装类,自动装箱又因为不在常量池中所以默认 new了对象,所以结果为false。
更多相关文章教程可以访问:java语言入门
Atas ialah kandungan terperinci 深入理解java中的自动装箱与拆箱. 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

AI Hentai Generator
Menjana ai hentai secara percuma.

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 untuk Square Root di Java. Di sini kita membincangkan cara Square Root berfungsi di Java dengan contoh dan pelaksanaan kodnya masing-masing.

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

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Nombor Armstrong di Jawa. Di sini kita membincangkan pengenalan kepada nombor Armstrong di java bersama-sama dengan beberapa 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
