爲何要用集合而非數組:面試
雖然數組是保存一組對象最有效的方式,可是數組具備固定尺寸,但在寫程序時並不知道將須要多少個對象。而集合可以自動地調整本身的尺寸。數組
打印數組時,必須使用Arrays.toString()
,可是打印集合能夠直接打印。安全
建立集合對象若是不使用泛型,那麼默承認以存放全部Object對象數據結構
使用泛型能夠應用向上轉型機制。app
Collection接口包括如下方法:框架
boolean add(E a); boolean addAll(Collection<? extend E> c); int size(); boolean isEmpty(); boolean remove(Object o); boolean removeAll(Collection<?> c); boolean contains(Object o); boolean containsAll(Clooection<?> c); void clear(); Iterator<E> iterator(); toArray(); //重載了幾個
List<E>
接口的經常使用方法:工具
boolean add(E e)
boolean add(int index, E e)
int remove(int index)
int remove(Object e)
E get(int index)
int size()
int indexOf(Object o)
,不存在會返回-1實現了List<E>
兩類數據結構:學習
ArrayList
(經常使用)線程
LinkedList
(經常使用)code
List
接口,還實現了Deque
接口,可用做棧、隊列、雙列如下類不該該繼續使用
- Vector:一種線程安全的
List
實現- Stack:基於
Vector
實現的LIFO
的棧
使用toArray(T[] array)
將List
轉換爲Array
:
//不使用參數,默認轉換爲Object類型 List<Integer> list = List.of(1, 2, 3, 4); Object[] arrs = list.toArray(); //因爲將Object類強轉爲其餘類型數組可能出來ClassCastException錯誤,強制使用帶參數的方法 //帶參轉換,傳入的是類型徹底一致、長度爲0的空數組 List<Integer> list = List.of(1, 2, 3, 4); Integer[] arrs = list.toArray(new Integer[0]);
使用List.of(T...)
返回的是一個只讀List
,不能對返回的List
進行操做,不然拋出UnsupportedOperationException
異常。
使用Arrays.asList(T...)
返回一個List
,此List
可操做
List<Integer> list = Arrays.asList(1, 2, 3);
HashSet
(經常使用)TreeSet
(有序)int size()
:獲取隊列長度;boolean add(E)
/boolean offer(E)
:添加元素到隊尾,前者失敗時會拋出異常;E remove()
/E poll()
:獲取隊首元素並從隊列中刪除,前者失敗時會拋出異常;E element()
/E peek()
:獲取隊首元素但並不從隊列中刪除;LinkedList
實現了Queue
接口,能夠使用Queue
引用LinkedList
:
Queue<Integer> queue = new LinkedList<>();
boolean addLast(E e)
/ boolean offerLast(E e)
:添加元素到隊尾,前者失敗時會拋出異常;E removeFirst()
/ E pollFirst()
:獲取隊首元素並從隊列中刪除,前者失敗時會拋出異常;E getFirst()
/ E peekFirst()
:獲取隊首元素但並不從隊列中刪除;boolean addFirst(E e)
/ boolean offerFirst(E e)
添加元素到隊頭,前者失敗時會拋出異常;E removeLast()
/E pollLast()
:獲取隊尾元素並從隊列中刪除,前者失敗時會拋出異常;E getLast()
/ E peekLast()
:獲取隊尾元素但並不從隊列中刪除;Deque
用做棧,取代Stack
:
void push()
:將一個元素壓入棧頂E pop()
:從棧頂彈出已給元素LinkedList
實現了Deque
接口,能夠使用Deque
引用LinkedList
:
Deque<Integer> deque = new LinkedList<>();
PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.add(3); pq.add(1); pq.add(4); pq.add(2); System.out.println(pq.poll()); // 1 System.out.println(pq.poll()); // 2 System.out.println(pq.remove()); // 3
Map<K, V>
是一種鍵值映射表,使用:
V put(K key, V value)
:把key
和value
作了映射並放入Map
中V get(K key)
:經過key
獲取到對應的value
。若是key
不存在,則返回null
。boolean containsKey(K key)
:查詢某個key
是否存在boolean containsValue(V value)
:查詢某個value
是否存在遍歷Map
:
使用for each
循環遍歷Map
實例的keySet()
方法返回的Set
集合
Map<String, Integer> map = new HashMap<>(); map.put("one", 1); map.put("two", 2); map.put("three", 3); for (String key : map.keySet()) { Integer value = map.get(key); System.out.println(key + " = " + value); }
使用for each
循環遍歷Map
對象的entrySet()
集合同時遍歷key
和value
:
Map<String, Integer> map = new HashMap<>(); map.put("apple", 123); map.put("pear", 456); map.put("banana", 789); for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + " = " + value); }
實現Map
接口的實現類:
HashMap
(每天用,JDK1.7 數組+鏈表,JDK1.8之後 數組+鏈表+紅黑樹)LinkedHashSet
:按照被添加的順序保存對象TreeMap
:按比較結果升序保存對象Hashtable
:已過期,不要再使用迭代器是一個輕量級對象,它的工做是遍歷並選擇序列中的對象。使用迭代器遍歷集合是最高效的方式,for each
就是使用迭代器遍歷的。
Java的Iterator
只能單向移動,用來:
iterator()
要求容器返回一個Iterator
next()
得到序列中的下一個元素hasNext()
檢查序列中是否還有元素remove()
將迭代器新近返回的元素刪除Java的listIterator
能夠雙向移動(只有List有):
listIterator()
要求容器返回一個ListIterator
hasNext()
和hasPrevious()
查看是否還有下一個和上一個元素next()
和previous()
能夠得到序列中的下一個元素和上一個元素set()
能夠替換新近訪問的元素remove()
將迭代器新近返回的元素刪除經常使用的一些方法:
Collections.sort(List)
:排序Collections.reverse(List)
:翻轉Collections.shuffle(List)
:打亂Collections.fill(List, Object)
:用給定對象填充List
的全部元素Collections.max/min(List)
:返回最大/最小值Collections.swap(List list,int i,int j)
:交換集合中指定元素索引的位置歡迎關注公衆號:前程有光,領取一線大廠Java面試題總結+各知識點學習思惟導+一份300頁pdf文檔的Java核心知識點總結!