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

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

3、Set和List的區(qū)別
1)Set 接口實(shí)例存儲(chǔ)的是無序的,不重復(fù)的數(shù)據(jù)。List 接口實(shí)例存儲(chǔ)的是有序的,可以重復(fù)的元素
2)Set 接口實(shí)例存儲(chǔ)的是無序的,不重復(fù)的數(shù)據(jù)。List 接口實(shí)例存儲(chǔ)的是有序的,可以重復(fù)的元素
3)List和數(shù)組類似,可以動(dòng)態(tài)增長,根據(jù)實(shí)際存儲(chǔ)的數(shù)據(jù)的長度自動(dòng)增長List的長度。查找元素效率高,插入刪除效率低,因?yàn)闀?huì)引起其他元素位置改變 <實(shí)現(xiàn)類有ArrayList,LinkedList,Vector>
二、ArrayList
1、定義
ArrayList 類是一個(gè)可以動(dòng)態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。
ArrayList 繼承了 AbstractList ,并實(shí)現(xiàn)了 List 接口。

ArrayList 類位于 java.util 包中,使用前需要引入它,語法格式如下:
import java.util.ArrayList; // 引入 ArrayList 類 ArrayList<E> objectName =new ArrayList<>(); // 初始化
2、用實(shí)例了解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();
//當(dāng)前l(fā)ist大小
System.out.println("list當(dāng)前數(shù)據(jù)元素個(gè)數(shù):"+list.size());
//排序
Collections.sort(list);//默認(rèn)升序
//訪問
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當(dāng)前數(shù)據(jù)元素個(gè)數(shù):5
list排序完元素訪問:
1 3 4 5 9
Java ArrayList 常用方法列表如下:
| 方法 | 描述 |
|---|---|
| add() | 將元素插入到指定位置的 arraylist 中 |
| addAll() | 添加集合中的所有元素到 arraylist 中 |
| clear() | 刪除 arraylist 中的所有元素 |
| clone() | 復(fù)制一份 arraylist |
| contains() | 判斷元素是否在 arraylist |
| get() | 通過索引值獲取 arraylist 中的元素 |
| indexOf() | 返回 arraylist 中元素的索引值 |
| removeAll() | 刪除存在于指定集合中的 arraylist 里的所有元素 |
| remove() | 刪除 arraylist 里的單個(gè)元素 |
| size() | 返回 arraylist 里元素?cái)?shù)量 |
| isEmpty() | 判斷 arraylist 是否為空 |
| subList() | 截取部分 arraylist 的元素 |
| set() | 替換 arraylist 中指定索引的元素 |
| sort() | 對(duì) arraylist 元素進(jìn)行排序 |
| 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ù)組中的元素個(gè)數(shù) |
| removeRange() | 刪除 arraylist 中指定索引之間存在的元素 |
| replaceAll() | 將給定的操作內(nèi)容替換掉數(shù)組中每一個(gè)元素 |
| removeIf() | 刪除所有滿足特定條件的 arraylist 元素 |
| forEach() | 遍歷 arraylist 中每一個(gè)元素并執(zhí)行特定操作 |
三、LinkedList
鏈表(Linked list)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的地址。
鏈表可分為單向鏈表和雙向鏈表。
一個(gè)單向鏈表包含兩個(gè)值: 當(dāng)前節(jié)點(diǎn)的值和一個(gè)指向下一個(gè)節(jié)點(diǎn)的鏈接

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

