包裝類是什么呢?
它是一個類叔遂,內(nèi)部有一個實例變量他炊,保存對應(yīng)的基本類型的值, 這個類一般還有一些靜態(tài)方法已艰、靜態(tài)變量和實例方法痊末,以方便對數(shù)據(jù)進行操作。
-
八種基本類型哩掺,對應(yīng)的包裝類
image.png
基本類型和包裝類
- 裝箱
將基本類型轉(zhuǎn)換為包裝類的過程
- 拆箱
將包裝類型轉(zhuǎn)換為基本類型的過程
自動裝箱和拆箱
Java 1.5
以后引入凿叠,可以直接將基本類型賦值給引用類型,反之亦可
Integer a = 100;
int b = a;
Integer a = Integer.valueOf(100);
int b = a.intValue();
自動裝箱/拆箱是Java編譯器提供的能力嚼吞,背后盒件,它會替換為調(diào)用對應(yīng)的valueOf()/xxxValue()
可以通過new創(chuàng)建
Integer a = new Integer(100);
Boolean b = new Boolean(true);
Double d = new Double(12.345);
Character c = new Character('馬');
那到底應(yīng)該用靜態(tài)的valueOf方法,還是使用new呢舱禽?
般建議使用valueOf
new每次都會創(chuàng)建一個新對象炒刁,而除了Float和Double外的其他包裝類, 都會緩存包裝類對象誊稚,減少需要創(chuàng)建對象的次數(shù)翔始,節(jié)省空間,提升性能
重寫Object方法
- equals
equals用于判斷當前對象和參數(shù)傳入的對象是否相同里伯,Object類的默認實現(xiàn)是比較址城瞎, 對于兩個變量,只有這兩個變量指向同一個對象時疾瓮,equals才返回true脖镀,它和比較運算符(==)的結(jié)果是一樣的。
equals應(yīng)該反映的是對象間的邏輯相等關(guān)系
Long
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
Float
public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
Float有一個靜態(tài)方法floatToIntBits()狼电,將float的二進制表示看做int认然。 需要注意的是补憾,只有兩個float的二進制表示完全一樣的時候,equals才會返回true
Double的equals方法與Float類似卷员,它有一個靜態(tài)方法doubleToLongBits盈匾,將double的二進制表示看做long,然后再按long比較,數(shù)值不精確
- hashCode
hashCode返回一個對象的哈希值毕骡,哈希值是一個int類型的數(shù)削饵,由對象中一般不變的屬性映射得來,用于快速對對象進行區(qū)分未巫、分組等窿撬。一個對象的哈希值不能變,相同對象的哈希值必須一樣叙凡。不同對象的哈希值一般應(yīng)不同劈伴,但這不是必須的,可以有不同對象但哈希值相同的情況握爷。
hashCode和equals方法聯(lián)系密切跛璧,對兩個對象,如果equals方法返回true新啼,則hashCode也必須一樣追城。反之不要求
子類重寫equals時,也必須重寫hashCode
之所以有這個約定燥撞,是因為Java API中很多類依賴于這個行為座柱,尤其是集合中的一些類
Byte, Short, Integer, Character,hashCode就是其內(nèi)部值
public int hashCode() {
return (int)value;
}
Boolean
public int hashCode() {
return value ? 1231 : 1237;
}
Long
public int hashCode() {
return (int)(value ^ (value >>> 32));
}
是高32位與低32位進行位異或操作
Float
public int hashCode() {
return floatToIntBits(value);
}
Double
public int hashCode() {
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
- toString
每個包裝類也都重寫了toString方法物舒,返回對象的字符串表示 - Comparable
個包裝類也都實現(xiàn)了Java API中的Comparable接口
public interface Comparable<T> {
public int compareTo(T o);
}
<T>是泛型語法色洞,我們后續(xù)文章介紹,T表示比較的類型冠胯,由實現(xiàn)接口的類傳入锋玲。 接口只有一個方法compareTo,當前對象與參數(shù)對象進行比較涵叮,在小于、等于伞插、大于參數(shù)時割粮,應(yīng)分別返回-1,0媚污,1
對于Float和Double舀瓢,存在和equals一樣的問題,0.01和0.10.1相比的結(jié)果并不為0*
- 包裝類和String
除了toString方法外耗美,包裝類還有一些其他與String相關(guān)的方法
System.out.println(Integer.toBinaryString(12345)); //輸出2進制
System.out.println(Integer.toHexString(12345)); //輸出16進制
System.out.println(Integer.parseInt("3039", 16)); //按16進制解析
11000000111001
3039
12345
常用常量
Boolean類型
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false)
Integer
public static final int MIN_VALUE = 0x80000000;
public static final int MAX_VALUE = 0x7fffffff;
Float和Double
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
public static final double NaN = 0.0d / 0.0;
Number
六種數(shù)值類型包裝類有一個共同的父類Number
抽象類
方法
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
不可變性
包裝類都是不可變類
這是通過如下方式強制實現(xiàn)的:
所有包裝類都聲明為了final京髓,不能被繼承
內(nèi)部基本類型值是私有的航缀,且聲明為了final
沒有定義setter方法
不可變使得程序可以更為簡單安全,因為不用操心數(shù)據(jù)被意外改寫的可能了堰怨,可以安全的共享數(shù)據(jù)芥玉,尤其是在多線程的環(huán)境下