java集合就是一個容器。
1. 集合概述
l 爲了保存不確定的數據,或者對象,以及保存具有映射關係的數據。
l 所有的集合類都位於java.util包下。
1.1. 什麼是集合,有什麼特點?
面嚮對象語言對事物的體現都是以對象的形式存在,所以爲了方便對多個對象的操作,就對對象進行存儲,集合就是存儲對象最常用的一種方式。
集合只用於存儲對象,集合長度是可變的,集合可以存儲不同類型的對象。
1.2. 集合與數組的區別(集合特點)
首先我們要知道集合與數組是不同:
其中集合是可變長度的,集合中用size();
而數組是固定長度的,數組中是用length();
集合是用來放對象的,數組可以存儲基本數據也可以存儲引用數據類型;
有一點需要注意下,如果集合存放基本數據類型,在存取過程中會有個自動裝箱和拆箱
集合可以放任意對象(引用嘛),但是數組只能放相同的數據類型;
對於如何使用集合,我們先看頂層的方法,然後去調用底層的子類來實現具體的功能。
1.3. 集合框架
由於集合內部的數據結構不同,集合分爲多種容器。這些容器不斷的向上抽取,就形成了集合框架。
Collection
|----------List(有序,,元素都有索引(角標),元素可以重複)
|--------Vector:基於數組實現,同步,線程安全。增刪,查詢都慢。
|--------ArrayList:基於數組實現,不同步,線程不安全,需要手動同步,查詢的速度快
|--------LinkedList:基於鏈表實現,不同步,線程不安全,需要手動同步,增刪都很快
|----------Set(無序,元素不可以重複)
|--------HsahSet:基於哈希表實現,不同步的。
|--------LinkedHsahSet
|--------TreeSet:基於二叉樹實現,不同步的。自然排序,定製排序
Map集合(鍵值對)
|----------TreeMap基於二叉樹,可以排序
|----------HashMap哈希表實現
Iterator迭代器
|----------Collection每個集合都有迭代器
|----------ListIterator主要用於List集合迭代,迭代過程可以操作元素
1.4. 集合常見方法
Collection的常見方法:
1,添加:boolean add(Object obj)://添加元素
booleanaddAll(Collectioncoll)://添加給定集合到當前集合
2,刪除:boolean remove(object obj)://刪除元素
booleanremoveAll(Collectioncoll);
void clear();//清空集合
3,判斷:boolean contains(object obj)://是否包含指定元素
booleancontainsAll(Colllectioncoll);//是否包含給定集合
booleanisEmpty():判斷集合中是否有元素。
4,獲取:int size():
Iterator iterator():取出元素的方式:迭代器。
5,其他:booleanretainAll(Collection coll);取交集。
Object[] toArray():將集合轉成數組。
1.5.遍歷集合:迭代器 Iterator:
也是集合框架的成員,但它主要用於遍歷集合中的對象,封裝了各種集合的底層細節,給集合框架提供了統一的接口。比如,這裏舉個例子。主要有3個方法:
booleanhashnext();如果仍有元素可以迭代,則返回true
E next() 返回迭代的下一個元素
void remove() 移除迭代器返回的最後一個元素
而對於map類集合有2中方式來遍歷:
1:keySet()獲取鍵對應的Set集合,然後在用Iterator配合get(Object key)獲取每一個鍵所對應的值。
2:entrySet()獲取鍵值對集合,存入Map.Entry<K,V>集合中,Iterator對其進行迭代,在用getKey()取出鍵,getValue()取出值。
1.6. 集合的一些技巧:
需要唯一嗎?
需要:Set
需要制定順序:
需要:TreeSet
不需要:HashSet
但是想要一個和存儲一致的順序(有序):LinkedHashSet
不需要:List
需要頻繁增刪嗎?
需要:LinkedList
不需要:ArrayList
l 看到array:就要想到數組,就要想到查詢快,有角標.
l 看到link:就要想到鏈表,就要想到增刪快,就要想要 add get remove+frist last的方法
l 看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆蓋hashcode方法和equals方法。
l 看到tree:就要想到二叉樹,就要想要排序,就要想到兩個接口Comparable,Comparator 。
2. List集合
l 有序(存入和取出的順序一致),元素都有索引(角標),元素可以重複。
l 對於List,根據其內部結構不同又分爲Arraylist、LinkedList、Vector
l 共性特點:可以操作角標
2.1.List子系
List:
|----Vector:數組數據結構,是同步的。增刪,查詢都很慢!已經唄ArrayList替代了
|----ArrayList:數組數據結構,是不同步的。。查詢的速很度快。
|----LinkedList:鏈表數據結構,是不同步的。增刪的速度很快。
2.2.List常用共性方法
1添加元素:
voidadd(intindex,Eelement); //指定位置插入元素
void add(index,collection); //將給定的集合添加到末尾
2刪除元素:
Object remove(index): //刪除指定交表的元素,返被背刪除的
3修改元素:
Objectset(intindex,Eelement); //用指定元素替換列表中指定位置的元素
4獲取元素:
Object get(index); //返回列表中指定位置的元素
intindexOf(object); //返回此列表中第一次出現的指定元素的索引,沒有返回-1
intlastIndexOf(object); //返回此列表中最後一次出現的指定元素的索引,沒有返回-1
ListsubList(intfrom,intto); //獲取子集包含頭不包含尾。
3. Set集合
Set集合與Collection基本上一樣,只不過內部元素是無序的,不允許重複。Add之前,會判斷(equals方法)集合中是否包含此元素,如果包含返回true丙存入集合,如果不包含,返回false,不存。
n 1:HashSet:按hash算法來存儲集合中的元素,因此具有良好的存取和查找功能。
l 特點:
Ø 不保證順序。
Ø 不是同步的
Ø 集合元素可以是null
l 判斷元素是否相等
Ø 判斷hash值是否相等
Ø Equals判斷內容是否相等
n 1:TreeSet:按存儲集合中的元素的compare或者比較器,來判斷是否需添加到集合。
l 特點:
Ø 自然順序或指定順序。
Ø 不是同步的
Ø 集合元素可以是null
l 判斷元素是否相等
Ø 判斷hash值是否相等
Ø Equals判斷內容是否相等
3.1.LinkedHashSet的集合特點
是HashSet的一個子類,也是根據元素的hash值來判斷元素位置,但同時使用鏈表維護元素次序。由於需要維護次序,所以性能略低於hashSet,但在迭代訪問集合元素時,將有很好的性能。【有序不許重複】
3.2. 常用共性方法
1:增加元素:
booleanadd(Object obj);//添加一個元素,在末尾位置
booleanaddAll(Collection c);//添加一個集合,在末尾位置
2:刪除元素:
booleanremove(Object obj);//刪除一個元素。
booleanremoveAll(Collection c)//刪除包含c的元素。
voidclear();//移除此集合的的所有元素
3:判斷元素:
booleancontains(Object obj)//判斷是否包含某個元素。
booleancontainsAll(Collection c);//在此集合中包含集合c中的所有元素
booleanisEmpty();//判斷是否爲空集合。
4:獲取元素:
intsize();//獲取size大小。
Iteratoriterator();//迭代器,用於取出元素的。配合it.next()和hasNext()組合使用。
3.3.Hash表確定元素是否相同
1:判斷兩個原素的hash值是否相同,如果相同個,判斷兩個內容是否相同
2:判斷hash值相同,其實是判斷hashCode()是否相同,判斷內容用equals()方法。
n hashCode規則:
l 同一個對象多次調用返回的hashCode值相等。
l 2個對象euqals方法比較返回true時,他們hashCode也應相等。
l 對象中用作equals方法比較標準的field都應用來計算hashCode值
n 重寫hashDode規則:
l 把每個對象的有意義的field,計算出一個hashcode值。
l 用第一步計算出來的多個hashCode來組合成一個值返回。
l 爲了避免相加產生偶然相等。可以通過hashcode*一個質數相加返回。
例如:
Return name.hashCode*11 + age.hashCode*7;
練習:請定義ArryaList集合,並存儲Person對象。如newPerson("lisi",20);
並取出。將姓名和年齡打印出來。
3.4.TreeeSet排序的2種方式
1, 讓對象本身具備可比性。實現comparable接口的comparTo()方法。
2, 創建比較器。比較器實現Compartor接口,Compar()方法作爲TreeSet對象的構造參數象傳入。注意泛型。
3, 建議用第二種,使用靈活
· publicstaticvoid main(String[] args) {
TreeSet <Person>ts= newTreeSet<Person>(new Comparator<Person>() {
publicint compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
ts.add(new Person("mike",28));
ts.add(new Person("lisi",21));
ts.add(new Person("zhouqi",29));
ts.add(new Person("zhaoliu",25));
ts.add(new Person("wangu",24));
for (Object o: ts) {
Person p = (Person) o;
System.out.println(p.getName() +"\t" + p.getAge());
}
}
3.5. 選擇HashSet還是TreeSet?
HashSet的性能總是比TreeSet好,(主要表現在添加、刪除、查詢等),因爲TreeSet需要二外的紅黑樹來維護次序。只有當需要排序時才使用TreeSet。
HashSet有一個子類,LinkedSet對於普通測插入刪除這個要比HashSet要慢些。因爲要維護鏈表。
3.6. 安全問題解決
通常在創建是就調用Collections工具類的synchronizedSortedSet方法來包裝集合。
例如
Sorted s =new Collections.synchronizedSortedSet(new Treeset(…))
4. Map集合
Map集合用於存儲那些有映射關係的數據;
Map也成爲雙列集合。
Map存的是一對元素:一個Key,一個Value。Key、Value可以使任何引用類型的數據。其中Map的Key不允許重複。
4.1.Map集合子體系
Map:
|----HashMap:哈希表結構;Key唯一;不同步;允許null作爲鍵,值。hashCode()、equals()確定唯一
|----HashTable:哈希表結構;數據唯一;同步低效的。不允許null作爲鍵,null作爲值。
|----TreeMap:二叉樹結構;Key唯一;可排序;不同步但高效;允許null作爲鍵,null作爲值。
補充:
4.2.Map常用方法
1添加元素:
·value put(key,value): 返回前一個和key關聯的值,如果沒有返回null.
2,刪除元素。
void clear(): 清空集合。
value remove(key): 根據指定的key翻出這個鍵值對。
3,判斷元素。
boolean containsKey(key): 判斷是否包含給定的key
boolean containsValue(value):判斷是否包含給定的value
boolean isEmpty(); 判斷集合是否爲空
4獲取元素。
value get(key): 通過鍵獲取值,如果沒有該鍵返回null。可以用來來判斷是否包含指定鍵。
int size(): 獲取鍵值對的個數。
4.3.Collection和Collections
collection是集合框架的頂層接口,集成了一些集合的共性方法;添加、刪除、修改、查詢、判斷等。下分爲list和set兩個分支,其又各自有體系,其
中list有序,可以重複的,有分爲vector arraylistlinkedlist(各個數據結構,特點)
其中set是無序不許重複的,有分爲。hashset和treeset(各個數據結構,特點)
Collections是一個對collection操作的工具類,提供的都是靜態方法(查找,排序,反轉,加鎖)