當初學java時,只是簡單的把java基礎知識過了一遍就跑去刷題了,很多知識都是在刷題的過程中慢慢加深理解的。
由於每次刷題時,刷到與容器有關的我基本上都跑去百度了,例如百度一下:java中List的常用方法。
百度的次數不少,但總感覺不成體系,容易搞混,於是在這篇文章中總結了刷題過程中容器的一些常用方法。以此減少自己以後百度的次數。
如果你想複習一下容器的常用方法或者希望以後在容器這方面能少百度幾次的話,相信這篇文章對你一定會有幫助。
容器,就是儲存資料用的的東西
容器不需要定義大小,會自動擴容
基本的容器有四個,分別對應四個介面:
- List:按照插入的順序儲存元素,可以有重複的元素。
- Set:不可以有重複的元素,可以理解為雜湊表。
- Queue:按照佇列規則先進先出。
- Map:將兩個元素相關聯,可以用鍵來查詢值。
其中List、Set、Queue這三個介面繼承了Collection介面。
Map則是自成一家,沒有繼承別人。
各介面的常用實現類
- List:ArrayList、LinkedList
- Set:HashSet、TreeSet、LinkedHashSet
- Map:HashMap、TreeMap、LinkedHashMap
- Queue:PriorityQueue、LinkedList
ArrayList和LinkedList這兩個是實現類,實現了List介面,這兩個類可能會增加一些介面沒有的新方法(刷題時一般用不到)。
同理、Set、Queue、Map的實現類也一樣。
接下來把這些關係用一副圖表示出來
如果需要用到一個List容器可以像下面這樣子定義
ArrayList<Integer> list = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
有人也會定義成
List<Integer> list = new ArrayList<>();
有什麼區別呢?
區別就是用
ArrayList<Integer> list = new ArrayList<>()
定義出來的list可以使用的方法多一些。
而用
List<Integer> list = new ArrayList<>()
定義出來的list可以用的方法少一些,因為類實現介面的時候可能會增加一些新的方法。
一般情況都可以定義成
List<Integer> list = new ArrayList<>()
就行了。因為我們原本就是想用List這個容器,List裡的方法已經夠我們用了。
除非你一定需要用到ArrayList裡面特有的方法你才定義成
ArrayList<Integer> list = new ArrayList<>()
其實使用哪個無所謂,只要不把自己困擾住就行了,知道為什麼可以這樣子定義就可以了。
Set和Map和Queue的定義也和list一樣。
List介面的實現類有ArrayList、LinkedList
- ArrayList:底層使用陣列實現的,查詢快,插入資料和刪除資料慢(常用)
- LinkedList:底層使用連結串列實現的,查詢慢,插入資料和刪除資料快(常用)
建立一個List容器
List<Integer> list = new ArrayList<>();
List常用方法有
- list.add(int element)//新增元素(常用)
- list.get(int index)//根據索引查詢元素
- list.size()//反回元素的數量(常用)
- list.isEmpty()//判斷是否為空(常用)
Set介面實現類有
- HashSet:使用雜湊函式查詢快速(也就是常說的雜湊查詢)(常用)
- TreeSet:排序預設從小到大
- LinkedHashSet:使用連結串列維護元素的插入順序
建立一個Set容器
Set<Integer> set = new HashSet<>();
Set常用方法有
- set.add()//新增元素
- set.remove(Object o)//刪除一個物件的引用
- set.clear()//清空容器
- set.isEmpty()//判斷容器是否為空
- set.contains(Object o)//判斷容器是否包含o(常用)
- set.size()//返回容器中元素的數目
Map介面實現類有
HashMap:用於快速訪問,常用與雜湊有關的(常用)
TreeMap:鍵處於排序狀態
LinkedHashMap:保持元素插入的順序
建立一個Set容器
Map<String,Integer> map = new HashMap<>();
Map常用方法有
- map.put()//新增鍵值對
- map.remove(Object key)//刪除鍵值對
- map.remove(Object key,Object value)//刪除鍵值對
- map.size()//返回元素的數量
- map.clear()//清空容器
- map.isEmpty()//判斷容器是否為空
- map.containsKey()//判斷容器是否包含某鍵
- map.containsValue()//判斷容器是否包含某值
Queue介面實現類有
- PriorityQueue:優先佇列(常用)
- LinkedList:普通佇列(常用)
有些人可能有疑問 怎麼Queue還和LinkedList聯絡起來了,其實Queue的新增隊尾和刪除隊頭不就是相等於插入連結串列的尾結點,和刪除連結串列的頭結點嗎,所以說不需要在定義一個Queue的實現類了。
Queue常用方法有
- offer()新增元素(常用)
- peek()返回第一個元素(常用)
- poll()返回第一個元素並刪除(常用)
- add()新增元素
- element()返回第一個元素
- remove()返回第一個元素並刪除
- put()新增元素
- take()返回第一個元素並刪除
以上常用是基於刷題而言的。
如果是以後學到框架之類的需要用到其他執行緒安全性的容器,那時常用和少用就又不一樣了,不過理解了這些,到時學執行緒安全的容器的時候上手也很快,原理差不多隻是名字不同罷了。
如果覺得有收穫,不妨花個幾秒鐘點個贊,歡迎關注我的公眾號玩程式設計地碼農,目前專注寫資料結構與演算法和計算機基礎等相關知識。