一篇文章帶你入門java集合
一、簡介
1、java集合框架圖
從上面的集合框架圖可以看到,Java 集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。Collection 接口又有 3 種子類型,List、Set 和 Queue,再下面是一些抽象類,最後是具體實現類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一個用來代表和操縱集合的統一架構。所有的集合框架都包含如下內容:
- 接口:是代表集合的抽象數據類型。例如 Collection、List、Set、Map 等。之所以定義多個接口,是為瞭以不同的方式操作集合對象
- 實現(類):是集合接口的具體實現。從本質上講,它們是可重復使用的數據結構,例如:ArrayList、LinkedList、HashSet、HashMap。
- 算法:是實現集合接口的對象裡的方法執行的一些有用的計算,例如:搜索和排序。這些算法被稱為多態,那是因為相同的方法可以在相似的接口上有著不同的實現。
除瞭集合,該框架也定義瞭幾個 Map 接口和類。Map 裡存儲的是鍵/值對。盡管 Map 不是集合,但是它們完全整合在集合中。
2、集合框架體系
3、Set和List的區別
1)Set 接口實例存儲的是無序的,不重復的數據。List 接口實例存儲的是有序的,可以重復的元素
2)Set 接口實例存儲的是無序的,不重復的數據。List 接口實例存儲的是有序的,可以重復的元素
3)List和數組類似,可以動態增長,根據實際存儲的數據的長度自動增長List的長度。查找元素效率高,插入刪除效率低,因為會引起其他元素位置改變 <實現類有ArrayList,LinkedList,Vector>
二、ArrayList
1、定義
ArrayList 類是一個可以動態修改的數組,與普通數組的區別就是它是沒有固定大小的限制,我們可以添加或刪除元素。
ArrayList 繼承瞭 AbstractList ,並實現瞭 List 接口。
ArrayList 類位於 java.util 包中,使用前需要引入它,語法格式如下:
import java.util.ArrayList; // 引入 ArrayList 類 ArrayList<E> objectName =new ArrayList<>(); // 初始化
2、用實例瞭解ArrayList
@Test public void listTest(){ List<Integer> list = new ArrayList<Integer>(); //增加元素 list.add(1); list.add(9); list.add(8); list.add(4); list.add(5); list.add(3); //訪問 System.out.println("list新增完元素訪問:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); //用set方法修改 list.set(2, 10); //訪問 System.out.println("list修改完元素訪問:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); list.remove(2); //訪問 System.out.println("list刪除完元素訪問:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); //當前list大小 System.out.println("list當前數據元素個數:"+list.size()); //排序 Collections.sort(list);//默認升序 //訪問 System.out.println("list排序完元素訪問:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); }
結果:
list新增完元素訪問:
1 9 8 4 5 3
list修改完元素訪問:
1 9 10 4 5 3
list刪除完元素訪問:
1 9 4 5 3
list當前數據元素個數:5
list排序完元素訪問:
1 3 4 5 9
Java ArrayList 常用方法列表如下:
方法 | 描述 |
---|---|
add() | 將元素插入到指定位置的 arraylist 中 |
addAll() | 添加集合中的所有元素到 arraylist 中 |
clear() | 刪除 arraylist 中的所有元素 |
clone() | 復制一份 arraylist |
contains() | 判斷元素是否在 arraylist |
get() | 通過索引值獲取 arraylist 中的元素 |
indexOf() | 返回 arraylist 中元素的索引值 |
removeAll() | 刪除存在於指定集合中的 arraylist 裡的所有元素 |
remove() | 刪除 arraylist 裡的單個元素 |
size() | 返回 arraylist 裡元素數量 |
isEmpty() | 判斷 arraylist 是否為空 |
subList() | 截取部分 arraylist 的元素 |
set() | 替換 arraylist 中指定索引的元素 |
sort() | 對 arraylist 元素進行排序 |
toArray() | 將 arraylist 轉換為數組 |
toString() | 將 arraylist 轉換為字符串 |
ensureCapacity() | 設置指定容量大小的 arraylist |
lastIndexOf() | 返回指定元素在 arraylist 中最後一次出現的位置 |
retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
trimToSize() | 將 arraylist 中的容量調整為數組中的元素個數 |
removeRange() | 刪除 arraylist 中指定索引之間存在的元素 |
replaceAll() | 將給定的操作內容替換掉數組中每一個元素 |
removeIf() | 刪除所有滿足特定條件的 arraylist 元素 |
forEach() | 遍歷 arraylist 中每一個元素並執行特定操作 |
三、LinkedList
鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是並不會按線性的順序存儲數據,而是在每一個節點裡存到下一個節點的地址。
鏈表可分為單向鏈表和雙向鏈表。
一個單向鏈表包含兩個值: 當前節點的值和一個指向下一個節點的鏈接
一個雙向鏈表有三個整數值: 數值、向後的節點鏈接、向前的節點鏈接。
Java LinkedList(鏈表) 類似於 ArrayList,是一種常用的數據容器。
與 ArrayList 相比,LinkedList 的增加和刪除對操作效率更高,而查找和修改的操作效率較低。
以下情況使用 ArrayList :
頻繁訪問列表中的某一個元素。隻需要在列表末尾進行添加和刪除元素操作。
以下情況使用 LinkedList :
你需要通過循環迭代來訪問列表中的某些元素。需要頻繁的在列表開頭、中間、末尾等位置進行添加和刪除元素操作。
1、語法
// 引入 LinkedList 類 import java.util.LinkedList; LinkedList<E> list = new LinkedList<E>(); // 普通創建方法 或者 LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合創建鏈表
2、示例
@Test public void linkListTest(){ LinkedList<Integer> nums = new LinkedList<Integer>(); //添加 nums.add(3); nums.add(5); nums.add(1); nums.add(8); System.out.println(nums); // 使用 addFirst() 在頭部添加元素 nums.addFirst(0); System.out.println(nums); nums.addLast(20); System.out.println(nums); //移除首位 nums.removeFirst(); System.out.println(nums); // 使用 getFirst() 獲取頭部元素 System.out.println(nums.getFirst()); //for循環迭代 for (int size = nums.size(), i = 0; i < size; i++) { System.out.println(nums.get(i)); } }
結果:
[3, 5, 1, 8]
[0, 3, 5, 1, 8]
[0, 3, 5, 1, 8, 20]
[3, 5, 1, 8, 20]
3
3
5
1
8
20
方法 | 描述 |
---|---|
public boolean add(E e) | 鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。 |
public void add(int index, E element) | 向指定位置插入元素。 |
public boolean addAll(Collection c) | 將一個集合的所有元素添加到鏈表後面,返回是否成功,成功為 true,失敗為 false。 |
public boolean addAll(int index, Collection c) | 將一個集合的所有元素添加到鏈表的指定位置後面,返回是否成功,成功為 true,失敗為 false。 |
public void addFirst(E e) | 元素添加到頭部。 |
public void addLast(E e) | 元素添加到尾部。 |
public boolean offer(E e) | 向鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。 |
public boolean offerFirst(E e) | 頭部插入元素,返回是否成功,成功為 true,失敗為 false。 |
public boolean offerLast(E e) | 尾部插入元素,返回是否成功,成功為 true,失敗為 false。 |
public void clear() | 清空鏈表。 |
public E removeFirst() | 刪除並返回第一個元素。 |
public E removeLast() | 刪除並返回最後一個元素。 |
public boolean remove(Object o) | 刪除某一元素,返回是否成功,成功為 true,失敗為 false。 |
public E remove(int index) | 刪除指定位置的元素。 |
public E poll() | 刪除並返回第一個元素。 |
public E remove() | 刪除並返回第一個元素。 |
public boolean contains(Object o) | 判斷是否含有某一元素。 |
public E get(int index) | 返回指定位置的元素。 |
public E getFirst() | 返回第一個元素。 |
public E getLast() | 返回最後一個元素。 |
public int indexOf(Object o) | 查找指定元素從前往後第一次出現的索引。 |
public int lastIndexOf(Object o) | 查找指定元素最後一次出現的索引。 |
public E peek() | 返回第一個元素。 |
public E element() | 返回第一個元素。 |
public E peekFirst() | 返回頭部元素。 |
public E peekLast() | 返回尾部元素。 |
public E set(int index, E element) | 設置指定位置的元素。 |
public Object clone() | 克隆該列表。 |
public Iterator descendingIterator() | 返回倒序迭代器。 |
public int size() | 返回鏈表元素個數。 |
public ListIterator listIterator(int index) | 返回從指定位置開始到末尾的迭代器。 |
public Object[] toArray() | 返回一個由鏈表元素組成的數組。 |
public T[] toArray(T[] a) | 返回一個由鏈表元素轉換類型而成的數組。 |
四、HashSet
1、定義
HashSet 基於 HashMap 來實現的,是一個不允許有重復元素的集合。
HashSet 允許有 null 值。
HashSet 是無序的,即不會記錄插入的順序。
HashSet 不是線程安全的, 如果多個線程嘗試同時修改 HashSet,則最終結果是不確定的。 您必須在多線程訪問時顯式同步對 HashSet 的並發訪問。
HashSet 實現瞭 Set 接口。
2、語法
import java.util.HashSet; // 引入 HashSet 類 HashSet<String> sites = new HashSet<String>();
3、示例
@Test public void setTest(){ Set<Integer> nums = new HashSet<Integer>(); //添加 nums.add(3); nums.add(5); nums.add(5); nums.add(5); nums.add(1); nums.add(8); System.out.println(nums); //判斷元素是否存在 System.out.println(nums.contains(8)); nums.remove(1); // 刪除元素,刪除成功返回 true,否則為 false System.out.println(nums); //計算大小 System.out.println(nums.size()); for (int i : nums) {//訪問 System.out.println(i); } //清除 nums.clear(); System.out.println(nums); }
結果:
[1, 3, 5, 8]
true
[3, 5, 8]
3
3
5
8
[]
五、HashMap
1、定義
HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。
HashMap 實現瞭 Map 接口,根據鍵的 HashCode 值存儲數據,具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步。
HashMap 是無序的,即不會記錄插入的順序。
HashMap 繼承於AbstractMap,實現瞭 Map、Cloneable、java.io.Serializable 接口。
HashMap 的 key 與 value 類型可以相同也可以不同,可以是字符串(String)類型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)類型的 value。
2、語法
import java.util.HashMap; // 引入 HashMap 類 HashMap<Integer, String> Sites = new HashMap<Integer, String>();
3、示例
@Test public void mapTest(){ // 創建 HashMap 對象 Sites HashMap<String, String> sites = new HashMap<String, String>(); // 添加鍵值對 sites.put("one", "Google"); sites.put("two", "Runoob"); sites.put("three", "Taobao"); sites.put("four", "Zhihu"); System.out.println(sites); //訪問-根據key System.out.println(sites.get("four")); //刪除 sites.remove("four"); System.out.println(sites); //計算大小 System.out.println(sites.size()); // 輸出 key 和 value for (String i : sites.keySet()) { System.out.println("key: " + i + " value: " + sites.get(i)); } // 返回所有 value 值 for(String value: sites.values()) { // 輸出每一個value System.out.print(value + ", "); } }
結果:
{four=Zhihu, one=Google, two=Runoob, three=Taobao}
Zhihu
{one=Google, two=Runoob, three=Taobao}
3
key: one value: Google
key: two value: Runoob
key: three value: Taobao
Google, Runoob, Taobao,
Java HashMap 方法
hashmap
Java HashMap 常用方法列表如下:
方法 | 描述 |
---|---|
clear() | 刪除 hashMap 中的所有鍵/值對 |
clone() | 復制一份 hashMap |
isEmpty() | 判斷 hashMap 是否為空 |
size() | 計算 hashMap 中鍵/值對的數量 |
put() | 將鍵/值對添加到 hashMap 中 |
putAll() | 將所有鍵/值對添加到 hashMap 中 |
putIfAbsent() | 如果 hashMap 中不存在指定的鍵,則將指定的鍵/值對插入到 hashMap 中。 |
remove() | 刪除 hashMap 中指定鍵 key 的映射關系 |
containsKey() | 檢查 hashMap 中是否存在指定的 key 對應的映射關系。 |
containsValue() | 檢查 hashMap 中是否存在指定的 value 對應的映射關系。 |
replace() | 替換 hashMap 中是指定的 key 對應的 value。 |
replaceAll() | 將 hashMap 中的所有映射關系替換成給定的函數所執行的結果。 |
get() | 獲取指定 key 對應對 value |
getOrDefault() | 獲取指定 key 對應對 value,如果找不到 key ,則返回設置的默認值 |
forEach() | 對 hashMap 中的每個映射執行指定的操作。 |
entrySet() | 返回 hashMap 中所有映射項的集合集合視圖。 |
keySet() | 返回 hashMap 中所有 key 組成的集合視圖。 |
values() | 返回 hashMap 中存在的所有 value 值。 |
merge() | 添加鍵值對到 hashMap 中 |
compute() | 對 hashMap 中指定 key 的值進行重新計算 |
computeIfAbsent() | 對 hashMap 中指定 key 的值進行重新計算,如果不存在這個 key,則添加到 hasMap 中 |
computeIfPresent() | 對 hashMap 中指定 key 的值進行重新計算,前提是該 key 存在於 hashMap 中。 |
六、Iterator(迭代器)
1、定義
Java Iterator(迭代器)不是一個集合,它是一種用於訪問集合的方法,可用於迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最簡單的實現,ListIterator 是 Collection API 中的接口, 它擴展瞭 Iterator 接口。
2、示例
@Test public void iteratorTest(){ List<Integer> list = new ArrayList<Integer>(); //增加元素 list.add(1); list.add(9); list.add(8); list.add(4); list.add(5); list.add(3); Iterator<Integer> it = list.iterator(); while(it.hasNext()){ int i = it.next(); System.out.print(i+" "); } }
結果:
1 9 8 4 5 3
七、List和數組互轉
@Test public void arrToListTest(){ List<Integer> list = new ArrayList<Integer>(); //增加元素 list.add(1); list.add(9); list.add(8); list.add(4); list.add(5); list.add(3); Object[] arr = list.toArray(); for(Object o : arr){ System.out.print(o+" "); } System.out.println(); List<Object> ll = Arrays.asList(arr); System.out.println(ll); }
結果:
1 9 8 4 5 3
[1, 9, 8, 4, 5, 3]
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- 深入解讀Java三大集合之map list set的用法
- 深入淺出講解Java集合之Collection接口
- Java開發中最讓人頭疼的十個bug
- 一文掌握Java中List和Set接口的基本使用
- Java List接口的集合使用詳解