一篇文章帶你入門java集合
一、簡介
1、java集合框架圖
從上面的集合框架圖可以看到,Java 集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。Collection 接口又有 3 種子類型,List、Set 和 Queue,再下面是一些抽象類,最后是具體實現(xiàn)類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一個用來代表和操縱集合的統(tǒng)一架構。所有的集合框架都包含如下內(nèi)容:
- 接口:是代表集合的抽象數(shù)據(jù)類型。例如 Collection、List、Set、Map 等。之所以定義多個接口,是為了以不同的方式操作集合對象
- 實現(xiàn)(類):是集合接口的具體實現(xiàn)。從本質(zhì)上講,它們是可重復使用的數(shù)據(jù)結構,例如: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(); }
結果:
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 轉換為數(shù)組 |
toString() | 將 arraylist 轉換為字符串 |
ensureCapacity() | 設置指定容量大小的 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)是一種常見的基礎數(shù)據(jù)結構,是一種線性表,但是并不會按線性的順序存儲數(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)); } }
結果:
[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) | 設置指定位置的元素。 |
public Object clone() | 克隆該列表。 |
public Iterator descendingIterator() | 返回倒序迭代器。 |
public int size() | 返回鏈表元素個數(shù)。 |
public ListIterator listIterator(int index) | 返回從指定位置開始到末尾的迭代器。 |
public Object[] toArray() | 返回一個由鏈表元素組成的數(shù)組。 |
public T[] toArray(T[] a) | 返回一個由鏈表元素轉換類型而成的數(shù)組。 |
四、HashSet
1、定義
HashSet 基于 HashMap 來實現(xiàn)的,是一個不允許有重復元素的集合。
HashSet 允許有 null 值。
HashSet 是無序的,即不會記錄插入的順序。
HashSet 不是線程安全的, 如果多個線程嘗試同時修改 HashSet,則最終結果是不確定的。 您必須在多線程訪問時顯式同步對 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); }
結果:
[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 + ", "); } }
結果:
{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 的映射關系 |
containsKey() | 檢查 hashMap 中是否存在指定的 key 對應的映射關系。 |
containsValue() | 檢查 hashMap 中是否存在指定的 value 對應的映射關系。 |
replace() | 替換 hashMap 中是指定的 key 對應的 value。 |
replaceAll() | 將 hashMap 中的所有映射關系替換成給定的函數(shù)所執(zhí)行的結果。 |
get() | 獲取指定 key 對應對 value |
getOrDefault() | 獲取指定 key 對應對 value,如果找不到 key ,則返回設置的默認值 |
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+" "); } }
結果:
1 9 8 4 5 3
七、List和數(shù)組互轉
@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]
總結
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
Springboot?RestTemplate設置超時時間的簡單方法
學習springboot ,RestTemplate的使用場景非常非常多,比如springcloud中的服務消費,下面這篇文章主要給大家介紹了關于Springboot?RestTemplate設置超時時間的簡單方法,需要的朋友可以參考下2022-01-01mybatis連接數(shù)據(jù)庫實現(xiàn)雙表查詢
本文主要介紹了mybatis連接數(shù)據(jù)庫實現(xiàn)雙表查詢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-09-09調(diào)用Mybatis?plus中的saveBatch方法報找不到表的問題
在用Mybatis plus開發(fā)的項目中,用自帶的API批量保存的方法saveBatch操作時,發(fā)現(xiàn)報沒有找到表的錯誤,本文就來詳細的介紹一下解決方法,感興趣的可以了解一下2024-03-03自定義的Troop<T>泛型類( c++, java和c#)的實現(xiàn)代碼
這篇文章主要介紹了自定義的Troop<T>泛型類( c++, java和c#)的實現(xiàn)代碼的相關資料,需要的朋友可以參考下2017-05-05hibernate-validator改進校驗框架validator?v0.4使用
這篇文章主要為大家介紹了改進?hibernate-validator,新一代校驗框架?validator?使用介紹?v0.4,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-03-03SpringBoot監(jiān)聽Nacos動態(tài)修改日志級別的操作方法
線上系統(tǒng)的日志級別一般都是 INFO 級別,有時候需要查看 WARN 級別的日志,所以需要動態(tài)修改日志級別,微服務項目中使用 Nacos 作為注冊中心,我們可以監(jiān)聽 Nacos 配置,修改日志級別,這篇文章主要介紹了SpringBoot監(jiān)聽Nacos動態(tài)修改日志級別的操作方法,需要的朋友可以參考下2023-12-12