雖然面試的要求是要知道HashMap是怎么實現(xiàn)的购桑,令人望而卻步,但搞明白它怎么用氏淑,就成功了一小半勃蜘。
本文基于Mars老師的Java4Android視頻。
什么是類集框架
- 是一組類和接口
- 位于java.util包中
- 主要用于存儲和管理對象
- 主要分為三大類--集合假残、列表和映射
- 集合中的對象不按特定的方式排序缭贡,并且沒有重復(fù)對象。和數(shù)學(xué)中集合的概念類似。(如果添加了重復(fù)的對象阳惹,會怎樣呢坑资?并不會報錯,但重復(fù)的元素只算一個)穆端。
- 列表中的對象按照索引位置排序袱贮,可以有重復(fù)對象。
- 映射中的每一個元素包含一個鍵對象和一個值對象体啰,即鍵值對攒巍。鍵不可以重復(fù),值可以重復(fù)荒勇。
注意這些接口及其實現(xiàn)類的繼承關(guān)系:
Collection 和 Iterator接口
Set 接口和 List 接口都是 Collection 的子接口柒莉,因此我們先看看Collection 接口中有什么方法:
方法名 | 作用 |
---|---|
boolean add(Object o) | 向集合中加入一個對象 |
void clear() | 刪除集合中的所有對象 |
boolean isEmpty() | 判斷集合是否為空 |
remove(Object o) | 從集合中刪除一個對象的引用 |
int size() | 返回集合中元素的數(shù)目 |
Set有一個實現(xiàn)類,就是HashSet沽翔,它是Set中我們最常用的兢孝。下面我們舉一個例子,在HashSet中使用這些方法仅偎。
Set 和 HashSet的使用方法
//導(dǎo)包時少用*跨蟹,寫明確一點,方便查錯和閱讀
import java.util.Set;
import java.util.HashSet;
public class Test {
public static void main(String args []) {
//把具體的實現(xiàn)類向上轉(zhuǎn)型為接口類型橘沥,方便接收參數(shù),即:
//HashSet<String> hashSet = new HashSet<String>();
//Set<String> set = hashSet;
Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
System.out.println("Size: " + set.size());
//重復(fù)添加元素窗轩,會怎樣呢?
set.add("c");
System.out.println("Size with two c: " + set.size());
set.remove("a");
System.out.println("Size after remove: " + set.size());
set.clear();
System.out.println("Size after clear: " + set.size());
System.out.println("Is empty: " + set.isEmpty());
}
}
運行結(jié)果:
如何遍歷 Set
集合是無序的座咆,所以不能像數(shù)組或者List那樣痢艺,根據(jù)下標輸出其中的元素,因此我們需要使用迭代器 Iterator介陶。
由最前面的圖可以看出堤舒,它們之間的繼承關(guān)系是:Iterator <-- Collection <-- Set <-- HashSet.
Iterator 的常用方法有:
- hasNext():判斷迭代器當(dāng)中,還有沒有下一個元素
- next():返回迭代器當(dāng)中的下一個元素
遍歷Set的方法:
生成迭代器對象:Iterator it = set.iterator() 哺呜,這個迭代器對象可以把set中的元素都取出來舌缤。
iterator() 方法屬于 collection 接口,所以 collection 的子接口 set 中, 必然有 iterator() 方法弦牡。
import java.util.Iterator;
import java.util.Set;
import java.util.HashSet;
public class Test {
public static void main(String args []) {
Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
Iterator<String> it = set.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}
運行結(jié)果:
Map 和 HashMap的使用方法
由一開始的類圖可以看出友驮,Map并沒有繼承Collection接口,是一個單獨的接口驾锰。
Map中的重要方法:
- put(K key, V value): 把鍵值對放入Map
- get(Object key): 返回當(dāng)前鍵對應(yīng)的值
- 其他方法與Collection中類似卸留,比如remove(), clear()
一個簡單的例子:
import java.util.Map;
import java.util.HashMap;
public class Test {
public static void main(String args []) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "a");
map.put("2", "b");
map.put("3", "c");
map.put("4", "d");
//如果有重復(fù)的鍵,后面的值會覆蓋前面的
map.put("3", "e");
System.out.println(map.size());
System.out.println(map.get("3"));
}
}
運行結(jié)果: