集合
-------| Collection 單例集合的跟接口阔逼。
----------| List
如果是實(shí)現(xiàn)了List接口的集合類,具備的特點(diǎn): 有序地沮,可重復(fù)嗜浮。
----------| Set
如果是實(shí)現(xiàn)了Set接口的集合類,具備特點(diǎn): 無序摩疑,不可重復(fù)危融。
Collection接口中的方法:
增加
add(E e) 添加成功返回true,添加失敗返回false.
addAll(Collection c) 把一個(gè)集合 的元素添加到另外一個(gè)集合中去雷袋。
刪除
clear()
remove(Object o)
removeAll(Collection c) 刪除交集
retainAll(Collection c) 保留交集
查看
size()
判斷
isEmpty()
contains(Object o)
containsAll(Collection<?> c)
迭代
toArray()
iterator()
List
ArrayList
底層是維護(hù)了一個(gè)Object數(shù)組實(shí)現(xiàn) 的吉殃, 特點(diǎn): 查詢速度快辞居,增刪慢。
什么時(shí)候使用ArrayList: 如果目前的數(shù)據(jù)是查詢比較多蛋勺,增刪比較少的時(shí)候瓦灶,那么就使用ArrayList存儲這批數(shù)據(jù)。
LinkedList
底層是使用了鏈表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的抱完, 特點(diǎn): 查詢速度慢贼陶,增刪快
Vector
(了解即可)底層也是維護(hù)了一個(gè)Object的數(shù)組實(shí)現(xiàn)的,實(shí)現(xiàn)與ArrayList是一樣的巧娱,但是Vector是線程安全的碉怔,操作效率低。
List特有方法:
添加
add(int index, E element)
addAll(int index, Collection<? extends E> c)
獲冉怼:
get(int index)
indexOf(Object o)
lastIndexOf(Object o)
subList(int fromIndex, int toIndex) 截取
修改:
set(int index, E element)
迭代
listIterator()
只有List接口下面的集合類才具備索引值
撮胧。其他接口下面的集合類都沒有索引值。
ListIterator迭代器
特有的方法:
添加:
hasPrevious() 判斷是否存在上一個(gè)元素老翘。 可用于逆序
hasNext() 問是否有元素可遍歷芹啥。如果有元素可以遍歷,返回true铺峭,否則返回false 叁征。
previous() 當(dāng)前指針先向上移動一個(gè)單位,然后再取出當(dāng)前指針指向的元素逛薇。
next(); 先取出當(dāng)前指針指向的元素,然后指針向下移動一個(gè)單位疏虫。
remove() 移除迭代器最后一次返回 的元素永罚。
---------------------------
add(E e) 把當(dāng)前有元素插入到當(dāng)前指針指向的位置上。
set(E e) 替換迭代器最后一次返回的元素卧秘。
Set
HashSet
底層是使用了哈希表來支持的呢袱,特點(diǎn): 存取速度快.
TreeSet
如果元素具備自然順序 的特性,那么就按照元素自然順序的特性進(jìn)行排序存儲
treeSet
要注意的事項(xiàng):
1. 往TreeSet添加元素的時(shí)候翅敌,如果元素本身具備了自然順序的特性羞福,那么就按照元素自然順序的特性進(jìn)行排序存儲。
2. 往TreeSet添加元素的時(shí)候蚯涮,如果元素本身不具備自然順序的特性治专,那么該元素所屬的類必須要實(shí)現(xiàn)Comparable接口,把元素 的比較規(guī)則定義在compareTo(T o)方法上遭顶。
3. 如果比較元素的時(shí)候张峰,compareTo方法返回 的是0,那么該元素就被視為重復(fù)元素棒旗,不允許添加.(注意:TreeSet與HashCode喘批、equals方法是沒有任何關(guān)系。)
4. 往TreeSet添加元素的時(shí)候, 如果元素本身沒有具備自然順序 的特性,而元素所屬的類也沒有實(shí)現(xiàn)Comparable接口饶深,那么必須要在創(chuàng)建TreeSet的時(shí)候傳入一個(gè) 比較器餐曹。
5. 往TreeSet添加元素的時(shí)候,如果元素本身不具備自然順序的特性敌厘,而元素所屬的類已經(jīng)實(shí)現(xiàn)了Comparable接口台猴, 在創(chuàng)建TreeSet對象的時(shí)候也傳入了比較器
那么是以比較器的比較規(guī)則優(yōu)先使用。
自定義比較器的格式 :
class 類名 implements Comparator{
}
集合循環(huán)
// 方案一
personList.forEach(person -> {
System.out.println("方案一" + person.toString());
});
// 方案二
for (Person person : personList){
System.out.println("方案二--->" + person.toString());
}
// 方案三
Iterator items = students.entrySet().iterator();
while (items.hasNext()) {
Map.Entry entry = (Map.Entry) items.next();
Student student = (Student) entry.getValue();
list.add(statistical);
}
// 方案四:
for (int i = 0; i < personList.size(); i++) {
System.out.println("方案四--->" + personList.get(i));
}
Map
數(shù)據(jù)是以映射關(guān)系
存在的额湘,也就是成對存在的: key - value
-------------| Map 如果是實(shí)現(xiàn)了Map接口的集合類卿吐,具備的特點(diǎn): 存儲的數(shù)據(jù)都是以鍵值對的形式存在的,鍵不可重復(fù)锋华,值可以重復(fù)嗡官。
----------------| HashMap
底層也是基于哈希表實(shí)現(xiàn) 的。
----------------| TreeMap
基于紅黑樹(二叉樹)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)毯焕,鍵排序存儲衍腥。
----------------| Hashtable
Map接口的方法
:
添加:
put(K key, V value)
putAll(Map<? extends K,? extends V> m)
刪除
remove(Object key)
clear()
獲取:
get(Object key)
size()
判斷:
containsKey(Object key)
containsValue(Object value)
isEmpty()
迭代:
keySet()
values()
entrySet()
HashMap
存儲原理:
往HashMap添加元素的時(shí)候纳猫,首先會調(diào)用鍵的hashCode方法得到元素 的哈希碼值婆咸,然后經(jīng)過運(yùn)算就可以算出該元素在哈希表中的存儲位置。
- 情況1: 如果算出的位置目前沒有任何元素存儲芜辕,那么該元素可以直接添加到哈希表中尚骄。
- 情況2:如果算出 的位置目前已經(jīng)存在其他的元素,那么還會調(diào)用該元素的equals方法與這個(gè)位置上的元素進(jìn)行比較侵续,如果equals方法返回 的是false倔丈,那么該元素允許被存儲,如果equals方法返回的是true状蜗,那么該元素被視為 重復(fù)元素需五,不允存儲。
TreeMap
基于紅黑樹(二叉樹)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的轧坎, 特點(diǎn):會對元素的鍵進(jìn)行排序存儲宏邮。
TreeMap 要注意的事項(xiàng):
- 往TreeMap添加元素的時(shí)候,如果元素的鍵具備自然順序缸血,那么就會按照鍵的自然順序特性進(jìn)行排序存儲蜜氨。
- 往TreeMap添加元素的時(shí)候,如果元素的鍵不具備自然順序特性捎泻, 那么鍵所屬的類必須要實(shí)現(xiàn)Comparable接口记劝,把鍵的比較規(guī)則定義在CompareTo方法上。
- 往TreeMap添加元素的時(shí)候族扰,如果元素的鍵不具備自然順序特性厌丑,而且鍵所屬的類也沒有實(shí)現(xiàn)Comparable接口定欧,那么就必須在創(chuàng)建TreeMap對象的時(shí)候傳入比較器。
Ma循環(huán)和排序
// map -- > list
List<Person> result = personHashMap.entrySet().stream()
.map(x -> x.getValue())
.collect(Collectors.toList());
// sort 排序
Map<Integer, Person> results = new LinkedHashMap<>();
personHashMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(x -> results.put(x.getKey(), x.getValue()));
// ******************* 循環(huán)的幾種方式 **************
// 法一 推薦
Set<Map.Entry<Integer, Person>> entryEntry = personHashMap.entrySet();
for (Map.Entry<Integer, Person> entry : entryEntry) {
System.out.println("鍵:" + entry.getKey() + "值:" + entry.getValue());
}
// 法二
personHashMap = null;
personHashMap.forEach((integer, person) -> {
System.out.println("法五:鍵:" + integer + "值:" + person);
});
// 法三 效率高
Iterator items = personHashMap.entrySet().iterator();
while (items.hasNext()) {
Map.Entry entry = (Map.Entry) items.next();
System.out.println("鍵:" + entry.getKey() + "值:" + entry.getValue());
}
// 法四 效率低
Iterator iter = personHashMap.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = personHashMap.get(key);
System.out.println("鍵:" + key + "值:" + val);
}
// 法五
for (Integer key : personHashMap.keySet()) {
System.out.println("鍵:" + key + "值:" + personHashMap.get(key));
}