JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
一、包裝類
Java語言是一個面向?qū)ο蟮恼Z言,但是Java中的基本數(shù)據(jù)類型卻是不面向?qū)ο蟮?#xff0c;這在實際使用時存在很多的不便,為了解決這個不足,
在設(shè)計類時為每個基本數(shù)據(jù)類型設(shè)計了一個對應(yīng)的類進行代表,這樣八個和基本數(shù)據(jù)類型對應(yīng)的類統(tǒng)稱為包裝類(Wrapper Class),有些地方也翻譯為外覆類或數(shù)據(jù)類型類。
1.1、包裝類均位于Java.lang包,包裝類和基本數(shù)據(jù)類型的對應(yīng)關(guān)系如下表所示:
Primitive-Type?? Wrapper-Class
?? ??? ?byte?? ??? ??? ?Byte
?? ??? ?short?? ??? ??? Short
?? ??? ?int?? ??? ??? ??? Integer
?? ??? ?long?? ??? ??? ? Long
?? ??? ?float?? ??? ??? ? Float
?? ??? ?double?? ??? ??? ? ?? Double
?? ??? ?boolean?? ??? ??? ? Boolean
?? ??? ?char?? ??? ??? ?????????????????? ? Character
注意:在這八個類名中,除了Integer和Character類以后,其它六個類的類名和基本數(shù)據(jù)類型一致,只是類名的第一個字母大寫即可
1.2、包裝類的位置
包裝類型都是java.lang下的類,所以在使用的時候不需要導(dǎo)入包。
1.3、每種包裝類中都定義屬性和方法供其對象使用
這是從基本類型變?yōu)榘b類型最明顯的區(qū)別,現(xiàn)在指向的是對象了,可以訪問對象中的屬性和調(diào)用對象中的方法了,之前只是一個簡單的數(shù)值,沒有任何屬性和方法。
?? ??? ?例如:
?? ??? ??? ?//使用變量i不能訪問任何屬性和訪問
?? ??? ??? ?//因為變量i沒有指向?qū)ο?也不能指向?qū)ο?br />?? ??? ??? ?int i = 1;
?? ??? ??? ?
?? ??? ??? ?//查看API可知Integer類中的構(gòu)造器如果使用
?? ??? ??? ?//使用變量i可以訪問Integer類中定義的屬性和方法
?? ??? ??? ?//因為變量i指向的是對象,這是一個引用類型的變量
?? ??? ??? ?Integer i = new Integer(1);
?? ??? ??? ?或者
?? ??? ??? ?Integer i = new Integer("1");
?? ??? ??? ?注:包裝類中的屬性和方法大都是靜態(tài)的,可以使用類名直接訪問。(也有非靜態(tài)的方法,就需要使用對象調(diào)用了)
?? ??? ?
?? ??? ?例如:
?? ??? ??? ?main:
?? ??? ??? ??? ?System.out.println(Integer.MAX_VALUE);
?? ??? ??? ??? ?System.out.println(Integer.MIN_VALUE);
?? ??? ??? ??? ?System.out.println(Integer.toBinaryString(100));
1.4、常用的方法
簡單的使用:
1.5、包裝類的作用
1)作為和基本數(shù)據(jù)類型對應(yīng)的類類型存在,方便涉及到對象的操作。
?????????????? 2)包含每種基本數(shù)據(jù)類型的相關(guān)屬性如最大值、最小值等,以及相關(guān)的操作方法。
1.6、JDK1.5增加了自動拆箱裝箱的功能(低版本JDK中編譯報錯)
注:針對八種基本類型及其包裝類型,這里以int和Integer為例
?? ??? ?//自動裝箱,把字面值1包裝成Integer類型對象
?? ??? ? Integer i1 = 1;
?? ??? ?
?? ??? ?//自動拆箱,把Integer對象轉(zhuǎn)變?yōu)橐粋€簡單的int類型值
?? ??? ?int i2 = new Integer(1);
?? ?? ? ?注:
?? ??? ?? ? ?//編譯通過
?? ??? ?? ? ?Integer a = 1;
?? ??? ?? ? ?//編譯報錯
?? ??? ??? ?//1可以自動裝箱為Integer類型對象
?? ??? ?? ? ?//但是Integer和Long沒有任何關(guān)系
?? ??? ??? ?Long b = 1;
?? ??? ??? ?
?? ??? ??? ?//因為int是32位 long是64位
?? ??? ?? ? ?int --可以自動轉(zhuǎn)換為--> long
?? ??? ??? ?
?? ??? ??? ?//因為Integer和Long沒有子父類關(guān)系
?? ??? ?? ? ?Integer --不能轉(zhuǎn)換為--> Long
二、基本類型和字符串之間的轉(zhuǎn)換
在程序開發(fā)中,我們經(jīng)常需要在基本數(shù)據(jù)類型和字符串之間進行轉(zhuǎn)換。
2.1、基本類型轉(zhuǎn)換為字符串有三種方法:
1) 使用包裝類的 toString() 方法
2) 使用String類的 valueOf() 方法
3.)用一個空字符串加上基本類型,得到的就是基本類型數(shù)據(jù)對應(yīng)的字符串
2.2、將字符串轉(zhuǎn)換成基本類型有兩種方法:
1) 調(diào)用包裝類的 parseXxx 靜態(tài)方法
2.)調(diào)用包裝類的 valueOf() 方法轉(zhuǎn)換為基本類型的包裝類,會自動拆箱
三、==和equals方法的區(qū)別
? 這倆個都是對倆個變量做比較的。
?? ?1)基本類型變量的比較
?? ??? ?基本類型變量指向的不是對象,不能調(diào)用方法,所以只能使用==進行比較,并且比較的是基本類型變量的簡單數(shù)值是否相等。
?? ?
?? ?2)引用類型變量的比較
?? ??? ?引用類型變量指向的是對象,所以既可以使用==進行比較,也可以使用equals進行比較
?? ??? 區(qū)別在于:
?? ??? ??? ? equals是Object中的方法,每個對象都可以調(diào)用和其他對象比較是否相等,默認比較的是倆個引用所指向的對象內(nèi)存地址值(和==號的作用一樣),但是也可以在類中對equals方法進行重寫,按照自己的邏輯來比較倆個對象。
?? ??? ??? ==是java中的基本的操作符,是不能重寫的,倆個引用使用==進行比較,那么比較的是引用所指向的內(nèi)存地址值是否相同。
四、toString方法hashCode方法
toString和hashCode都是Object類中的方法,所以每個對象都可以直接調(diào)用。
?? ?
?? ?hashCode方法,返回該對象的哈希碼值,Object中的實現(xiàn)一般是通過將該對象的內(nèi)存地址轉(zhuǎn)換成一個整數(shù)。
?? ?toString方法,返回該對象的字符串表示。
?? ??? ?其形式為:
?? ??? ??? ?類的全限定名@hashCode方法返回值的十六進制形式
?? ??? ??? ?即:
?? ??? ??? ?o.getClass().getName() + "@" + Integer.toHexString(o.hashCode())
?? ?
?? ?例如:
?? ??? ?public class Student{
?? ??? ?
?? ??? ?}
?? ??? ?main:
?? ??? ??? ?Student s = new Student();
?? ??? ??? ?String str1 = s.toString();
?? ??? ??? ?String str2 = s.getClass().getName()+"@"+Integer.toHexString(s.hashCode());
?? ??? ??? ?System.out.println(str1);
?? ??? ??? ?System.out.println(str2);
?? ??? ?
?? ??? ?輸出結(jié)果:
?? ??? ??? ?com.briup.ch06.Student@6084fa6a
?? ??? ??? ?com.briup.ch06.Student@6084fa6a
?? ?
?? ?注:我們可以把最后的那個六十進制數(shù)字認為是這個對象的內(nèi)存地址,但是其實并不是真的地址值,而是這個對象的哈希碼值,這個哈希碼值默認又是通過對象地址值轉(zhuǎn)換過來的一個數(shù)字。(如果我們重寫了hashCode方法,那這個返回的哈希碼值就真的和對象內(nèi)存地址沒有一點關(guān)系了)
?? ?
?? ?例如:
?? ??? ?Student s = new Student();
?? ??? ?//打印引用時,默認調(diào)用其所指向?qū)ο蟮膖oString方法
?? ??? ?System.out.println(s);
?? ??? ?System.out.println(s.toString());
?? ?
?? ??? ?注:有些時候還是會有一點區(qū)別
?? ??? ?Student s = null;
?? ??? ?//打印null
?? ??? ?System.out.println(s);
?? ??? ?//運行報錯,空指針異常
?? ??? ?System.out.println(s.toString());
?
?
?
?
?? ??? ? ???
?
總結(jié)
以上是生活随笔為你收集整理的JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十分钟看懂时序数据库(III)- 压缩
- 下一篇: 004-cpu的区分