int作為java中元老級的數據類型,可謂無處不在,自從jdk5誕生了Integer,從此不在孤單。
為什麼要設計Integer呢?它與int有什麼區別?
一、Integer是int的包裝類型,是引用類型,int是值類型。
衍生出來的特點就是:
(1)Integer比較時比較地址,int比較時比較值,Integer與int比較又如何呢?留個疑問,下面再論。
(2)以對象的屬性存在時,Integer初始默認值為null,int為0;在方法作用域內,變量是要手動進行初始化滴,若只聲明,在後面使用的時候編譯器是通不過的。
二、出於數據轉換的考慮
Integer提供了兩種方法,parseInt和valueOf,看下面:
String s = "1"
int a = Integer.parseInt(s)
Integer b = Integer.valueOf(s)
Integer c = Integer.valueOf(1)
1)parseInt接收String類型的入參,返回int
2)valueOf接收String和int類型的入參,返回Integer
ps:當然,你這樣寫也是成立的:int d = Integer.valueOf(s),編譯器進行了隱式拆箱,將Integer轉化為了int。
三、比較
1、int與Integer
int a = 1;
Integer b = 1;
a==b為true,b先進性拆箱,與a比較的是值
2、 Integer與Integer
Integer a = new Integer(1)
Integer b = 1
Integer c = 1
a==b? false
解:a存在於內存堆中,b存在於常量池中,地址不同。任何new都會產生新的對象;Integer b = 1進行了隱式的裝箱(調用了valueOf方法)
b==c? true
解:在內存中,會有一塊叫做常量池的區域,專門存放b和c這種形式定義的對象,初始化時會先去常量池中尋找1,若已經存在,直接指向1,若不存在,生成對象1放入常量池。
再看這個:
Integer d = 128
Integer e = 128
d==e?false
為什麼這個不適合上面的常量池說法了呢?原因在於常量池指定了數值范圍:-128~127。
超過了這個范圍,就會生成新的對象。
3、比較兩個Integer的值
Integer a = new Integer(1)
Integer b = new Integer(2)
可以這樣:a.intValue() == b.intValue() 或者 a.equals(b)
四、獲取最大值和最小值如此簡單
int a = Integer.MAX_VALUE; 2^31-1
int b = Integer.MIN_VALUE; -2^31
五、使用場景的限制
1)很多方法參數就只接收對象類型
2)泛型只支持對象類型
3)考慮到數據庫設計中某些數值列可以為null,持久話對象中使用引用類型,可接收null值
關注老姜談技術,微信號:helojava,或者掃描下面二維碼。
每日一帖,技術雞湯。