Java中常用集合类对比_集合比较
生活随笔
收集整理的這篇文章主要介紹了
Java中常用集合类对比_集合比较
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| ArrayList | List | 有序 | 可重復 | 不安全 | 允許空值 | 查找效率高,添加/刪除效率低 | 使用 Collections.sort() 傳入ArrayList,會采 用默認的方式進行排序(字典序)。 自己實現 Comparator 接口,再使用 Collections.sort() 來 實現自定義排序 | 數組 | 下標索引 | 適合快速隨機查找和遍歷,不適合插入和刪除,當操作是在一列數據的后面添加數據而不是在前面或者中間,并需要隨機地訪問其中的元素時,使用ArrayList性能比較好 | 數組空間不夠,ArrayList默認擴展50%的大小。 |
| Vector | List | 有序 | 可重復 | 安全 | 允許空值 | 查找效率高,添加/刪除效率低 | - | 數組 | 下標索引 | - | 可以看做線程安全ArrayList,已棄用,由 CopyOnWriteArrayList 或者 Collections.synchronizedList 替代 |
| LinkedList | List | 有序 | 可重復 | 不安全 | 允許空值 | 查找效率底,添加/刪除效率高 | - | 雙向鏈表 | 下標索引 | 當對一列數據的前面或者中間執行添加或者刪除操作時,并且按照順序訪問其中的元素時,要使用LinkedList | LinkedList 提供了List接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用 |
| Stack | List | 有序 | 可重復 | 安全 | 允許空值 | 查找效率高,添加/刪除效率低,整體效率低 | - | 無索引 | - | 繼承自Vector,堆棧,后進先出,已棄用,由 ArrayDeque 或者 ConcurrentLinkedQueue 替代 | |
| HashMap | Map | 無序,無法保證鍵值對的順序 | key不可重復,value可重復,使用 hashCode 與 equals 方法保證key不重復 | 不安全 | 允許空值,key允許一個null,value允許多個null | HashMap通常比TreeMap、LinkedHashMap 快,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比 LinkedHashMap 慢 | - | JDK7:數組+鏈表;JDK8:數組+鏈表+紅黑樹 | 無索引 | 場景 | 遍歷使用的是Iterator迭代器,系統調用key的 hashCode() 方法得到其 hashCode 值,得到這個對象的 hashCode 值之后,系統會根據該 hashCode 值來決定key—value的存儲位置 |
| Hashtable | Map | 無序,無法保證鍵值對的順序 | key 不可重復,value 可重復,使用 hashCode 與 equals 方法保證 key 不重復 | 安全 | 不允許空值 | 整體效率低 | - | 哈希表 | 無索引 | - | 遍歷使用的是 Enumeration 列舉 |
| TreeMap | Map | 有序 | key 不可重復,value 可重復,使用 hashCode 與 equals 方法保證 key 不重復 | 不安全 | key不可以,value可以 | TreeMap通常比HashMap、Hashtable要慢, 因為TreeMap底層采用紅黑樹來管理key-value。 整體效率低 | 1. 自然排序:TreeMap 的所有 key 必須實現 Comparable 接口,而且所有的 key 應該是同一個類的對象,否則會拋出ClassCastException。 2.定制排序:創建TreeMap時,傳入一個 Comparator 對象,該對象負責對TreeMap中的所有key進行排序。 | 紅黑樹 | 無索引 | 需要基于key排序的場景 | - |
| LinkedHashMap | Map | 有序(可分為插入順序和訪問順序兩種) | key 不可重復,value 可重復,使用 hashCode() 與 equals() 方法保證 key 不重復 | 不安全 | key不可以,value可以 | LinkedHashMap比HashMap慢一點,因為它需要鏈表來維護key-value的插入順序。整體效率低 | - | 基于HashMap和雙向鏈表來實現 | 無索引 | 當我們希望有順序地去存儲 key-value時,就需要使用 LinkedHashMap | 雙向鏈表用來維護順序 |
| WeakHashMap | Map | 無序,無法保證鍵值對的順序 | key 不可重復,value 可重復,使用 hashCode 與 equals 方法保證 key 不重復 | 不安全 | 允許空值,key允許一個null,value允許多個null | - | - | 哈希表(數組+鏈表) | 無索引 | 適用于緩存的場景 | - |
| EnumMap | Map | 無序,無法保證鍵值對的順序 | key 不可重復,value 可重復 | 不安全 | 允許空值,key允許一個null,value允許多個null | 相比HashMap,EnumMap的性能和速度要快很多 | - | 數組 | 有索引(通過ordinal方法取索引) | - | - |
| IdentityHashMap | Map | 無序,無法保證鍵值對的順序 | key 可重復,value 可重復,使用 hashCode 與 equals 方法保證 key 不重復 | 不安全 | 允許空值,key允許一個null,value允許多個null | 速度要比HashMap快一點 | - | 哈希表(數組+鏈表) | 無索引 | 比如序列化、深度復制、記錄對象代理等場景;兩個對象是同一個類型的對象,而且兩個對象的數據完全相同,對于jvm來說,他們也是完全不同的,如果要用一個容器來記錄這樣的對象,就需要用 IdentityHashMap | IdentityHashMap中key能重復,因為 key 比較的方法是 ==,所以若要存放兩個相同的 key,就需要存放不同的地址 |
| Properties | Map | 無序,無法保證鍵值對的順序 | key 不可重復,value 可重復,使用 hashCode 與 equals 方法保證 key 不重復 | 不安全 | 不允許存null | - | - | 哈希表 | 無索引 | 配置文件 | Properties類表示一組持久的屬性。 Properties可以保存到流中或從流中加載。 屬性列表中的每個鍵及其對應的值都是一個字符串 |
| TreeSet | Collection | 有序 | 不可重復,同樣需要重寫 hashCode 和 equals 方法,TreeSet 判斷兩個對象不相等的方式是兩個對象通過 equals 方法返回 false,或者通過 compareTo 方法比較沒有返回 0 | 不安全 | 不允許空值 | 查找效率高,添加/刪除效率低,整體效率高 | 1.自然排序,使用 compareTo 方法來比較元 素之間大小關系,然后將元素按照 升序排列。2.定制排序,實現 Comparator 接口的compareTo 方法 | 紅黑樹,基于 TreeMap 實現 | 無索引 | 需要排序的場景 | 只能添加同一種類型的對象 |
| HashSet | Set | 無序(即存取順序不一致) | 不可重復,使用 hashCode() 與 equals() 方法保證 key 不重復 | 不安全 | 允許存null,只能存1個null | 具有良好的存取和查找性能,其性能通常都優于 TreeSet | - | 哈希表(數組+鏈表),基于 HashMap 實現 | 無索引 | 需要快速查找的場景 | - |
| LinkedHashSet | Set | 有序 | 不可重復 | 不安全 | 允許空值 | LinkedHashSet 插入性能略低于 HashSet,但在迭代訪問 Set 里的全部元素時有很好的性能 | - | 雙向鏈表和哈希表,基于 LinkedHashMap 實現 | 無索引 | - | 鏈表保證了元素的順序與存儲順序一致,哈希表保證了元素的唯一性 |
總結
以上是生活随笔為你收集整理的Java中常用集合类对比_集合比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信转账到别人银行卡可以撤销吗?
- 下一篇: Java中,为什么子类的构造方法中必须调