1.集合的體系結(jié)構(gòu):
|--Collection(單列集合的根接口)
|--List(子接口):元素是有序的,元素可以重復(fù)。因為該集合體系有索引。
|--ArrayList:底層的數(shù)據(jù)結(jié)構(gòu)使用的是數(shù)組結(jié)構(gòu)。特點:查詢速度很快。但是增刪稍慢。線程不同步(即線程不安全)(存取有序,怎么存怎么取.不能按你想的排序)。
|--因為底層采用數(shù)組的數(shù)據(jù)結(jié)構(gòu),而數(shù)組中的元素在堆內(nèi)存中是連續(xù)分配的,而且有索引,所以查詢快,增刪稍慢
|--在使用迭代器遍歷元素時,不能再使用集合的方法操作集合中的元素
|--調(diào)用集合的contains()或remove()方法時底層會調(diào)用equals方法,如果存入集合的對象沒有實現(xiàn)equals(),
則調(diào)用Object的equals()方法
|--LinkedList:底層使用的鏈表數(shù)據(jù)結(jié)構(gòu)。特點:增刪速度很快,查詢稍慢。線程不同步(線程不安全)。
|--Vector:底層是數(shù)組數(shù)據(jù)結(jié)構(gòu)。線程同步(線程安全)。被ArrayList替代了。因為效率低。
|--Set(子接口):元素是無序(存入和取出的順序不一定一致),元素不可以重復(fù)。
|--HashSet:底層數(shù)據(jù)結(jié)構(gòu)是哈希表。是線程不安全的。不同步。
|--HashSet是如何保證元素唯一性的呢?
|--是通過元素的兩個方法,hashCode和equals來完成。
|--如果元素的HashCode值相同,才會判斷equals是否為true。
|--如果元素的hashcode值不同,不會調(diào)用equals。
|--注意,對于判斷元素是否存在,以及刪除等操作,依賴的方法是元素的hashcode和equals方法。
|--LinkedHashSet特點:可以保證怎么存就怎么取,并且具有上面元素唯一的特性
|--TreeSet:可以對Set集合中的元素進行排序。
|--底層數(shù)據(jù)結(jié)構(gòu)是二叉樹。 保證元素唯一性的依據(jù):compareTo方法return 0.
|--TreeSet排序的第一種方式:讓元素自身具備比較性。元素需要實現(xiàn)Comparable接口,覆蓋compareTo方法。
這種方式也成為元素的自然順序,或者叫做默認順序。
|--TreeSet的第二種排序方式。當(dāng)元素自身不具備比較性時,或者具備的比較性不是所需要的。
這時就需要讓集合自身具備比較性。在集合初始化時,就有了比較方式。
創(chuàng)建一個比較器(實現(xiàn)Comparator接口,重寫compare方法),在創(chuàng)建TreeSet集合時將比較器傳遞給集合.
|--Map集合:該集合存儲鍵值對(雙列集合)。一對一對往里存。而且要保證鍵的唯一性。
|--Hashtable:底層是哈希表數(shù)據(jù)結(jié)構(gòu),不可以存入null鍵null值。該集合是線程同步(線程安全)的。jdk1.0.效率低。
|--HashMap:底層是哈希表數(shù)據(jù)結(jié)構(gòu),允許使用 null 值和 null 鍵,該集合是不同步的(線程不安全)。將hashtable替代,jdk1.2.效率高。
|--TreeMap:底層是二叉樹數(shù)據(jù)結(jié)構(gòu)。不同步。可以用于給map集合中的鍵進行排序。
|--和Set很像。其實,Set底層就是使用了Map集合
|--map集合的兩種取出方式:
|--Set keySet:將map中所有的鍵存入到Set集合。因為set具備迭代器。
所有可以迭代方式取出所有的鍵,在根據(jù)get方法。獲取每一個鍵對應(yīng)的值。
Map集合的取出原理:將map集合轉(zhuǎn)成set集合。在通過迭代器取出。
|--Set> entrySet:將map集合中的映射關(guān)系存入到了set集合中,而這個關(guān)系的數(shù)據(jù)類型就是:Map.Entry
Entry其實就是Map中的一個static內(nèi)部接口。
為什么要定義在內(nèi)部呢?
因為只有有了Map集合,有了鍵值對,才會有鍵值的映射關(guān)系。
關(guān)系屬于Map集合中的一個內(nèi)部事物。而且該事物在直接訪問Map集合中的元素。
2.泛型練習(xí)
編寫一個泛型方法,實現(xiàn)指定位置數(shù)組元素的交換
編寫一個泛型方法,接收一個任意數(shù)組,并顛倒數(shù)組中的所有元素
注意:只有對象類型才能作為泛型方法的實際參數(shù)
在泛型中可以同時有多個類型
public V getValue(K key) return { return map.get(key)}
案例:
package com.heima.generic;
//自定義泛型練習(xí)
public class ArraysUtil {
//編寫一個泛形方法,實現(xiàn)指定位置數(shù)組元素的交換
public static void exchange(T[] t,int index1,int index2){
T temp = t[index1];
t[index1] = t[index2];
t[index2] = temp;
}
//編寫一個泛形方法,接收一個任意數(shù)組,并顛倒數(shù)組中的所有元素
public static void reverse(T[] t){
int startIndex = 0;
int endIndex = t.length -1;
while(startIndex
T temp = t[startIndex];
t[startIndex] = t[endIndex];
t[endIndex] = temp;
startIndex++;
endIndex--;
}
}
}