Java知識總結--集合篇

集合(List,Set,Map)


目錄

集合(List,Set,Map)

1.1-List

1.2-Set

1.3-Map

1.4-HashMap遍歷怎麼遍歷?

1.5-HashMap使用場景

1.6- HashMap 還是 TreeMap選擇

1.7-HashMap 的實現原理

1.8-HashSet 的實現原理

1.9-實現數組和 List 之間的轉換

1.10-Array 和 ArrayList 的區別

1.11-迭代器 Iterator

1.12-Iterator的使用和特點

1.13- Iterator 和 ListIterator 的區別


1.1-List

List下有ArrayList,Vector,LinkedList,List是有序的可以重複的

       1:ArrayList

  •         底層使用的是數組,所以查詢特定的元素特別快,插入刪除慢,線程不安全
  •         初始化容量:10

       2:Vector

  •         底層使用的是數組,線程安全的
  •         初始化容量:10

       3:LinkedList

  •         底層使用的是鏈表,所以插入和刪除特別快,查詢慢

1.2-Set

無序的,不可以重複的,根據equals和hashCode判斷,就是如果一個對象要 存儲在set中,必須重寫equals和hashCode方法

1:HashSet

  • 底層是HashMap
  • 向HashSet添加元素就是把元素作爲鍵添加到底層的HashMap中

2:TreeSet

  • TreeSet實現了SortedSet接口,可以根據元素自然排序,要求集合中的元素必須是可比較的(Comparator與Comparable)
  • TreeSet底層是TreeMap
  • 向TreeSet添加元素就是把元素作爲鍵添加到底層的TreeMap中

1.3-Map

Map是按key-value對的形式存儲數據,Mapkey不允許重複

1:HashMap

  • 底層是數組+鏈表,鍵與值都可以爲null,線程不安全

2:CurrentHashMap(jdk1.5後推出的

3:HashTable

  • 底層數組+鏈表,無論key還是value都不能爲null,線程安全,效率低

1.4-HashMap遍歷怎麼遍歷?

兩種方式遍歷:使用EntrySet遍歷;使用KeySet 遍歷


1.5-HashMap使用場景

比如說讀取參數,在服務之間傳遞一些鍵值對時使用。


下面內容借鑑於:https://blog.csdn.net/qq_41701956/article/details/103253168


1.6- HashMap 還是 TreeMap選擇

對於在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。然而,假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。基於你的collection的大小,也許向HashMap中添加元素會更快,將map換爲TreeMap進行有序key的遍歷。


1.7-HashMap 的實現原理

HashMap概述: HashMap是基於哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作,並允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。 

HashMap的數據結構: 在java編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。

當我們往Hashmap中put元素時,首先根據key的hashcode重新計算hash值,根絕hash值得到這個元素在數組中的位置(下標),如果該數組在該位置上已經存放了其他元素,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數組中該位置沒有元素,就直接將該元素放到數組的該位置上。

需要注意Jdk 1.8中對HashMap的實現做了優化,當鏈表中的節點數據超過八個之後,該鏈表會轉爲紅黑樹來提高查詢效率,從原來的O(n)到O(logn)


1.8-HashSet 的實現原理

  • HashSet底層由HashMap實現

  • HashSet的值存放於HashMap的key上

  • HashMap的value統一爲PRESENT


1.9-實現數組和 List 之間的轉換

  • List轉換成爲數組:調用ArrayList的toArray方法。
  • 數組轉換成爲List:調用Arrays的asList方法。

1.10-Array 和 ArrayList 的區別

  • Array可以容納基本類型和對象,而ArrayList只能容納對象。 

  • Array是指定大小的,而ArrayList大小是固定的。 

  • Array沒有提供ArrayList那麼多功能,比如addAll、removeAll和iterator等。


1.11-迭代器 Iterator

迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱爲“輕量級”對象,因爲創建它的代價小。


1.12-Iterator的使用和特點

Java中的Iterator功能比較簡單,並且只能單向移動:

  • (1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。

  • (2) 使用next()獲得序列中的下一個元素。

  • (3) 使用hasNext()檢查序列中是否還有元素。

  • (4) 使用remove()將迭代器新返回的元素刪除。

Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。


1.13- Iterator 和 ListIterator 的區別

  • Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。 
  • Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。 
  • ListIterator實現了Iterator接口,幷包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。

//持續更新。。。。。。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章