一篇文章帶你入門java集合
一、簡介
1、java集合框架圖

從上面的集合框架圖可以看到,Java 集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。Collection 接口又有 3 種子類型,List、Set 和 Queue,再下面是一些抽象類,最后是具體實現(xiàn)類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一個用來代表和操縱集合的統(tǒng)一架構(gòu)。所有的集合框架都包含如下內(nèi)容:
- 接口:是代表集合的抽象數(shù)據(jù)類型。例如 Collection、List、Set、Map 等。之所以定義多個接口,是為了以不同的方式操作集合對象
- 實現(xiàn)(類):是集合接口的具體實現(xiàn)。從本質(zhì)上講,它們是可重復使用的數(shù)據(jù)結(jié)構(gòu),例如:ArrayList、LinkedList、HashSet、HashMap。
- 算法:是實現(xiàn)集合接口的對象里的方法執(zhí)行的一些有用的計算,例如:搜索和排序。這些算法被稱為多態(tài),那是因為相同的方法可以在相似的接口上有著不同的實現(xiàn)。
除了集合,該框架也定義了幾個 Map 接口和類。Map 里存儲的是鍵/值對。盡管 Map 不是集合,但是它們完全整合在集合中。
2、集合框架體系

3、Set和List的區(qū)別
1)Set 接口實例存儲的是無序的,不重復的數(shù)據(jù)。List 接口實例存儲的是有序的,可以重復的元素
2)Set 接口實例存儲的是無序的,不重復的數(shù)據(jù)。List 接口實例存儲的是有序的,可以重復的元素
3)List和數(shù)組類似,可以動態(tài)增長,根據(jù)實際存儲的數(shù)據(jù)的長度自動增長List的長度。查找元素效率高,插入刪除效率低,因為會引起其他元素位置改變 <實現(xiàn)類有ArrayList,LinkedList,Vector>
二、ArrayList
1、定義
ArrayList 類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。
ArrayList 繼承了 AbstractList ,并實現(xiàn)了 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();
//當前l(fā)ist大小
System.out.println("list當前數(shù)據(jù)元素個數(shù):"+list.size());
//排序
Collections.sort(list);//默認升序
//訪問
System.out.println("list排序完元素訪問:");
for(int s : list){
System.out.print(s+" ");
}
System.out.println();
}
結(jié)果:
list新增完元素訪問:
1 9 8 4 5 3
list修改完元素訪問:
1 9 10 4 5 3
list刪除完元素訪問:
1 9 4 5 3
list當前數(shù)據(jù)元素個數(shù):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 里元素數(shù)量 |
| isEmpty() | 判斷 arraylist 是否為空 |
| subList() | 截取部分 arraylist 的元素 |
| set() | 替換 arraylist 中指定索引的元素 |
| sort() | 對 arraylist 元素進行排序 |
| toArray() | 將 arraylist 轉(zhuǎn)換為數(shù)組 |
| toString() | 將 arraylist 轉(zhuǎn)換為字符串 |
| ensureCapacity() | 設(shè)置指定容量大小的 arraylist |
| lastIndexOf() | 返回指定元素在 arraylist 中最后一次出現(xiàn)的位置 |
| retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
| containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
| trimToSize() | 將 arraylist 中的容量調(diào)整為數(shù)組中的元素個數(shù) |
| removeRange() | 刪除 arraylist 中指定索引之間存在的元素 |
| replaceAll() | 將給定的操作內(nèi)容替換掉數(shù)組中每一個元素 |
| removeIf() | 刪除所有滿足特定條件的 arraylist 元素 |
| forEach() | 遍歷 arraylist 中每一個元素并執(zhí)行特定操作 |
三、LinkedList
鏈表(Linked list)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會按線性的順序存儲數(shù)據(jù),而是在每一個節(jié)點里存到下一個節(jié)點的地址。
鏈表可分為單向鏈表和雙向鏈表。
一個單向鏈表包含兩個值: 當前節(jié)點的值和一個指向下一個節(jié)點的鏈接

一個雙向鏈表有三個整數(shù)值: 數(shù)值、向后的節(jié)點鏈接、向前的節(jié)點鏈接。

Java LinkedList(鏈表) 類似于 ArrayList,是一種常用的數(shù)據(jù)容器。
與 ArrayList 相比,LinkedList 的增加和刪除對操作效率更高,而查找和修改的操作效率較低。
以下情況使用 ArrayList :
頻繁訪問列表中的某一個元素。只需要在列表末尾進行添加和刪除元素操作。
以下情況使用 LinkedList :
你需要通過循環(huán)迭代來訪問列表中的某些元素。需要頻繁的在列表開頭、中間、末尾等位置進行添加和刪除元素操作。

