一、泛型的基本介紹
泛型是程序設計語言的一種特性。允許程序員在強類型程序設計語言中編寫代碼時定義一些可變部分,那些部分在使用前必須作出指明。各種程序設計語言和其編譯器、運行環境對泛型的支持均不一樣。將類型參數化以達到代碼複用提高軟件開發工作效率的一種數據類型。泛型類是引用類型,是堆對象,主要是引入了類型參數這個概念。
二、list的非泛型操作(沒有指定類型的list)(不常用)
在沒有指定類型的情況下,list默認的類型爲Object類型
首先,我們看下下面這段簡短的代碼:
public class GenericTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i); // 1
System.out.println("name:" + name);
}
}
}
定義了一個List類型的集合,先向其中加入了兩個字符串類型的值,隨後加入一個Integer類型的值。在之後的循環中,由於忘記了之前在list中也加入了Integer類型的值或其他編碼原因,很容易出現類似於//1中的錯誤。因爲編譯階段正常,而運行時會出現“java.lang.ClassCastException”異常。因此,導致此類錯誤編碼過程中不易發現。
在如上的編碼過程中,我們發現主要存在兩個問題:
1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然爲其本身類型。
2.因此,//1處取出集合元素時需要人爲的強制類型轉化到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。
那麼有沒有什麼辦法可以使集合能夠記住集合內元素各類型,且能夠達到只要編譯時不出現問題,運行時就不會出現“java.lang.ClassCastException”異常呢?答案就是使用我們接下來要講的list泛型操作,這也是最常用的操作。
三、list的泛型操作(重點常用)
1. list泛型的基本理解
與上述非泛型對比採用泛型寫法後,在//1處想加入一個Integer類型的對象時會出現編譯錯誤,通過List,直接限定了list集合中只能含有String類型的元素,從而在//2處無須進行強制類型轉換,因爲此時,集合能夠記住元素的類型信息,編譯器已經能夠確認它是String類型了。
public class GenericTest {
public static void main(String[] args) {
/*
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
*/
List<String> list = new ArrayList<String>();
list.add("qqyumidi");
list.add("corn");
//list.add(100); // 1 提示編譯錯誤
for (int i = 0; i < list.size(); i++) {
String name = list.get(i); // 2
System.out.println("name:" + name);
}
}
}
2 list泛型的具體操作
(1).list中添加,獲取,刪除元素;
添加方法是:.add(e); 獲取方法是:.get(index); 刪除方法是:.remove(index); 按照索引刪除; .remove(Object o); 按照元素內容刪除;
List<String> person=new ArrayList<>();
person.add("jackie");
person.add("peter");
person.add("annie");
person.add("martin");
person.add("marry");
person.remove(3); //.remove(index)
person.remove("marry"); //.remove(Object o)
String per="";
per=person.get(1);
System.out.println(per);
for (int i = 0; i < person.size(); i++) {
System.out.println(person.get(i));
}
(2).list中根據索引將元素數值改變(替換);
注意 .set(index, element); 和 .add(index, element); 的不同;
String a="白龍馬", b="沙和尚", c="八戒", d="唐僧", e="悟空";
List<String> people=new ArrayList<>();
people.add(a);
people.add(b);
people.add(c);
people.set(0,d); //.set(index,element);
people.add(1,e); //.add(index,element)
//增強for循環遍歷list
for(String str:people){
System.out.println(str);
}
(3).判斷list是否爲空;
//空則返回true,非空則返回false
if (person.isEmpty()) {
System.out.println("空的");
}else {
System.out.println("不是空的");
}
3 遍歷List集合的三種方法
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
(1)超級for循環遍歷
for(String attribute : list) {
System.out.println(attribute);
}
(2)對於ArrayList來說速度比較快, 用for循環, 以size爲條件遍歷:
for(int i = 0 ; i < list.size() ; i++) {
system.out.println(list.get(i));
}
(3)集合類的通用遍歷方式, 從很早的版本就有, 用迭代器迭代
Iterator it = list.iterator();
while(it.hasNext()) {
System.ou.println(it.next);
}
四、java中List集合使用泛型與不使用泛型有什麼區別?
例如:List lists=new ArrayList();和List lists=new ArrayList();他們兩者有什麼樣區別?
從list中取出的值不一樣,第一種的話取出來是object類型的,需要強制類型轉換,而第二個不用,取出來之後直接就是string類型的
以上就是list的具體操作,下一篇文章會給你講list的練習題
參考文章:
https://www.cnblogs.com/lwbqqyumidi/p/3837629.html
https://www.cnblogs.com/duzhuo/p/5648026.html
https://www.cnblogs.com/lzq198754/p/5774593.html