int轉integer
int i = 0;
integer轉int
jdk1.5以後的int轉integer
int i = 0;還有其他方法?
jdk1.5為integer增加了乙個全新的方法:
public static integer valueof(int i)以下**在jdk1.5的環境下可以編譯通過並執行。
int i = 0;
此方法與new integer(i)的不同處在於:
方法一呼叫類方法返回乙個表示指定的 int 值的 integer 例項。
方法二產生乙個新的integer物件。
jdk api文件中對這個新的valueof方法有明確的解釋:
如果不需要新的 integer 例項,則通常應優先使用該方法,而不是構造方法 integer(int),因為該方法有可能通過快取經常請求的值而顯著提高空間和時間效能。
但這個解釋有點晦澀難懂。為什麼該方法有可能通過快取經常請求的值而顯著提高效能?
通過反編譯工具檢視valueof方法。
/*可以看到對於範圍在-128到127的整數,valueof方法做了特殊處理。* 返回乙個表示指定的 int 值的 integer 例項。如果不需要新的 integer 例項,則
* 通常應優先使用該方法,而不是構造方法 integer(int),因為該方法有可能通過
* 快取經常請求的值而顯著提高空間和時間效能。
* @param i anintvalue.
* @return a integer instance representing i.
* @since 1.5
*/
public static integer valueof(int i)
return new integer(i);
}
採用integercache.cache[i + offset]這個方法。
從名字,我們可以猜出這是某種快取機制。
進一步跟蹤integercache這個類,此類**如下
/*
* integercache內部類
* 其中cache陣列用於存放從-128到127一共256個整數
*/
private static class integercache
static final integer cache = new integer[-(-128) + 127 + 1];
static
}
這就是valueof方法真正的優化方法,當-128=127 或 i<-128 時,返回的是integer類物件。
再舉乙個經常被提到的例子
integer i=100;
integer j=100;
//print true
system.out.println(i==j);
此時的 i=integercache.cache[i + 128] = integercache.cache[228],
同樣j = integercache.cache[j + 128] = intgercache.cache[228]
因此 integer引用i中儲存的是cache陣列第228號元素的位址。同理j也是同乙個cache陣列的第228號元素的位址(因為cache是integer的static陣列,只有乙個)。
i==j比較的是引用位址,因此返回true。
integer i=200;
integer j=200;
//print false
system.out.println(i==j);
此時的 i=new integer(200); 同樣j=new integer(200) 。
兩次都在堆中開闢了integer的物件。
i 和 j 中儲存的堆的物件位址是完全不同的。i==j 自然返回false。
引入快取機制的作用何在?
接著上面的例子,假如我們在程式設計時大量需要值為100(100的範圍在-128到127之間)的integer物件。如果只能通過new來建立,需要在堆中開闢大量值一樣的integer物件。
這是相當不划算的,integercache.cache很好的起到了快取的作用。
當我們需要integer i = 100的時候,直接從cache中取出第[100+128]號元素的位址賦值給引用i,再次需要integer j = 100時,還是直接去這個位址賦值給j。是不是省去了在堆中不停的建立物件的代價了(空間,時間上的消耗都很大)。 這就是valueof方法真正的提高效能之處。
正如jdk api文件對valueof(int i)方法的描述,該方法有可能通過快取經常請求的值而顯著提高空間和時間效能。
結論 valueof(int i)的優化只針對於範圍在-128到127的整數。
jdk1.5以後的integer轉int
由於unboxing的存在,以下**在jdk1.5的環境下可以編譯通過並執行。
附:autoboxing與unboxing帶來的轉變
在jdk1.5之前,我們總是對集合不能存放基本型別而耿耿於懷。
以下**在jdk1.5中成為了可能,試想下在jdk1.5之前該如何實現這段**?
int x = 1;
collection collection = new arraylist();
collection.add(x);//autoboxing,自動轉換成integer.
integer y = new integer(2);
collection.add(y + 2); //y + 2為unboxing,自動轉換成int。之後再次轉換為integer。
map map = new hashmap();
int x = 1;
integer y = new integer(2);
int z = 3;
map.put(x,y + z);//x自動轉換成integer。y+z自動轉換成int。之後再次轉換為integer。
Java之Integer與int比較
先看 integer a new integer 1 integer a2 new integer 1 integer c 1 integer c2 1 int d 1 integer e 128 integer e1 128 system.out.println a a2 false system...
java之Integer知識整理
最近本人在看jdk源 的時候很有感觸,感嘆 是如此的精煉。就好比說這個最容易被忽視的integer。integer是對int 型別的封裝,這點大家都知道。今天我嘗試來分析其部分本人認為比較有意思的源 public static int highestonebit int i 解析 因為int型別是4...
對java中int與Integer的一些理解
integer與integer間的比較,從jdk1.5開始,有 自動裝箱 這麼乙個機制,在byte 128到127範圍內 ps整型的八位二進位制的表示的範圍為 128到127 如果存在了乙個值,再建立相同值的時候就不會重新建立,而是引用原來那個,但是超過byte範圍還是會新建的物件。綜上,i i1為...