1. 程式人生 > >JAVA基礎複習(六)泛型和集合

JAVA基礎複習(六)泛型和集合

1、泛型的優點是能在編譯時檢測出錯誤,一旦編譯器認為泛型型別是安全使用的,就會將它轉換為原始型別,泛型類或方法允許使用者指定可以和這些類或方法一起工作的物件型別

2、泛型型別必須是引用型別,不能使用int、double等基本型別來替代泛型集合

3、泛型集合類的構造方法和普通類相同,定義一個泛型類需要將泛型型別放在類名之後,定義一個泛型方法需要將泛型型別放在方法之前

4、呼叫泛型方法,需要將實際型別放在尖括號內作為方法名的字首,如

ClassDemo.<String>methodDemo(strings);

5、非受限泛型型別<E>和<E extends Object>是一樣的

6、通配泛型包括三類形式:?(非受限泛型型別)、?extends T 或者? super T(受限泛型),其中T是某個泛型型別

7、不能使用泛型型別引數建立例項,不能使用泛型型別引數建立陣列,不能使用泛型類建立陣列,但是可以使用如下方法分別規避:

​
E[] elements=(E[])new Object[capacity];//將導致免檢的編譯警告

ArrayList<String>[] list=(ArrayList<String>[])new ArrayList[10];

 8、在靜態方法、資料域或者初始化語句、靜態程式碼塊中,為了類而引用泛型型別引數是非法的

9、異常類不能使用泛型型別引數

10、Java集合框架支援兩種型別的容器:一種是為了儲存一個元素集合,簡稱為集合;另一種是為了儲存鍵值對,稱為圖。

Java集合框架支援三種主要型別的集合:規則集(Set:不重複)、線性表(List:有序)和佇列(Queue:先進先出)。

圖中不能有重複的鍵值,有三種類型:雜湊圖HashMap、鏈式雜湊圖LinkedHashMap和樹形圖TreeMap。

11、Collection介面是處理物件集合的根介面【add()、addAll()類似規則集的並、clear()、contains()、containsAll()類似規則集的交、equals()、hashCode()、isEmpty()、itreator()、remove()、removeAll()類似規則集的差、retainAll()、size()、toArray()

】,AbstractCollection類除了size()和iterator()之外,實現了Collection的所有方法。Iterator介面【hasNext()、next()、remove()】提供了對不同型別集合的元素進行遍歷的統一方法,只能使用迭代器進行集合刪除操作,其他操作會出現不穩定的異常情況,尤其是在併發程式設計中,注意事項可以參考其他大佬的文章http://blog.csdn.net/izard999/article/details/6708738

for(Iterator it = list.iterator(); it.hasNext;) {
    Object o = it.next();
}

12、HashSet類是一個用於實現Set介面的具體類,預設情況下初始容量為16而客座率為75%,也可以在構造方法中指定初始容量和客座率,考慮到效率因素,新增到雜湊集中的物件必須以一種正確分散雜湊碼的方式來實現hashCode方法,兩個不相等的物件可能有相同的雜湊碼(雜湊衝突),應該在實現hashCode方法時儘量避免這種情況。如果不需要維護元素被插入的順序,應該使用HashSet,它會比LinkedHashSet更加高效;當需要一個排好序的集合時,可以從這個雜湊集建立一個樹形集。

13、SortedSet【first()、last()返回規則集第一個和最後一個元素、headSet()、tailSet()返回規則集中元素小於或者不小於的那一部分】是Set的一個子介面,它可以確保元素是有序的。NavigableSet拓展了SortedSet,並提供導航方法lower()小於、floor()小於或等於、ceiling()大於或等於、higher()大於、pollFirst()刪除和返回樹形集的第一個元素、pollLast()同前最後一個元素。TreeSet實現了SortedSet介面的一個具體類

14、比較器介面Comparator定義及使用如:(用於比較沒有實現Comparable類的物件)

class MyComparator implements Comparator{
   @Override
   public int compare(xx, xx) {
    ...
   }
}

15、線性表中List介面【add()、addAll()、get()、indexOf()、lastIndexOf()、listIterator()、remove()、set()、subList()】拓展了Collection介面,但是增加了面向位置的介面和增加了一個能夠雙向遍歷線性表的新列表迭代器。ArrayList是一個動態陣列,適合提取元素或線上性表的尾部插入和刪除元素,LinkedList適合在任意位置上插入和刪除元素【為了從泛型型別的可變長引數表建立線性表,Java提供了靜態的asList方法,如:List<String> list=Arrays.asList(...);】。可以用TreeSet在規則集中儲存有序的元素,但是線性表不支援有序儲存,但是Collections類中提供了對於線性表進行排序的靜態方法【Collections.sort(list);】,還有其他靜態方法,如binarySearch二分查詢list、reverse顛倒list、shuffle打亂指定list、copy將源列表複製給指定目標列表、fill用物件填充列表、disjoint如果兩個集合沒有公共元素則返回true、frequency返回集合指定元素的出現次數

16、除了包含用於訪問和修改向量的同步方法之外,向量類Vector類與ArrayLsit一樣,可防止兩個或多個執行緒同時訪問某個向量時引起資料損壞也可實現可表大變小的陣列,但是不需要同步還是使用ArrayList效率更高。

17、LinkedList類實現了Dwque(雙端佇列)介面,Deque又拓展了Queue介面,PriorityQueue類實現了一個優先佇列,預設情況下,優先佇列使用Comparable以元素的自然順序排序,擁有最小數值的元素被賦予最高優先值。如:

Java.util.Queue<String> queue=new Java.util.LinkedList<String>();//使用LinkedList方法建立佇列
PriorityQueue<String> queue=new PriorityQueue<String>();//建立優先佇列

18、Map介面提供了查詢、更新和獲取集合的值和鍵值的方法,更新方法包括clear刪除所有條目、put將一個值和圖中的一個鍵值相關聯、putAll指定圖新增到這個圖和remove將指定鍵對應的圖元素從圖中刪除,查詢方法包括containsValue檢測圖中是否包含指定鍵值的對映、isEmpty、size、keySet、entrySet。對於定位一個值、插入刪除一個對映,使用HashMap類是高效的,隨機(Hashtable類似,但是具有同步功能);TreeMap類在遍歷排好序的鍵值時是高效的,鍵值可以使用Comparable介面或者Comparator介面來排序,按鍵值升序;LinkedHashMap按最後一次訪問的時間從早到晚排序