把基本資料型別賦給對應的包裝類。
比如:把int賦值給integer,對他的操作就需要用它的方法了。
是值型別轉換為引用型別的過程。
把乙個包裝類賦給基本資料型別。
由引用型別轉換為值型別的過程。
integer i = 1;//裝箱
int j = i;//拆箱
//典型應用
list list = new arraylist();
list.add(1);//裝箱
list.add(new integer(1));//沒有引入裝箱概念之前
iterator it = list.iterator();
while (it.hasnext())
裝箱時,生成的是全新的引用物件,這會有時間損耗,效率降低。
在**中應避免裝箱和拆箱的操作。
可以使用泛型來減少這樣的操作。
變數將引用(或「指向」)原始值。不建立任何副本。引用型別包括類、介面、委託和裝箱值型別。
只複製變數的值。也就是基本資料型別(四類八種)
四類:整型、浮點型、字元型、邏輯型。
用於解決安全問題,是乙個安全機制。
在編譯的時候檢查型別安全,確保只能把正確型別的物件放入集合中;消除強制型別轉換。
優點:a.將執行時期出現問題classcastexception,轉移到了編譯時期。便於解決問題,讓執行時間減少,安全。
b.避免了強制轉換(顯式轉換)。
缺點:在效能上不如陣列快。
list.add("abc");//插入字串
integer num = (integer)list.get(0);//執行時會出錯,但編碼時發現不了
泛型執行程式設計師在編寫集合**時,限制集合的處理型別,從而在程式編譯時就發現問題。如:
list.add("abc");//插入字串
string s = list.get(0);//取出的依然是string,安全
public t geta(t a)
泛型類中,泛型只作用在非靜態成員,靜態成員需要單獨宣告泛型。
使用注意:
1,泛型型別必須是引用型別
2,<> 念 typeof,表示處理的型別
public class requestdatabean
使用的時候,requestdatabean
,就可以為data使用不同的型別。
所以在建立泛型物件時請指明型別,讓編譯器盡早的做引數檢查,而不是讓jvm執行時丟擲類不匹配的異常。
不要忽略編譯器的警告資訊,那意味著潛在的classcastexception等著你。
所有泛型類的型別引數在編譯時都會被擦除,處理成普通類和普通方法。
在編譯階段,所有泛型類的型別引數都會被object或者它們的限定邊界來替換。(型別擦除)
比如並不存在list.class
或是list.class
,而只有list.class。
如下**編譯時通不過:
list list = new list;
在這裡可以宣告乙個帶有泛型引數的陣列,但是不能初始化該陣列,因為執行了型別擦除操作後,list 與 list 就是同一回事了,編譯器拒絕如此宣告。
以下**不能通過編譯,原因一樣,泛型型別被擦除了。
listlist = new arraylist();
system.out.println(list instanceof list)
對於宣告為myclass
的類,訪問其中的靜態變數的方法仍然是 myclass.mystaticvar。
不管是通過new myclass
還是new myclass
建立的物件,都是共享乙個靜態變數。
因為異常處理是由jvm在執行時刻來進行的。
由於型別資訊被擦除,jvm是無法區分兩個異常型別myexception
和myexception
的。對於jvm來說,它們都是 myexception型別的。也就無法執行與異常對應的catch語句。
是upper bound(上限) 的萬用字元,用來限制元素的型別的上限。表示元素型別上限為e型別。
<?>是<? extends object>的簡寫
list<? extends fruit> fruits;
fruits = new arraylist();
fruits = new arraylist();//編譯不通過(有上限限制)
不能寫入,因為不知道fruits具體是什麼型別,為了型別安全,編譯器只能阻止新增元素了。
fruits.add(new fruit());//編譯不通過
無論fruits指向什麼,編譯器都可以確定獲取的元素是fruit型別,所有讀取集合中的元素是允許的。
fruit fruit = fruits.get(0);//編譯通過
是 lower bound(下限) 的萬用字元 ,用來限制元素的型別下限。
生產者(producer)使用extends,消費者(consumer)使用super。
如果你需要乙個提供e型別元素的集合,使用泛型萬用字元<? extends e>。它好比乙個生產者,可以提供資料。
如果你需要乙個只能裝入e型別元素的集合,使用泛型萬用字元<? super e>。它好比乙個消費者,可以消費你提供的資料。
既要儲存又要讀取,那就別使用泛型萬用字元。
C 裝箱 拆箱 泛型
1 裝箱 值型別轉引用型別。開闢一塊記憶體空間進行存放資料。2 拆箱 引用型別轉值型別。值型別存放在棧上,引用型別存放在堆上。裝箱需要消耗記憶體,所以引出了泛型。泛型 1.使用非泛型集合時引發的裝箱和拆箱操作 看下面的一段 1 2 3 4 5 6 7 8 vararray newarraylist ...
從裝箱拆箱看泛型
net很容易把值型別轉換為引用型別,所以可以在需要物件的任意地方使用值型別。例如int可以賦予乙個物件,從值型別轉換為引用型別稱為裝箱。如果方法需要把乙個物件作為引數,同時傳遞乙個值型別,裝箱操作就會自動進行。另一方面,裝箱的值型別可以使用拆箱操作轉換為值型別。定義乙個一般的 非泛型的簡化鍊錶類,它...
List集合優化 泛型 拆箱與裝箱
1.list集合 vector 執行緒同步 執行緒安全 增刪改查都慢 arraylist 允許速度較快,因為沒有使用執行緒 連續資料空間儲存資料,查詢快 下標 增刪慢 llinkedlist 以鍊錶結構儲存資料 查詢慢 增刪快 2.泛型 以型別作為引數的類就叫范型 作用 提高程式健壯性 簡化 范型的...