想學(xué)網(wǎng)站建設(shè)開發(fā)代運(yùn)營一般收費(fèi)
目錄
一、泛型
1、概述
2、通配符?
3、有界類型
二、集合
1、概述
2、迭代器接口
三、集合類
1、Collection接口
2、List接口
3、Set接口
4、Queue接口
5、Map接口?
四、集合轉(zhuǎn)換?
五、集合工具類
一、泛型
1、概述
? ? ? ? 從JDK5.0開始,Java引入泛型類型,將數(shù)據(jù)類型實(shí)現(xiàn)參數(shù)化,提高代碼了重用性,使得程序更加靈活、安全和簡潔。
? ? ? ? 泛型可以被使用于類、接口、方法的定義中,實(shí)現(xiàn)泛型類、泛型接口、泛型方法。
? ? ? ? 泛型類的一般定義方法,以及實(shí)現(xiàn)實(shí)例化對象,可以參考C++的泛型使用方法。
? ? ? ? 下面給出一個(gè)實(shí)例:
//創(chuàng)建泛型類
public class Generic <T>{private T data;public Generic(T data){this.data=data;}public void show(){System.out.println("數(shù)據(jù)類型為:"+data.getClass().getName());System.out.println("數(shù)據(jù)為:"+this.data);}
}
//主函數(shù)
public class Demo {public static void main(String[]args){Generic<String> s=new Generic<String>("張三"); //創(chuàng)建實(shí)例,實(shí)例化類型為StringGeneric<Integer> i=new Generic<Integer>(123); //創(chuàng)建實(shí)例,實(shí)例化類型為Integers.show();i.show();}
}
輸出:
????????數(shù)據(jù)類型為:java.lang.String????????數(shù)據(jù)為:張三
????????數(shù)據(jù)類型為:java.lang.Integer
????????數(shù)據(jù)為:123
2、通配符?
? ? ? ? 當(dāng)使用一個(gè)泛型類時(shí),應(yīng)該為泛型類傳入一個(gè)實(shí)參,否則會(huì)提出泛型警告,但如果在定義一個(gè)方法時(shí),無法確定泛型實(shí)例化變量類型,那么需要使用通配符“?”來表示一個(gè)未知類型,從而解決不能動(dòng)態(tài)選擇實(shí)例的缺點(diǎn)。
? ? ? ? 緊接著上一個(gè)實(shí)例,添加這樣一個(gè)方法:
public static void showtype(Generic <?> g)
{g.show();
}
? ? ? ? 主函數(shù)使用showtype(i)和showtpe(s)同樣可以達(dá)到i.show(),s.show()的作用,這也是多態(tài)的另一種體現(xiàn)。
3、有界類型
? ? ? ? 有界類型分為兩種:extends,super,一般用來在泛型的尖括號(hào)<>中指代聲明類型的上界和下界。
? ? ? ? 在泛型類中使用:
public class Generic <T extends Math>? ? //指定T類型的上界為Math
public class Generic?<T super String>? ? ? ?//指定T類型的下界為String
? ? ? ? 在泛型方法中使用:
public class Generic <? extends Math>{?????????//指定T類型的上界為Math
? ? ? ? ? ? ? //方法體...
}? ?
public class Generic?<? super String>?{? ? ? ? ? //指定T類型的下界為String
? ? ? ? ? ? ? //方法體...
}
二、集合
1、概述
? ? ? ? Java中的集合類類似于C++中的STL,用于實(shí)現(xiàn)一些常見的數(shù)據(jù)結(jié)構(gòu)。Java的集合類主要由兩個(gè)接口派生出來:Collection和Map
? ? ? ? Collection集合體系下有三個(gè)接口,Set(無序,不可重復(fù)的集合)、List(有序、可以重復(fù)的集合)、Queue集合(隊(duì)列集合)
? ? ? ? Map集合用于保存具有映射關(guān)系的數(shù)據(jù),由Key-Value鍵值對組成,key用于標(biāo)識(shí)集合中的每項(xiàng)數(shù)據(jù),所以不可重復(fù)。
2、迭代器接口
? ? ? ? 迭代器可以采用統(tǒng)一方式,對Collection集合中的元素進(jìn)行遍歷操作,由于Iterable接口是Collection接口的父接口,所以迭代器的集合類可迭代的,都支持foreach循環(huán)遍歷。
? ? ? ? Iterator接口中的方法:
boolean hasNext() | 判斷是否有下一個(gè)可訪問的元素 |
E next() | 返回可訪問的下一個(gè)元素 |
? ? ? ? 迭代器接口實(shí)現(xiàn):
import java.util.ArrayList;
import java.util.Iterator;
public class test {public static void main(String[] args){ArrayList<String>list=new ArrayList<>();list.add("apple");list.add("banana");list.add("pear");Iterator<String> iterator=list.iterator(); //通過泛型對象調(diào)用iterator()方法while(iterator.hasNext()) //for each遍歷{System.out.println(iterator.next());}}
}
三、集合類
1、Collection接口
? ? ? ? Collection接口作為Set、Queue、List接口的父接口,本身沒有提供獲取某個(gè)元素的方法,但可以通過iterator()方法來遍歷集合中所有元素。
? ? ? ? 對于產(chǎn)生的異常:不建議將同一個(gè)集合Collection中存儲(chǔ)不同類型的對象,不要將不兼容的對象添加進(jìn)集合中,另外在執(zhí)行add、remove這類指令時(shí)也容易引發(fā)異常。
? ? ? ? 一般來說在集合類的使用中不推薦使用Collection類。
2、List接口
? ? ? ? List是Collection接口的子接口,用于存放有序、可重復(fù)的集合。
? ? ? ? List接口的常用方法:
?????????在List接口中有兩個(gè)實(shí)現(xiàn)類,ArrrayList(數(shù)組列表)和Vector(向量),完全繼承List的所有方法。
? ? ? ? ArrayList和Vector的區(qū)別在于ArrayList是非線程安全的,而Vector是線程安全的,所以推薦使用ArrayList集合。
? ? ? ? ArrayList進(jìn)行for-each遍歷:
import java.util.ArrayList;
public class ArrayListDemo {public static void main(String[] args){ArrayList<String> list= new ArrayList<String>();list.add("北京");list.add("南京");list.add("上海");for(String e:list) //for each遍歷{System.out.println(e);}list.remove("北京"); //刪除元素北京 System.out.println("第一個(gè)元素為:"+list.get(0)); //獲取第一個(gè)元素}
}
輸出:
北京
南京
上海
第一個(gè)元素為:南京
????????另外Vector提供了一個(gè)Stack子類,用于模擬“棧”,有三個(gè)方法:peek(查看棧頂元素),pop(出棧),push(入棧)。
Stack<String> s=new Stack<String>();
for(int i=0;i<=5;i++)s.push(String.valueOf(i));
System.out.println("Stack入棧元素:");
for(int i=0;i<s.size();i++)System.out.println(s.get(i));
System.out.println("Stack出棧元素:");
for(int i=0;i<=5;i++)System.out.println(s.pop());
輸出:?
Stack入棧元素:
1
2
3
4
5
Stack出棧元素:
5
4
3
2
1
3、Set接口
? ? ? ? Set接口是一個(gè)不包含重復(fù)元素的集合,一般用于執(zhí)行數(shù)學(xué)上的集合運(yùn)算,如交集、并集,HashSet、TreeSet和EnumSet是Set接口的常見實(shí)現(xiàn)類。
? ? ? ? HashSet:使用Hash算法存儲(chǔ)集合中的元素,具有良好的存取查找功能。
? ? ? ? TreeSet:采用Tree算法可以保證元素處于排序狀態(tài),TreeSet支持兩種排序方式:自然排序和定制排序,默認(rèn)情況采用自然排序。
? ? ? ? EnumSet:為枚舉類設(shè)計(jì)的集合類,其所有元素必須為指定的枚舉類型,EnumSet中元素是有序的,按照枚舉值順序進(jìn)行排序。
? ? ? ? 在TreeSet類進(jìn)行排序時(shí),會(huì)調(diào)用類內(nèi)方法compareTo方法,所以我們可以通過重寫默認(rèn)排序時(shí)調(diào)用的compareTo方法,來實(shí)現(xiàn)排序的過程。
4、Queue接口
? ? ? ? Queue為隊(duì)列結(jié)構(gòu),采用先進(jìn)先出方式排序每個(gè)元素,在繼承于Collection接口的基礎(chǔ)上,也提供了相應(yīng)的隊(duì)列的插入、獲取、查找操作。
? ? ? ? Queue接口有若干實(shí)現(xiàn)類:LinkedList(鏈表)、PriorityQueue(優(yōu)先隊(duì)列)、Deque(雙向隊(duì)列)。
(1)Queue
? ? ? ? Queue接口的方法:
? ? ? ?注意:Queue不能作為實(shí)例對象,不要?jiǎng)?chuàng)建Queue對象,只能創(chuàng)建Queue的子類對象。
Queue <String>q=new PriorityQueue<>(); //可以
Queue <String>q=new Queue<>(); //不可以
(2)Deque
????????Deque是Queue的子接口,支持兩端插入和移除元素。
????????Deque接口的方法:?
(3)LinkedList
? ? ? ? LinkedList鏈表是Deque和List兩個(gè)接口的實(shí)現(xiàn)類,兼具隊(duì)列和列表兩種特性,但LinkedList不是線程安全的,當(dāng)出現(xiàn)多線程訪問同一實(shí)例時(shí),必須手動(dòng)同步。
? ? ? ? 對鏈表進(jìn)行相應(yīng)操作的代碼:
import java.util.LinkedList;
public class linkedlistdemo {public static void main(String[] args){LinkedList<String> books=new LinkedList();books.offer("數(shù)據(jù)庫");books.push("Java");books.offerFirst("C++");books.offerLast("操作系統(tǒng)");for(String i:books) //遍歷元素System.out.println(i);System.out.println("鏈表第一個(gè)元素:"+books.peekFirst()); System.out.println("鏈表最后一個(gè)元素:"+books.peekLast());System.out.println("鏈表彈出棧頂元素:"+books.pop());System.out.println("鏈表彈出棧底元素:"+books.pollLast());System.out.println("鏈表第二個(gè)元素:"+books.get(1));}
}
?(4)ArrayDeque
? ? ? ??ArrayDeque(數(shù)組雙端隊(duì)列),是Deque實(shí)現(xiàn)類,不繼承于List,所以不能用add、remove進(jìn)行添加、刪除,但上面的鏈表在作為List子類情況下,還是改寫了add和remove方法,使用offerfirst、pollfirst這一類棧相關(guān)的方法,其實(shí)更好理解一些。
? ? ? ? ArrayDeque沒有容量限制,不是線程安全的,禁止添加null元素,在作為堆棧時(shí)快于Stack,作為隊(duì)列時(shí)快于LinkedList。
? ? ? ? ArrayDeque的入隊(duì)、出隊(duì)、選擇可以參考鏈表的操作,都是依賴于Deque的父類方法。
(5)PriorityQueue
? ? ? ? PriorityQueue是Queue接口的實(shí)現(xiàn)類,優(yōu)先級隊(duì)列,可以按照自然排序、或者定制排序(就是修改compareTo),優(yōu)先級隊(duì)列不允許使用null元素,在自然順序下也不允許插入不可比較對象,定制排序可以改compareTo的。
? ? ? ? PriorityQueue要使用Queue接口內(nèi)的方法,所以注意使用poll彈出,offer入棧。
import java.util.PriorityQueue;
import java.util.Queue;public class QueueDemo {public static void main(String[] args){Queue <String>q=new PriorityQueue<>();q.offer("張三");q.offer("李四");q.offer("王五");System.out.println("隊(duì)列第一個(gè)元素,并移除"+q.poll());for(String i:q)System.out.println(i);}
}
5、Map接口?
? ? ? ? Map接口作為與Collection并列的一個(gè)接口,使用key-value鍵值對映射關(guān)系進(jìn)行存儲(chǔ)。
? ? ? ? Map常用方法:
? ? ? ? Map類有兩個(gè)實(shí)現(xiàn)類,分別為HashMap和TreeMap,類似HashSet和TreeSet的區(qū)別,HashMap是無序的映射集合,允許使用null作為鍵或值,TreeMap可以進(jìn)行自然排序或定制排序。
四、集合轉(zhuǎn)換?
? ? ? ? 集合轉(zhuǎn)換方法:
(1)entrySet():返回一個(gè)包含了Map中元素的集合,每個(gè)元素都包括鍵和值
(2)keySet():返回Map中所有鍵的集合
(3)values():返回Map中所有值的集合 (注意不是valueSet)
HashMap<Integer,String>hm=new HashMap(); //創(chuàng)建哈希集合
/*省略若干增刪操作
*/
Set<Entry<Integer,String>>set=hm.entrySet(); //返回鍵值對
set<Integer>keyset=hm.keySet(); //返回鍵
set<String>=hm.values(); //返回值
五、集合工具類
? ? ? ? 集合工具類(輔助工具類)有兩個(gè):Collections和Arrays。
? ? ? ? Collections提供對集合的常用靜態(tài)方法,而Arrays工具類提供對數(shù)組的常用靜態(tài)方法。
? ? ? ? Collections工具類方法:
? ? ? ? Arrays工具類方法:
參考書籍:《Java 8 基礎(chǔ)應(yīng)用與開發(fā)》QST青軟實(shí)訓(xùn)編?