1、語法
// 引入 LinkedList 類 import java.util.LinkedList; LinkedList<E> list = new LinkedList<E>(); // 普通創(chuàng)建方法 或者 LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合創(chuàng)建鏈表
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循環(huán)迭代
for (int size = nums.size(), i = 0; i < size; i++) {
System.out.println(nums.get(i));
}
}
結(jié)果:
[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) | 查找指定元素從前往后第一次出現(xiàn)的索引。 |
| public int lastIndexOf(Object o) | 查找指定元素最后一次出現(xiàn)的索引。 |
| public E peek() | 返回第一個元素。 |
| public E element() | 返回第一個元素。 |
| public E peekFirst() | 返回頭部元素。 |
| public E peekLast() | 返回尾部元素。 |
| public E set(int index, E element) | 設(shè)置指定位置的元素。 |
| public Object clone() | 克隆該列表。 |
| public Iterator descendingIterator() | 返回倒序迭代器。 |
| public int size() | 返回鏈表元素個數(shù)。 |
| public ListIterator listIterator(int index) | 返回從指定位置開始到末尾的迭代器。 |
| public Object[] toArray() | 返回一個由鏈表元素組成的數(shù)組。 |
| public T[] toArray(T[] a) | 返回一個由鏈表元素轉(zhuǎn)換類型而成的數(shù)組。 |
四、HashSet
1、定義
HashSet 基于 HashMap 來實現(xiàn)的,是一個不允許有重復元素的集合。
HashSet 允許有 null 值。
HashSet 是無序的,即不會記錄插入的順序。
HashSet 不是線程安全的, 如果多個線程嘗試同時修改 HashSet,則最終結(jié)果是不確定的。 您必須在多線程訪問時顯式同步對 HashSet 的并發(fā)訪問。
HashSet 實現(xiàn)了 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);
}
結(jié)果:
[1, 3, 5, 8]
true
[3, 5, 8]
3
3
5
8
[]
五、HashMap
1、定義
HashMap 是一個散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。
HashMap 實現(xiàn)了 Map 接口,根據(jù)鍵的 HashCode 值存儲數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步。
HashMap 是無序的,即不會記錄插入的順序。
HashMap 繼承于AbstractMap,實現(xiàn)了 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(){
// 創(chuàng)建 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);
//訪問-根據(jù)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 + ", ");
}
}
結(jié)果:
{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 中鍵/值對的數(shù)量 |
| put() | 將鍵/值對添加到 hashMap 中 |
| putAll() | 將所有鍵/值對添加到 hashMap 中 |
| putIfAbsent() | 如果 hashMap 中不存在指定的鍵,則將指定的鍵/值對插入到 hashMap 中。 |
| remove() | 刪除 hashMap 中指定鍵 key 的映射關(guān)系 |
| containsKey() | 檢查 hashMap 中是否存在指定的 key 對應的映射關(guān)系。 |
| containsValue() | 檢查 hashMap 中是否存在指定的 value 對應的映射關(guān)系。 |
| replace() | 替換 hashMap 中是指定的 key 對應的 value。 |
| replaceAll() | 將 hashMap 中的所有映射關(guān)系替換成給定的函數(shù)所執(zhí)行的結(jié)果。 |
| get() | 獲取指定 key 對應對 value |
| getOrDefault() | 獲取指定 key 對應對 value,如果找不到 key ,則返回設(shè)置的默認值 |
| forEach() | 對 hashMap 中的每個映射執(zhí)行指定的操作。 |
| 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 迭代器最簡單的實現(xiàn),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+" ");
}
}
結(jié)果:
1 9 8 4 5 3
七、List和數(shù)組互轉(zhuǎn)
@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);
}
結(jié)果:
1 9 8 4 5 3
[1, 9, 8, 4, 5, 3]
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
基于Idea+Jconsole實現(xiàn)線程監(jiān)控步驟
這篇文章主要介紹了基于Idea+Jconsole實現(xiàn)線程監(jiān)控功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04
Java程序員編程性能優(yōu)化必備的34個小技巧(總結(jié))
這篇文章主要介紹了Java程序員編程性能優(yōu)化必備的34個小技巧(總結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-07-07
IDEA版使用Java操作Redis數(shù)據(jù)庫的方法
這篇文章主要介紹了IDEA版使用Java操作Redis數(shù)據(jù)庫的方法,首先需要下載jedis.jar包,然后再工程中設(shè)置具體操作步驟跟隨小編一起學習下吧2021-08-08
Java Comparator.comparing比較導致空指針異常的解決
這篇文章主要介紹了Java Comparator.comparing比較導致空指針異常的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
使用Easyexcel實現(xiàn)不同場景的數(shù)據(jù)導出功能
這篇文章主要為大家詳細介紹了如何在不同場景下使用Easyexcel實現(xiàn)數(shù)據(jù)導出功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-03-03

