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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java核心(十五):List、Set、Map功能分析

發布時間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java核心(十五):List、Set、Map功能分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、List、Set、Map三者關系分析 解釋一:List與Set的區別
  • List和Set都是接口繼承于Collection接口;
  • 最大的不同就是List是可以重復的。而Set是不能重復的;
  • List接口有三個實現類:LinkedList、ArrayList、Vector?,Set接口有兩個實現類:HashSet(底層由HashMap實現)、TreeSet、LinkedHashSet;
  • List適合經常追加數據、插入、刪除數據。但隨機取數效率比較低;
  • Set適合經常地隨機儲存、插入、刪除。但是在遍歷時效率比較低。
  • 解釋二:Set與Map
  • Set對每個對象只接受一次,并使用自己內部的排序方法(通常,你只關心某個元素是否屬于Set,而不關心它的順序--否則應該使用List)。
  • Map同樣對每個元素保存一份,但這是基于"鍵"的,Map也有內置的排序,因而不關心元素添加的順序。如果添加元素的順序對你很重要,應該使用LinkedHashSet或者LinkedHashMap.
  • 總結:
  • List有順序有重復沒有排序,set無重復有排序。
  • map的key也和set一樣。
  • 如果想跟List一樣需要有插入元素的順序,請使用LinkedHashSet或者LinkedHashMap。
  •   

    特別說明

  • 容器類僅能持有對象引用(指向對象的指針),而不是將對象信息copy一份至數列某位置。
  • Collection沒有get()方法,只能通過iterator()遍歷元素。Set和Collection擁有一模一樣的接口。List可以通過get()方法來一次取出一個元素。
  • 一般使用ArrayList。用LinkedList構造堆棧stack、隊列queue。
  • HashMap會利用對象的hashCode來快速找到key。說明:哈希碼就是將對象的信息經過一些轉變形成一個獨一無二的int值,這個值存儲在一個array中。我們都知道所有存儲結構中,array查找速度是最快的,所以,可以加速查找。發生碰撞時,讓array指向多個values,即,數組每個位置上又生成一個梿表。
  • LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
  • HashMap是非線程安全的,HashTable是線程安全的;
  • 二、List的功能方法   1、List接口及實現類 實際上有兩種List: 一種是基本的ArrayList,其優點在于隨機訪問元素,另一種是更強大的LinkedList,它并不是為快速隨機訪問設計的,而是具有一套更通用的方法。 List : 次序是List最重要的特點:它保證維護元素特定的順序。List為Collection添加了許多方法,使得能夠向List中間插入與移除元素(這只推薦LinkedList使用。)一個List可以生成ListIterator,使用它可以從兩個方向遍歷List,也可以從List中間插入和移除元素。 ArrayList : 由數組實現的List。允許對元素進行快速隨機訪問,但是向List中間插入與移除元素的速度很慢。ListIterator只應該用來由后向前遍歷ArrayList,而不是用來插入和移除元素。因為那比LinkedList開銷要大很多。 LinkedList : 對順序訪問進行了優化,向List中間插入與刪除的開銷并不大。隨機訪問則相對較慢。(使用ArrayList代替。)還具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 這些方法 (沒有在任何接口或基類中定義過)使得LinkedList可以當作堆棧、隊列和雙向隊列使用。   2、ArrayList 與 LinkedList 的區別和適用場景 (1)Arraylist :
    • 優點:ArrayList是實現了基于動態數組的數據結構,因為地址連續,一旦數據存儲好了,查詢操作效率會比較高(在內存里是連著放的)。
    • 缺點:因為地址連續,?ArrayList要移動數據,所以插入和刪除操作效率比較低。???
    (2)LinkedList:
    • 優點:LinkedList基于鏈表的數據結構,地址是任意的,所以在開辟內存空間的時候不需要等一個連續的地址,對于新增和刪除操作add和remove,LinedList比較占優勢。LinkedList?適用于要頭尾操作或插入指定位置的場景
    • 缺點:因為LinkedList要移動指針,所以查詢操作性能比較低。
    (3)適用場景分析:
    • ?當需要對數據進行多次訪問的情況下選用ArrayList,當需要對數據進行多次增加刪除修改時采用LinkedList。
    //ArrayList 有三個構造方法。比LinkedList多了一個指定初始容量的空列表。 ArrayList()構造一個初始容量為 10 的空列表。 ArrayList(Collection<? extends E> c)構造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的。 ArrayList(int initialCapacity)構造一個具有指定初始容量的空列表。 //LinkedList 有兩個構造方法 LinkedList()構造一個空列表。 LinkedList(Collection<? extends E> c)構造一個包含指定集合中的元素的列表,這些元素按其集合的迭代器返回的順序排列。 三、Set的功能方法   1、Set接口及實現類 Set : 存入Set的每個元素都必須是唯一的,因為Set不保存重復元素。加入Set的元素必須定義equals()方法以確保對象的唯一性。Set與Collection有完全一樣的接口。Set接口不保證維護元素的次序。 HashSet : 為快速查找設計的Set。存入HashSet的對象必須定義hashCode()。 TreeSet : 保存次序的Set, 底層為樹結構。使用它可以從Set中提取有序的序列。 LinkedHashSet : 具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。于是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。 2、HashSet?與Treeset?的區別及適用場景 (1)TreeSet:
    • TreeSet?是二差樹(紅黑樹的樹據結構)實現的,Treeset中的數據是自動排好序的,不允許放入null值?
    (2)HashSet:
    • HashSet?是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如數據庫中唯一約束?
    • HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重復。但是同一個類的對象可以放入不同的實例
    (3)?適用場景分析:
    • HashSet是基于Hash算法實現的,其性能通常都優于TreeSet。為快速查找而設計的Set,我們通常都應該使用HashSet。
    • 在我們需要排序的功能時,我們才使用TreeSet。
    四、Map的功能方法   1、Map接口及實現類 標準的Java類庫中包含了幾種不同的Map:HashMap、TreeMap、 LinkedHashMap,它們都有同樣的基本接口Map,但是行為、效率、排序策略、保存對象的生命周期和判定“鍵”等價的策略等各不相同。 執行效率是Map的一個大問題。看看get()要做哪些事,就會明白為什么在ArrayList中搜索“鍵”是相當慢的。而這正是HashMap提高速度的地方。HashMap使用了特殊的值,稱為“散列碼”(hash code),來取代對鍵的緩慢搜索。“散列碼”是“相對唯一”用以代表對象的int值,它是通過將該對象的某些信息進行轉換而生成的。所有Java對象都能產生散列碼,因為hashCode()是定義在基類Object中的方法。 HashMap就是使用對象的hashCode()進行快速查詢的。此方法能夠顯著提高性能。 Map : 維護“鍵值對”的關聯性,使你可以通過“鍵”查找“值” HashMap : Map基于散列表的實現。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設置容量capacity和負載因子load factor,以調整容器的性能。 LinkedHashMap : 類似于HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用鏈表維護內部次序。 TreeMap : 基于紅黑樹數據結構的實現。查看“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在于,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。?

    ?  2、HashMap與TreeMap、HashTable的區別及適用場景

      (1)HashMap :?

    • HashMap?非線程安全??
    • HashMap:基于哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。?

    ?  (2)TreeMap :?

    • TreeMap:非線程安全基于紅黑樹實現。
    • TreeMap沒有調優選項,因為該樹總處于平衡狀態。?

    ?  (3)適用場景分析:

    • HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允許空鍵值,而HashTable不允許。
    • HashMap:適用于Map中插入、刪除和定位元素。?
    • Treemap:適用于按自然順序或自定義順序遍歷鍵(key)。

      (3)推薦閱讀:HashMap的底層實現

    • 漫畫:什么是HashMap?

    • 高并發下的HashMap,在ReHash的時候可能會出現鏈表環,導致查詢可能會出現死循環

    以上文章,部分內容轉載自CSDN: 作者:星眸之心 原文:https://blog.csdn.net/wangguidong520/article/details/51038574

    作者:安卓之夜 原文:https://blog.csdn.net/qq_22118507/article/details/51576319

    ?

    轉載于:https://www.cnblogs.com/newbie27/p/10568784.html

    總結

    以上是生活随笔為你收集整理的java核心(十五):List、Set、Map功能分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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