集合框架有何好處
集合彌補了數組的缺陷,他比數組更靈活更實用,可大大提高軟件的開發效率,而且不同的集合可使用與不同場合
數組和集合的區別
- 數組長度固定,集合長度可以動態改變
- 定義數組時必須指定元素類型,集合默認所有元素都是Object
- 無法直接獲取數組中實際元素的個數,集合可以通過size()直接獲取元素個數
- 集合有多種實現方式和不同的適合場合,而不像數組僅采用分配連續空間方式。
- 集合以接口,類的形式存在,具有面向對象的三大特征,提高了軟件的開發效率
Hashtable和HashMap的異同
實現原理、功能相同,可以互用
主要區別
- Hashtable繼承Dictionary類,HashMap實現Map接口
- Hashtable線程安全,HashMap線程非安全
- Hashtable不允許null值,HashMap允許null值
泛型集合的好處
- 嚴格限制存入元素的數據類型,從集合中取出元素時無需進行強制類型轉換,避免了ClassCastException異常。
Collections算法類
- Collections和Collection不同,前者是集合的操作類,后者是集合接口
- Collections提供的常用靜態方法
- sort():排序
- binarySearch():查找
- max()\min():查找最大\最小值
集合類有哪些
-
Collection(接口)(由List和Set兩部分組成)
-
List(接口)
- LinkedList(類)
- ArrayList(類)
- Vector(類)
- stack(類)
-
Set接口
-
Map接口
- Hashtable(類)
- HashMap(類)
- WeakHashMap(類)
如何使用集合類
- 如果涉及到堆棧、隊列等操作,應當考慮List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList
- 哈希表的操作,作為Key的對象要正確復寫equals和hashCode方法
- 盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果將來要將ArrayList換成LinkedList時,客戶端代碼不用改變
- List可以有類似數組的下標操作,且允許有相同的元素存在;Map是以鍵值對(KeyValue)的形式存在,不能存在相同的鍵
常用集合類
- ArrayList類:
ArrayList實現可變大小的數組,長度隨着元素的增加而變化,而且可以存在重復的元素 - HashMap類:
允許null,即null key,null value。且存在的形式是key-value形式,不允許有key重復
Collection的使用
Collection接口是什么
- Collection接口是可以理解成動態的數組、集合,和數組類似,但不同的是集合可以任意擴充大小
- Collection是最基本的接口,Java SDK提供的類都是繼承自Collection的子接口,例如“List”、“Set”
Collection接口特點
- 性能高
- 易擴展
- 易修改
List接口的使用
List接口的特點
- List接口可以存放任意的數據,且在接口中,內容可以重復
- List中提供了高效的插入和移除多個元素的方法
List常用(實現)子類
- ArrayList(實現類)
例:Listlist = new ArrayList<>(); - Vector(實現類)
例:Listlist = new Vector<>();
ArrayList和Vector區別
|ArrayList | Vector |
---|---|
推出時間 | JDK1.2后 |
性能 | 異步處理,性能高 |
線程安全 | 非線程安全 |
Set的使用
Set接口的特點
Set接口可以存放任意的數據,且在接口中,數據不可以重復(注意和List進行區別)
Set接口常用子類
- HashSet
Setsets = new HashSet<>(); - TreeSet
Setsets = new TreeSet<>();
HashSet和TreeSet的區別
- HashSet與TreeSet都是間接實現了Set接口,同樣擁有add、remove等方法
- HashSet是無序存放的、而TreeSet實現是有序存放(ASCII順序存放)
Map的使用
Map的特點
-
Map接口存放數據是以鍵值對的形式存放,例如:
key -> value
"name" -> "尼古拉斯趙四"
"age" -> "33" -
鍵(key)的類型要一致,值(value)的類型也要一致。
Map常用實現類(實現類的方法和List、Set的方法不一樣)
-
HashMap
Map<String,String> maps = new HashMap<>();
maps.put("name","詹姆斯劉能");
maps.put("age","24");
List接口常用方法
- boolean add(Object o) 在列表的末尾順序添加元素,起始索引位置從0開始
- void add(int index,Object o) 在指定的索引位置添加元素。索引位置必須介於0和列表中元素個數之間
- int size()返回列表中的元素個數
- Object get(int index)返回指定索引位置處的元素。取出的元素是Object類型,使用前需要進行強制類型轉換
- boolean contains(Object o) 判斷列表中是否存在指定元素
- boolean remove(Object o) 從列表中刪除元素
- Object remove(int index) 從列表中刪除指定位置元素,起始索引位置從0開始
LinkedList常用方法
- void addFirst(Object o) 在列表的首部添加元素
- void addLast(Object o) 在列表的末尾添加元素
- Object getFirst() 返回列表中的第一個元素
- Object getLast() 返回列表中的最后一個元素
- Object removeFirst() 刪除並返回列表中的第一個元素
- Object removeLast() 刪除並返回列表中的最后一個元素
Map接口常用方法
- Object put(Object key, Object val) 以“鍵-值”對的方式進行存儲
- Object get(Object key) 根據鍵返回相關聯的值,如果不存在指定的鍵,返回null
- Object remove(Object key) 刪除由指定的鍵映射的“鍵-值對”
- int size() 返回元素個數
- Set keySet() 返回鍵的集合
- Collection values() 返回值的集合
- boolean containsKey(Object key) 如果存在由指定的鍵映射的“鍵-值對”,返回true
迭代器iterator的使用(接口)
-
iterator自帶常用方法
-
hasNext:如果仍有元素可以迭代,則返回true
-
next:返回迭代下一個元素
-
remove:從迭代器指向的collection中移除迭代器返回的最后一個元素(可選操作)
Set
sets = maps.keySet();
Iteratoriterator = sets.iterator();
while(iterator.hasNext()){
System.out.println("key=" + iterator.next());
}
Collection
collection = maps.values();
Iteratoriterator = collection.iterator();
while(iterator.hasNext()){
System.out.println("value=" + iterator.next());
} -
結尾