java刷題時常用容器詳解
當初學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()返回第一個元素並刪除
以上常用是基於刷題而言的。
如果是以後學到框架之類的需要用到其他線程安全性的容器,那時常用和少用就又不一樣了,不過理解了這些,到時學線程安全的容器的時候上手也很快,原理差不多只是名字不同罷了。
如果覺得有收穫,不妨花個幾秒鐘點個贊,歡迎關注我的公眾號玩編程地碼農,目前專註寫數據結構與算法和計算機基礎等相關知識。