java學習 裝箱與拆箱 泛型

2021-08-08 19:10:11 字數 2828 閱讀 8066

把基本資料型別賦給對應的包裝類。

比如:把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是無法區分兩個異常型別myexceptionmyexception的。對於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.泛型 以型別作為引數的類就叫范型 作用 提高程式健壯性 簡化 范型的...