List、Set和Map的區別


一、結構特點
List和Set是存儲單列數據的集合,Map是存儲鍵和值這樣的雙列數據的集合;
List中存儲的數據是有順序,並且允許重復; Map中存儲的數據是無序的,其鍵是不能重復的,但是值是可以重復的;Set中存儲的數據是無序的,且不允許有重復,但元素在集合中的位置由元素的hashCode決定,
位置是固定的(Set 根據hashcode來進行數據的存儲,所以位置是固定的,但是位置不是用戶可以控制的,所以對於用戶來說
set 中的元素還是無序的); 二、實現類 List接口有三個實現類 LinkedList:基於鏈表實現,鏈表內存是散亂的,每一個元素存儲本身內存地址的同時還存儲下一個元素的地址。
鏈表增刪快,查找慢; ArrayList:基於數組實現,非線程安全的,效率高,便於索引,但不便於插入刪除; Vector:基於數組實現,線程安全的,效率低 Map接口有三個實現類 HashMap:基於 hash 表的 Map 接口實現,非線程安全,高效,支持
null 值和 null鍵;
底層實現:HashMap底層整體結構是一個數組,數組中的每個元素又是一個鏈表。每次添加一個對象(put)時會產生一個鏈表對象(Object類型),Map中的每個Entry就是數組中的一個元素(Map.Entry就是一個<Key,Value>),
它具有由當前元素指向下一個元素的引用,這就構成了鏈表。 存儲原理:當向HsahMap中添加元素的時候,首先計算Key對象的Hash值,得到數組下標,如果數組該位置為空則插入,否則遍歷這個位置鏈表。當某個節點Key對象和Node對象均和新元素的equals時,
用新元素的Value對象替換該節點的Value對象,否則插入新節點。(注意:JDK 8之后加入了紅黑樹) HashTable:線程安全,低效,不支持
null 值和 null 鍵; LinkedHashMap:
是 HashMap 的一個子類,保存了記錄的插入順序; SortMap 接口: TreeMap,能夠把它保存的記錄根據鍵排序,默認是鍵值的升序排序;
Set接口有兩個實現類 HashSet:底層是由 HashMap 實現,不允許集合中有重復的值,使用該方式時需要重寫 equals()和 hashCode()方法; LinkedHashSet:繼承與 HashSet,同時又基於 LinkedHashMap 來進行實現,底層使用的是 LinkedHashMap; 三、區別 List 集合中對象按照索引位置排序,可以有重復對象,允許按照對象在集合中的索引位置檢索對象,例如通過list.
get(i)方法來獲取集合中的元素; Map 中的每一個元素包含一個鍵和一個值,成對出現,鍵對象不可以重復,值對象可以重復; Set 集合中的對象不按照特定的方式排序,並且沒有重復對象,但它的實現類能對集合中的對象按照特定的方式排序,例如 TreeSet 類,可以按照默認順序,也可以通過實現 Java.util.Comparator<Type>接口來自定義排序方式 ———————————————— 原文鏈接:https://blog.csdn.net/qq_42494445/article/details/83931345

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM