集合(用於存放引用類型的數據,可變長的數組)
由圖可見集合分爲2大類型,單列集合(collection)與雙列集合(Map)
其中單列集合又可分爲2大類,既list和Set
其中list屬於可重複集合,而且有索引,可以根據集合的下標去獲取當前位置的元素
(使用時需要保證該下標的存在否則會報錯)
java.lang.IndexOutOfBoundsException 下標越界異常 ----屬於運行時異常
list集合
list集合的特點
- 可重複
- 有序(添加順序和取出順序相同)
- 可索引
list又細分爲ArrayLiSt和LinkedList
ArrayList底層爲數組結構 查詢快、增刪慢
LinkedList 底層是鏈表結構 查詢慢、增刪快
list中的主要方法
add(要添加的元素);
add(int index,要添加的元素) 在指定位置,添加元素
addAll(Collection<?>()) 將collection集合的元素全部添加
remove(int index) 刪除指定位置的元素
remove(Object o) 刪除指定的元素
removeAll(Collection<?> c) 刪除列表中的指定集合
contains(Object o) 判斷集合中是否包含元素o
size() 返回集合的大小
4種list集合的遍歷
1.創建集合
list<String> a=new ArrayList<>();
- 集合中添加元素
a.add("dada");
a.add("ggg");
a.add("tt");
for循環遍歷
for (int i = 0; i <a.size(); i++) {
System.out.println(a.get(i));
}
增強for循環遍歷
for (String str:a) {
System.out.println(str);
}
迭代器遍歷
Iterator it=a.iterator();
while (it.hasNext()){
Object next = it.next();
System.out.println(next);
}
列表迭代器(在迭代器遍歷的同時允許對迭代器進行操作)
ListIterator<String> it =s.listIterator();
while(it.hasNext()){
String next = it.next();
System.out.println(next);
if(next.equals("tt")){
a.add("qq");
//此處未迭代器修改,不是集合修改 }
}
System.out.println(s);
}
LinkedList特有的方法:
public void addFirst(E e) 在該列表開頭插入指定的元素
public void addLast(E e) 將指定的元素追加到此列表的末尾
public E getFirst() 返回此列表中的第一個元素
public E getLast() 返回此列表中的最後一個元素
public E removeFirst() 從此列表中刪除並返回第一個元素
public E removeLast() 從此列表中刪除並返回最後一個元素
Set集合
Set集合的特點
- 元素存取無序
- 沒有索引
- 不能存儲重複元素
Set中的主要方法
add(要添加的元素);
add(int index,要添加的元素) 在指定位置,添加元素
addAll(Collection<?>()) 將collection集合的元素全部添加
remove(int index) 刪除指定位置的元素
remove(Object o) 刪除指定的元素
removeAll(Collection<?> c) 刪除列表中的指定集合
contains(Object o) 判斷集合中是否包含元素o
size() 返回集合的大小
2種Set集合的遍歷
Set<String> s =new HashSet<>();
s.add("String");
s.add("aaa");
s.add("bbb");
//遍歷1
for (String d: s) {
System.out.print(d);
}
System.out.println("-------------------");
//遍歷2
Iterator it =s.iterator();
while (it.hasNext()){
System.out.print(it.next());
}
HashSet集合的特點
1.底層是哈希表結構
2.元素存取無序
3.沒有索引
4.不能存儲重複元素
HashSet:底層數據結構是哈希表,線程是不同步的。無序,高效;
HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。
當元素的hashCode值相同時,才繼續判斷元素的equals是否爲true。
如果爲true,那麼視爲相同元素,不存。如果爲false,那麼存儲。
如果hashCode值不同,那麼不判斷equals,從而提高對象比較的速度。
LinkedHashSet集合的概述和特點
1.LinkedHashSet集合是HashSet集合的子類
2.LinkedHashSet集合不能存儲重複元素
3.LinkedHashSet集合可以保證元素存取有序
TreeSet集合的特點
1.元素有序。元素可以按照一定規則進行排序。具體要取決於構造方法
TreeSet():根據元素的自然順序進行排序
TreeSet(Comparator c):根據指定的比較器進行排序
2.TreeSet集合沒有索引。只能通過迭代器、增強for循環進行遍歷
3.TreeSet集合不能存儲重複元素
TreeSet:
用於對Set集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。
如果元素不具備比較性,在運行時會發生ClassCastException異常。
所以需要元素實現Comparable接口,強制讓元素具備比較性,複寫compareTo方法。
依據compareTo方法的返回值,確定元素在TreeSet數據結構中的位置。
TreeSet方法保證元素唯一性的方式:就是參考比較方法的結果是否爲0,如果return 0,視爲兩個對象重複,不存。
注意:在進行比較時,如果判斷元素不唯一,比如,同姓名,同年齡,才視爲同一個人。
在判斷時,需要分主要條件和次要條件,當主要條件相同時,再判斷次要條件,按照次要條件排序。
TreeSet集合排序有兩種方式,Comparable和Comparator區別:
1:讓元素自身具備比較性,需要元素對象實現Comparable接口,覆蓋compareTo方法。
2:讓集合自身具備比較性,需要定義一個實現了Comparator接口的比較器,並覆蓋compare方法,並將該類對象作爲實際參數傳遞給TreeSet集合的構造函數。
第二種方式較爲靈活。
Map集合
Map集合的特點
- Map是雙列數據存儲的集合
- map<k,v> 鍵值對存儲,成對的存儲
- map中的鍵是唯一的,不可重複的
Map中的主要方法
put<k,v> 添加
remove() 刪除
get(Object key) 獲取對應鍵的值
isEmpty() 判斷集合是否爲空
size()返回集合的大小
containsKey(Object key) 是否包含key鍵
containsValue(Object value) 是否包含value值
2種Map集合的遍歷
使用增強for循環
Map<k,v> s =new HashMap<>();
Set<String > s1=s.keySet(); 獲取集合S中的鍵
for(String st :s1){//對集合s1進行遍歷,獲取集合M中的所有鍵
s.get(s1);//獲取對應的鍵所對應的值
sout();
}
使用Map中自帶的遍歷
for (Map.Entry<String,Student> m11:m.entrySet()
) {
String key = m11.getKey();
Student value = m11.getValue();
System.out.println("學號"+key+"姓名"+value.getName()+"年齡"+value.getAge());
}
Collections 工具類(只適應於list集合)
3種方法
Collections.sort(list); 排序
Collections.resverse(list); 反轉
Collections.shuffle(list); 打亂
集合的使用技巧
看到Array就是數組結構,有角標,查詢速度很快。
看到link就是鏈表結構:增刪速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();
看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到該結構的中的元素必須覆蓋hashCode,equals方法。
看到tree就是二叉樹,就要想到排序,就想要用到比較。
比較的兩種方式:
一個是Comparable:覆蓋compareTo方法;
一個是Comparator:覆蓋compare方法。
LinkedHashSet,LinkedHashMap:這兩個集合可以保證哈希表有存入順序和取出順序一致,保證哈希表有序。
集合什麼時候用?
當存儲的是一個元素時,就用Collection。當存儲對象之間存在着映射關係時,就使用Map集合。
保證唯一,就用Set。不保證唯一,就用List。