c++ list容器获取第n给元素_Java总结之容器家族--Collection*
一、概述
Collection是[收集品]的意思,這里稱[容器],是java中的一個接口,位于java.util包下
Collection下有三大接口:List(列表)、Set(集合)、Queue(隊列)
容器接口子類及方法
二、List接口
List:列表,顧名思義是一種表結構,核心方法:
- 按索引插入元素 void add(int var1, E var2)
- 按索引刪除元素 E remove(int var1);
- 按索引修改元素 E set(int var1, E var2)
- 按索引查詢元素 E get(int var1)
特點:
1.增刪改查操作都可以按照索引進行精確的控制,所以是元素的有序排列
2.允許相同元素
List子類
List是java中使用頻率非常高的一個接口,最要的子類:ArrayList、Vector、LinkedList
1.其中ArrayList、Vector是AbstractList-->AbstractCollection-->Collection 路線
2.LinkedList不止實現了List,還實現了Deque,就像得到兩個師傅的真傳,招式(方法)更多一些
Queue接口是隊列(先進先出),Deque接口(雙端隊列)是Queue的弟子,兩頭都能隨意進出
所以根據需求即可當棧也可當隊列,LinkedList得到了Deque的真傳,所以也可以
關于抽象類:
抽象類一般是先實現接口,或者拓展一些子類公用方法,總之就是把能做的先做了。
有種天下父母心的感覺,就像AbstractList對ArrayList說:我能幫你做的盡量都做了,接下來就看你的了。
public abstract class AbstractCollection implements Collectionpublic abstract class AbstractSequentialList extends AbstractList public abstract class AbstractList extends AbstractCollection implements List1.ArrayList:數組列表
ArrayList
2.LinkedList:鏈式列表
LinkedList
3.Vector、ArrayList與 LinkedList的比較
可以說Vector、ArrayList是親兄弟,LinkedList算個堂兄
尾添加測試[add(E)]操作數opCount=1000W:插入的位置與耗時比較可見ArrayList越往后插入越快,因為要變動的元素越少LinkedList從兩頭到中間速度變慢,取決于鏈表的查詢機制,總的來說,隨機添加LinkedList比較有優勢些,只是末尾添加ArrayList較好數組和雙鏈表兩種數據結構:
數組:定點添加,后面元素都要往后挪個位,O(n)-------雙鏈表:耗時在找到那個定點,添加很快,綜合O(n)數組:定點刪除,后面元素都要往前挪個位,O(n)-------雙鏈表:耗時在找到那個定點,刪除很快,綜合O(n)數組:定點查詢,數組自帶索引光環,O(1) -------雙鏈表:一個一個挨著找 O(n)數組:定點修改,數組自帶索引光環,O(1) -------雙鏈表:耗時在找到那個定點,修改很快,綜合O(n)綜上所屬:
隨機訪問、修改性能:Vector、ArrayList>LinkedList 考慮到Vector、ArrayList添加或刪除時: 1.可能伴隨擴容/縮容, 2.當元素個數巨大時,可能造成大量空閑空間 3.數組連續開辟空間,會造成儲存空間的碎片化 的這些問題,在大量添加或刪除操作使用LinkedList是更好的選擇 因為雙鏈表:1.雙鏈表的添加/刪除耗時在查找工作,而雙鏈表查詢時會查看索引在前半還是后半來決定從頭查詢或從尾查詢,從而最差情況只需size/2,而數組最差情況為size2.鏈表不需要開辟連續空間,從而避免儲存空間的碎片化 另外在數據非常巨大的時候:LinkedList基于雙鏈表,需要new 巨大數量的節點(Node),Vector、ArrayList只是開辟空間,所以更好一些,所以根據需求酌情處理4.關于 Vector
順便提一下只有Vector容器對象可以用vector.elements()獲取Enumeration對象,其他列表的需要自定義
在合并字節輸入流SequenceInputStream時需要傳遞一個Enumeration對象,Vector有了用處
SequenceInputStream?(Enumeration extends InputStream> e)Vector類對集合的元素操作時都加了synchronized,保證線程安全。但使得效率下降:如 public synchronized boolean add(E e) { modCount++; add(e, elementData, elementCount); return true; } 所謂同步:即當一個Iterator被正在被使用,另一個線程對Vector添加或刪除元素,這時調用Iterator的方法時將拋出異常public synchronized void replaceAll(UnaryOperator operator) { Objects.requireNonNull(operator); final int expectedModCount = modCount; final Object[] es = elementData; final int size = elementCount; for (int i = 0; modCount == expectedModCount && i < size; i++) es[i] = operator.apply(elementAt(es, i)); if (modCount != expectedModCount) throw new ConcurrentModificationException(); modCount++; } 可以看到很多關于修改的方法當:modCount != expectedModCount時都會扔一個ConcurrentModificationException異常也就是期望的修改次數與真實的修改次數不一致時sa三、Set接口
集合:數學上的集合性質:
Set的操作比較少,基本上也就是Collection傳下來的方法
Set一般基于Map來實現:HashSet、LinkedHashSet、TreeSet的特性,根本上是HashMap、LinkedHashMap、TreeMap的特性
1.HashSet
HashSet內部有一個HashMap map成員變量,增刪實際上是使用map的方法
按照哈希的順序:hashCode(),equals(Object obj)
底層實現:HashMap
HashSet
private transient HashMap map; public HashSet() { map = new HashMap<>();}public boolean add(E e) { return map.put(e, PRESENT)==null;}public boolean remove(Object o) { return map.remove(o)==PRESENT;}2.LinkedHashSet
LinkedHashSet是HashSet的子類,源碼少得可憐,基本上都是調用父類(HashSet)的構造方法
基于一個由鏈表實現的哈希表,保留了元素插入順序
底層實現:LinkedHashMap
LinkedHashSet
LinkedHashSet中:
public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true);}3.TreeSet---有序集合
實現NavigableSet:使用元素的compareTo對元素進行排序,也可使用Comparator自定義比較器
TreeSet多拜了一個師傅:NavigableSet-->SortedSet 使用方法也多幾個
底層實現:TreeMap
public TreeSet() { this(new TreeMap<>()); }TreeSet
HashSet hashSet = new HashSet<>(); hashSet.add("趙"); hashSet.add("錢"); hashSet.add("孫"); hashSet.add("李"); //按照哈希的順序:hashCode(),equals(Object obj) System.out.println(hashSet);//[錢, 趙, 孫, 李] LinkedHashSet linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("趙"); linkedHashSet.add("錢"); linkedHashSet.add("孫"); linkedHashSet.add("李"); //基于鏈表實現了插入的順序 System.out.println(linkedHashSet);//[趙, 錢, 孫, 李] TreeSet treeSet = new TreeSet<>(); treeSet.add("趙"); treeSet.add("錢"); treeSet.add("孫"); treeSet.add("李"); //按照compareTo()的排序 System.out.println(treeSet);//[孫, 李, 趙, 錢]四、Queue
關于隊列,是一直先進先出的線性數據結構,使用場合比較狹窄
子類常見的有PriorityQueue(優先隊列)和上文提到的LinkedList。
queue
PriorityQueue
PriorityQueue優先隊列,是基于數組實現的二叉堆來實現的特殊隊列,具有完全二叉樹的性質。
每次從優先隊列中取出來的元素要么是最大值或最小值(最大堆/最小堆)
Collection的簡單總結就醬紫
總結
以上是生活随笔為你收集整理的c++ list容器获取第n给元素_Java总结之容器家族--Collection*的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Notepad++来编写第一个HTML
- 下一篇: sqlite数据库主键自增_sqlite