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