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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA常用的数据结构集合框架总结

發布時間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA常用的数据结构集合框架总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

java.util包中三個重要的接口及特點:List(列表)、Set(保證集合中元素唯一)、Map(維護多個key-value鍵值對,保證key唯一)。其不同子類的實現各有差異,如是否同步(線程安全)、是否有序。

常用類繼承樹:

以下結合源碼講解常用類實現原理及相互之間的差異。

Collection (所有集合類的接口)
List、Set都繼承自Collection接口,查看JDK API,操作集合常用的方法大部分在該接口中定義了。

?

Collections (操作集合的工具類)
對于集合類的操作不得不提到工具類Collections,它提供了許多方便的方法,如求兩個集合的差集、并集、拷貝、排序等等。
由于大部分的集合接口實現類都是不同步的,可以使用Collections.synchronized*方法創建同步的集合類對象。
如創建一個同步的List:
List synList = Collections.synchronizedList(new ArrayList());
其實現原理就是重新封裝new出來的對象,操作對象時用關鍵字synchronized同步。看源碼很容易理解。
Collections部分源碼:

static class SynchronizedCollection<e> implements Collection<e>, Serializable {final Collection<e> c; // Backing Collectionfinal Object mutex; // Object on which to synchronizeSynchronizedCollection(Collection<e> c) {if (c==null)throw new NullPointerException();this.c = c;mutex = this;}//...public boolean add(E e) {//操作集合時簡單調用原本的ArrayList對象,只是做了同步synchronized (mutex) {return c.add(e);}}//... }

List (列表)

ArrayList、Vector是線性表,使用Object數組作為容器去存儲數據的,添加了很多方法維護這個數組,使其容量可以動態增長,極大地提升了開發效率。它們明顯的區別是ArrayList是非同步的,Vector是同步的。不用考慮多線程時應使用ArrayList來提升效率。
ArrayList、Vector 部分源碼:

public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!//可以看出添加的對象放到elementData數組中去了elementData[size++] = e;return true; } //ArrayList.remove public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;if (numMoved > 0)//移除元素時數組產生的空位由System.arraycopy方法將其后的所有元素往前移一位,System.arraycopy調用虛擬機提供的本地方法來提升效率System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // Let gc do its workreturn oldValue; }//Vector add方法上多了synchronized關鍵字 public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true; }


LinkedList是鏈表,略懂數據結構就知道其實現原理了。鏈表隨機位置插入、刪除數據時比線性表快,遍歷比線性表慢。
雙向鏈表原理圖:

LinkedList部分源碼:

public class LinkedList<e> extends AbstractSequentialList<e> implements List<e>, Deque<e>, Cloneable, java.io.Serializable {//頭尾節點transient Node<e> first;transient Node<e> last; } //節點類private static class Node<e> {//節點存儲的數據E item;Node<e> next;Node<e> prev;Node(Node<e> prev, E element, Node<e> next) {this.item = element;this.next = next;this.prev = prev;} }

由此可根據實際情況來選擇使用ArrayList(非同步、非頻繁刪除時選擇)、Vector(需同步時選擇)、LinkedList(頻繁在任意位置插入、刪除時選擇)。

Map(存儲鍵值對,key唯一)

HashMap結構的實現原理是將put進來的key-value封裝成一個Entry對象存儲到一個Entry數組中,位置(數組下標)由key的哈希值與數組長度計算而來。如果數組當前下標已有值,則將數組當前下標的值指向新添加的Entry對象。
有點暈,看圖吧:

?

看完圖再看源碼,非常清晰,都不需要注釋。

public class HashMap<k,v> extends AbstractMap<k,v> implements Map<k,v>, Cloneable, Serializable {transient Entry<k,v>[] table;public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key);int i = indexFor(hash, table.length);//遍歷當前下標的Entry對象鏈,如果key已存在則替換for (Entry<k,v> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}addEntry(hash, key, value, i);return null;} } static class Entry<k,v> implements Map.Entry<k,v> {final K key;V value;Entry<k,v> next;int hash; }

TreeMap是由Entry對象為節點組成的一顆紅黑樹,put到TreeMap的數據默認按key的自然順序排序,new TreeMap時傳入Comparator自定義排序。紅黑樹網上很多資料,我講不清,這里就不介紹了。

Set(保證容器內元素唯一性)
之所以先講Map是因為Set結構其實就是維護一個Map來存儲數據的,利用Map結構key值唯一性
HashSet部分源碼:

public class HashSet<e> extends AbstractSet<e> implements Set<e>, Cloneable, java.io.Serializable { //無意義對象來作為Map的value private static final Object PRESENT = new Object();public boolean add(E e) {return map.put(e, PRESENT)==null;} }


HashMap 支持key=null 但是 Hashtable 不支持 key =null

HashMap和Hashtable的區別

HashMap和Hashtable都實現了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。

  • HashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
  • HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
  • 另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。
  • 由于Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。
  • HashMap不能保證隨著時間的推移Map中的元素次序是不變的。
  • 要注意的一些重要術語:

    1) sychronized意味著在一次僅有一個線程能夠更改Hashtable。就是說任何線程要更新Hashtable時要首先獲得同步鎖,其它線程要等到同步鎖被釋放之后才能再次獲得同步鎖更新Hashtable。

    2) Fail-safe和iterator迭代器相關。如果某個集合對象創建了Iterator或者ListIterator,然后其它的線程試圖“結構上”更改集合對象,將會拋出ConcurrentModificationException異常。但其它線程可以通過set()方法更改集合對象是允許的,因為這并沒有從“結構上”更改集合。但是假如已經從結構上進行了更改,再調用set()方法,將會拋出IllegalArgumentException異常。

    3) 結構上的更改指的是刪除或者插入一個元素,這樣會影響到map的結構。

    我們能否讓HashMap同步?

    HashMap可以通過下面的語句進行同步:
    Map m = Collections.synchronizeMap(hashMap);

    結論

    Hashtable和HashMap有幾個主要的不同:線程安全以及速度。僅在你需要完全的線程安全的時候使用Hashtable,而如果你使用Java 5或以上的話,請使用ConcurrentHashMap吧。



    HashSet、TreeSet分別默認維護一個HashMap、TreeMap。


    匯總與網絡,供自己學習使用。

    總結

    以上是生活随笔為你收集整理的JAVA常用的数据结构集合框架总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 伊人资源网 | 国产女主播在线一区二区 | 日韩av一二区| av三级在线播放 | 成人在线综合 | 亚洲国产成人精品女人久久 | 丁香花高清在线观看完整动漫 | 香蕉视频亚洲 | 欧美日本另类 | 欧美一区二区三区不卡视频 | 日本在线中文 | 久久经典 | 欧美黄色免费大片 | 亚洲自拍天堂 | 小色瓷导航 | 国产精品1区2区3区 在线看黄的网站 | av久久久 | 国产精品av在线 | 啪啪网视频| av福利片| 欧美日韩综合一区二区三区 | 大陆女明星乱淫合集 | 欧美人一级淫片a免费播放 西方av在线 | 精品日韩一区二区三区四区 | 欧美日韩在线观看免费 | 91av在线免费 | av高清一区 | 青娱乐在线播放 | 丰满大乳奶做爰ⅹxx视频 | 一区久久久 | 公交上高潮的丁芷晴 | 激情国产一区 | 精品成在人线av无码免费看 | 福利二区| 久热在线 | 欧美人妻精品一区二区 | 国产色中色 | xfplay5566色资源网站 | 亚洲a一区 | 伊人超碰在线 | 久久99精品久久久久久园产越南 | 欧美亚洲不卡 | 午夜剧场免费在线观看 | 欧美日韩精品亚洲精品 | 久射网| 亚洲污片| 91官网在线 | 色窝窝无码一区二区三区成人网站 | 欧美精品黑人猛交高潮 | 国产在线视频你懂的 | 91在线看视频 | 日本黄色一级视频 | 日本人和亚洲人zjzjhd | 久草中文在线 | 美女啪啪国产 | 欧美日韩一卡二卡 | 亚洲欧美一区二区三区 | 在线观看网址你懂的 | wwwxxx日韩| 韩国三级hd中文字幕有哪些 | 一起操在线观看 | 色妞欧美 | 免费国产羞羞网站视频 | 国产午夜精品一区二区三区视频 | www.av在线| 天天摸日日摸狠狠添 | 蜜臀999| 伦理自拍| 精品国产av一区二区 | 一区小视频 | 91成人免费看 | 免费黄色网址在线观看 | 国产激情久久久久 | 日本高清视频在线播放 | 国产精品久久久久久久久久久久久久久久久久 | 日本三级大全 | 伦理自拍 | jizzjizz欧美69巨大 | 国产伦精品一区二区三区在线观看 | 日韩电影在线观看一区二区 | 国产精品一区av | 日本久久中文字幕 | 老熟女毛茸茸浓毛 | 久久高清无码视频 | 探花国产在线 | 精品在线免费观看 | 久色99| 亚洲精品欧美激情 | 日韩一区二区毛片 | 国产高清一区 | 午夜福利啪啪片 | 成人在线观看91 | 亚洲综合成人网 | 欧美午夜精品一区二区三区 | 日韩一级二级视频 | 蜜桃av在线 | 玖玖zyz | 黄网站色视频 | 在线观看中文字幕 |