日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ list容器获取第n给元素_Java总结之容器家族--Collection*

發布時間:2025/3/15 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 List

1.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*的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。