Java LinkedList(鏈表) 類似于 ArrayList,是一種常用的數(shù)據(jù)容器。
與 ArrayList 相比,LinkedList 的增加和刪除對(duì)操作效率更高,而查找和修改的操作效率較低。
以下情況使用 ArrayList :
頻繁訪問列表中的某一個(gè)元素。只需要在列表末尾進(jìn)行添加和刪除元素操作。
以下情況使用 LinkedList :
你需要通過循環(huán)迭代來訪問列表中的某些元素。需要頻繁的在列表開頭、中間、末尾等位置進(jì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) | 將一個(gè)集合的所有元素添加到鏈表后面,返回是否成功,成功為 true,失敗為 false。 |
| public boolean addAll(int index, Collection c) | 將一個(gè)集合的所有元素添加到鏈表的指定位置后面,返回是否成功,成功為 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() | 刪除并返回第一個(gè)元素。 |
| public E removeLast() | 刪除并返回最后一個(gè)元素。 |
| public boolean remove(Object o) | 刪除某一元素,返回是否成功,成功為 true,失敗為 false。 |
| public E remove(int index) | 刪除指定位置的元素。 |
| public E poll() | 刪除并返回第一個(gè)元素。 |
| public E remove() | 刪除并返回第一個(gè)元素。 |
| public boolean contains(Object o) | 判斷是否含有某一元素。 |
| public E get(int index) | 返回指定位置的元素。 |
| public E getFirst() | 返回第一個(gè)元素。 |
| public E getLast() | 返回最后一個(gè)元素。 |
| public int indexOf(Object o) | 查找指定元素從前往后第一次出現(xiàn)的索引。 |
| public int lastIndexOf(Object o) | 查找指定元素最后一次出現(xiàn)的索引。 |
| public E peek() | 返回第一個(gè)元素。 |
| public E element() | 返回第一個(gè)元素。 |
| public E peekFirst() | 返回頭部元素。 |
| public E peekLast() | 返回尾部元素。 |
| public E set(int index, E element) | 設(shè)置指定位置的元素。 |
| public Object clone() | 克隆該列表。 |
| public Iterator descendingIterator() | 返回倒序迭代器。 |
| public int size() | 返回鏈表元素個(gè)數(shù)。 |
| public ListIterator listIterator(int index) | 返回從指定位置開始到末尾的迭代器。 |
| public Object[] toArray() | 返回一個(gè)由鏈表元素組成的數(shù)組。 |
| public T[] toArray(T[] a) | 返回一個(gè)由鏈表元素轉(zhuǎn)換類型而成的數(shù)組。 |
四、HashSet
1、定義
HashSet 基于 HashMap 來實(shí)現(xiàn)的,是一個(gè)不允許有重復(fù)元素的集合。
HashSet 允許有 null 值。
HashSet 是無序的,即不會(huì)記錄插入的順序。
HashSet 不是線程安全的, 如果多個(gè)線程嘗試同時(shí)修改 HashSet,則最終結(jié)果是不確定的。 您必須在多線程訪問時(shí)顯式同步對(duì) HashSet 的并發(fā)訪問。
HashSet 實(shí)現(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);
//計(jì)算大小
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 是一個(gè)散列表,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射。
HashMap 實(shí)現(xiàn)了 Map 接口,根據(jù)鍵的 HashCode 值存儲(chǔ)數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步。
HashMap 是無序的,即不會(huì)記錄插入的順序。
HashMap 繼承于AbstractMap,實(shí)現(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 對(duì)象 Sites
HashMap<String, String> sites = new HashMap<String, String>();
// 添加鍵值對(duì)
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);
//計(jì)算大小
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()) {
// 輸出每一個(gè)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 中的所有鍵/值對(duì) |
| clone() | 復(fù)制一份 hashMap |
| isEmpty() | 判斷 hashMap 是否為空 |
| size() | 計(jì)算 hashMap 中鍵/值對(duì)的數(shù)量 |
| put() | 將鍵/值對(duì)添加到 hashMap 中 |
| putAll() | 將所有鍵/值對(duì)添加到 hashMap 中 |
| putIfAbsent() | 如果 hashMap 中不存在指定的鍵,則將指定的鍵/值對(duì)插入到 hashMap 中。 |
| remove() | 刪除 hashMap 中指定鍵 key 的映射關(guān)系 |
| containsKey() | 檢查 hashMap 中是否存在指定的 key 對(duì)應(yīng)的映射關(guān)系。 |
| containsValue() | 檢查 hashMap 中是否存在指定的 value 對(duì)應(yīng)的映射關(guān)系。 |
| replace() | 替換 hashMap 中是指定的 key 對(duì)應(yīng)的 value。 |
| replaceAll() | 將 hashMap 中的所有映射關(guān)系替換成給定的函數(shù)所執(zhí)行的結(jié)果。 |
| get() | 獲取指定 key 對(duì)應(yīng)對(duì) value |
| getOrDefault() | 獲取指定 key 對(duì)應(yīng)對(duì) value,如果找不到 key ,則返回設(shè)置的默認(rèn)值 |
| forEach() | 對(duì) hashMap 中的每個(gè)映射執(zhí)行指定的操作。 |
| entrySet() | 返回 hashMap 中所有映射項(xiàng)的集合集合視圖。 |
| keySet() | 返回 hashMap 中所有 key 組成的集合視圖。 |
| values() | 返回 hashMap 中存在的所有 value 值。 |
| merge() | 添加鍵值對(duì)到 hashMap 中 |
| compute() | 對(duì) hashMap 中指定 key 的值進(jìn)行重新計(jì)算 |
| computeIfAbsent() | 對(duì) hashMap 中指定 key 的值進(jìn)行重新計(jì)算,如果不存在這個(gè) key,則添加到 hasMap 中 |
| computeIfPresent() | 對(duì) hashMap 中指定 key 的值進(jìn)行重新計(jì)算,前提是該 key 存在于 hashMap 中。 |
六、Iterator(迭代器)
1、定義
Java Iterator(迭代器)不是一個(gè)集合,它是一種用于訪問集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最簡單的實(shí)現(xiàn),ListIterator 是 Collection API 中的接口, 它擴(kuò)展了 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)文章
Springboot?RestTemplate設(shè)置超時(shí)時(shí)間的簡單方法
學(xué)習(xí)springboot ,RestTemplate的使用場景非常非常多,比如springcloud中的服務(wù)消費(fèi),下面這篇文章主要給大家介紹了關(guān)于Springboot?RestTemplate設(shè)置超時(shí)時(shí)間的簡單方法,需要的朋友可以參考下2022-01-01
mybatis連接數(shù)據(jù)庫實(shí)現(xiàn)雙表查詢
本文主要介紹了mybatis連接數(shù)據(jù)庫實(shí)現(xiàn)雙表查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
調(diào)用Mybatis?plus中的saveBatch方法報(bào)找不到表的問題
在用Mybatis plus開發(fā)的項(xiàng)目中,用自帶的API批量保存的方法saveBatch操作時(shí),發(fā)現(xiàn)報(bào)沒有找到表的錯(cuò)誤,本文就來詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2024-03-03
自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼
這篇文章主要介紹了自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
hibernate-validator改進(jìn)校驗(yàn)框架validator?v0.4使用
這篇文章主要為大家介紹了改進(jìn)?hibernate-validator,新一代校驗(yàn)框架?validator?使用介紹?v0.4,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-03-03
SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法
線上系統(tǒng)的日志級(jí)別一般都是 INFO 級(jí)別,有時(shí)候需要查看 WARN 級(jí)別的日志,所以需要?jiǎng)討B(tài)修改日志級(jí)別,微服務(wù)項(xiàng)目中使用 Nacos 作為注冊(cè)中心,我們可以監(jiān)聽 Nacos 配置,修改日志級(jí)別,這篇文章主要介紹了SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法,需要的朋友可以參考下2023-12-12

