Java提升學習(七):Java集合類、迭代器
一、Java集合類
(一)集合的概念
Java提供了一種類,這種類相當於容器,可存儲一系列對象,統稱爲集合。
集合與數組相近,但區分於數組
- 數組的長度是固定的。集合的長度是可變的。
- 數組中存儲的是同一類型的元素,可以存儲基本數據類型值。集合存儲的都是對象。而且對象的類型可以不 一致。在開發中一般當對象多的時候,使用集合進行存儲。
(二)Collection接口
Collection
:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是 java.util.List
和 java.util.Set
。其中, List
的特點是元素有序、元素可重複。 Set
的特點是元素無序,而且不可重複。 List
接口的主要實現類有 java.util.ArrayList
和 java.util.LinkedList
, Set
接口 的主要實現類有 java.util.HashSet
和 java.util.TreeSet
。
可以說Collection接口是最基本的集合類接口,在定義Collection中,定義了單列集合(List和Set)通用的一些方法。
方法 | 描述 |
---|---|
public boolean add(E e) |
把給定的對象添加到當前集合中 |
public void clear() |
清空集合中所有的元素 |
public boolean remove(E e) |
把給定的對象在當前集合中刪除 |
public boolean contains(E e) |
判斷當前集合中是否包含給定的對象 |
public boolean isEmpty() |
判斷當前集合是否爲空 |
public int size() |
返回集合中元素的個數 |
public Object[] toArray() |
把集合中的元素,存儲到數組中 |
(三)List集合
java.util.List
接口繼承自 Collection
接口,是單列集合的一個重要分支,習慣性地會將實現了 List
接口的對 象稱爲List
集合。在List
集合中允許出現重複的元素,所有的元素是以一種線性方式進行存儲的,在程序中可以通過 索引來訪問集合中的指定元素。另外,List
集合還有一個特點就是元素有序,即元素的存入順序和取出順序一致。
- 元素存取有序的集合,怎麼入怎麼出
- 帶有索引的集合,通過索引就可以訪問元素
- 元素可重複
List中的常用方法:
方法 | 描述 |
---|---|
public void add(int index, E element) |
將指定的元素,添加到該集合中的指定位置上 |
public E get(int index) |
:返回集合中指定位置的元素 |
public E remove(int index) |
移除列表中指定位置的元素, 返回的是被移除的元素 |
public E set(int index, E element) |
用指定元素替換集合中指定位置的元素,返回值的更新前的元素 |
List的子類:ArrayList集合
java.util.ArrayList
集合數據存儲的結構是數組結構。元素增刪慢,查找快,由於日常開發中使用多的功能爲 查詢數據、遍歷數據,所以 ArrayList
是常用的集合。
List的子類:LinkedList集合
java.util.LinkedList
集合數據存儲的結構是鏈表結構。方便元素添加、刪除的集合。
方法 | 描述 |
---|---|
public void addFirst(E e) |
將指定元素插入此列表的開頭 |
public void addLast(E e) |
將指定元素添加到此列表的結尾 |
public E getFirst() |
返回此列表的第一個元素 |
public E getLast() |
返回此列表的後一個元素 |
public E removeFirst() |
移除並返回此列表的第一個元素 |
public E removeLast() |
移除並返回此列表的後一個元素 |
public E pop() |
從此列表所表示的堆棧處彈出一個元素 |
public void push(E e) |
將元素推入此列表所表示的堆棧 |
public boolean isEmpty() |
如果列表不包含元素,則返回true |
(四)Set接口
java.util.Set
接口和 java.util.List
接口一樣,同樣繼承自 Collection
接口,它與 Collection
接口中的方 法基本一致,並沒有對 Collection
接口進行功能上的擴充,只是比 Collection
接口更加嚴格了。與 List
接口不同的是, Set
接口中元素無序,並且都會以某種規則保證存入的元素不出現重複。
- HashSet集合介紹
java.util.HashSet
是Set
接口的一個實現類,它所存儲的元素是不可重複的,並且元素都是無序的(即存取順序不一致)。
HashSet
是根據對象的哈希值來確定元素在集合中的存儲位置,因此具有良好的存取和查找性能。保證元素唯一性 的方式依賴於:hashCode
與equals
方法。
(五)Collections
常用功能:
方法 | 描述 |
---|---|
public static <T> boolean addAll(Collection<T> c, T... elements) |
往集合中添加一些元素 |
public static void shuffle(List<?> list) |
打亂集合順序 |
public static <T> void sort(List<T> list) |
將集合中元素按照默認規則排序 |
public static <T> void sort(List<T> list,Comparator<? super T> ) |
將集合中元素按照指定規則排序 |
- Comparator比較器
public static <T> void sort(List<T> list,Comparator<? super T> )
可以方便的設定比較規則並實現排序等功能。
(三)Map集合
學習過python的小夥伴們都知道,python裏面有個叫做 字典 的傻孩子,它被用於存儲鍵值對兒。
而Java裏面的map集合就是實現這樣的功能的。
上圖明確的告訴大家,鍵值對的一些特點與性質。
- 相比
collection
中的集合,元素是孤立存在的(理解爲單身),向集合中存儲元素採用一個個元素的方式存儲。 map
中,元素是成對存在的(理解爲夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。Map 中的集合不能包含重複的鍵,值可以重複;每個鍵只能對應一個值。
map接口中的常用方法
方法 | 描述 |
---|---|
put(K key , V value) |
把指定的鍵與指定的值添加到Map集合中。 |
putAll(Map<? extends K , ? extends V> m) |
將指定的Map集合全部添加到該集合 |
clear() |
將集合內所有的鍵值對清除 |
containsKey(Object key ) |
返回類型爲布爾型,判斷該Key中是否包含指定的對象 |
containsValue(Object value) |
返回類型爲布爾型,判斷該集合中的Value是否百翰指定對象 |
isEmpty() |
判斷是否爲空 |
remove(Object key) |
將指定key-value映射從該集合中刪除 |
size() |
返回該集合包含的key-value映射的個數 |
entrySet() |
返回該集合包含的所有鍵值對的Set集合 |
keySet() |
返回集合中的所有的key的Set集合 |
get(Object key) |
返回指定的key映射的值,若不存在該key則返回null |
hashCode() |
返回該值的哈希值 |
map的用法:
public class MapDemo {
public static void main(String[] args) {
//創建 map對象
HashMap<String, String> map = new HashMap<String, String>(); //添加元素到集合
map.put("黃曉明", "楊穎");
map.put("文章", "馬伊琍");
map.put("鄧超", "孫儷");
System.out.println(map);
//String remove(String key)
System.out.println(map.remove("鄧超"));
System.out.println(map);
// 想要查看 黃曉明的媳婦 是誰
System.out.println(map.get("黃曉明"));
System.out.println(map.get("鄧超"));
}
}
map遍歷的方法:
public class MapDemo01 {
public static void main(String[] args) {
//創建Map集合對象
HashMap<String, String> map = new HashMap<String,String>();
//添加元素到集合
map.put("胡歌", "霍建華");
map.put("郭德綱", "于謙");
map.put("薛之謙", "大張偉");
//獲取所有的鍵 獲取鍵集
Set<String> keys = map.keySet();
// 遍歷鍵集 得到 每一個鍵
for (String key : keys) {
//key 就是鍵
//獲取對應值
String value = map.get(key);
System.out.println(key+"的CP是:"+value);
}
}
}
Entry鍵值對對象
我們已經知道, Map
中存放的是兩種對象,一種稱爲key(鍵),一種稱爲value(值),它們在 Map 中是一一對應關 系,這一對對象又稱做 Map 中的一個 Entry
(項) 。 Entry 將鍵值對的對應關係封裝成了對象。即鍵值對對象
,這 樣我們在遍歷 Map 集合時,就可以從每一個鍵值對( Entry )對象中獲取對應的鍵與對應的值。
public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)
使用
public class MapDemo02 {
public static void main(String[] args) {
// 創建Map集合對象
HashMap<String, String> map = new HashMap<String,String>();
// 添加元素到集合
map.put("胡歌", "霍建華");
map.put("郭德綱", "于謙");
map.put("薛之謙", "大張偉");
// 獲取 所有的 entry對象 entrySet
Set<Entry<String,String>> entrySet = map.entrySet();
// 遍歷得到每一個entry對象
for (Entry<String, String> entry : entrySet) {
// 解析
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"的CP是:"+value);
}
}
}
二、迭代器
在程序開發中,經常需要遍歷集合中的所有元素。針對這種需求,JDK專門提供了一個接口 java.util.Iterator
。 Iterator 接口也是Java集合中的一員,但它與 Collection 、 Map 接口有所不同, Collection 接口與 Map 接口主要用於存儲元素,而 Iterator 主要用於迭代訪問(即遍歷) Collection 中的元 素,因此 Iterator 對象也被稱爲迭代器。
想要遍歷Collection集合,那麼就要獲取該集合迭代器完成迭代操作。
public Iterator iterator() : 獲取集合對應的迭代器,用來遍歷集合中的元素
public E next() :返回迭代的下一個元素
public boolean hasNext() :如果仍有元素可以迭代,則返回 true
使用:
public class IteratorDemo {
public static void main(String[] args) {
// 使用多態方式 創建對象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("串串星人");
coll.add("吐槽星人");
coll.add("汪星人");
//遍歷
//使用迭代器 遍歷 每個集合對象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的數據類型
while(it.hasNext()){ //判斷是否有迭代元素
String s = it.next();//獲取迭代出的元素
System.out.println(s);
}
}
}