⑴ java里map底層是通過什麼實現的隊列和鍵值有什麼區別
它的實現原理有些類似於二維數組,但是新的HashMap集合,是採用非同步方式來實現的,它的效率較高!老的TableMap是同步實現的的,所以現在不推薦用這個,有時間可以看看底層代碼,一看就明白了,很簡單的
⑵ Java中HashMap和TreeMap的區別深入理解
HashMap底層是用數組做的,TreeMap是基於樹做的
這么做的結果就是HashMap的數據在不停的添加的時候效率會比較低,而對於查找的效率是比較快的,TreeMap對於添加的效率是比較高的但是對於查找的效率要相對比較低一些
這里簡單從底層說一下,我就不從具體的實現上說,只從數據結構和大致的原理上來補充一下我的答案。
HashMap這個類在存儲的時候,首先根據key來計算機將要存儲的key-value映射對存儲在數組的什麼位置上,當計算出位置後就把這個映射對存儲到這個位置上。當讀取的時候,首先根據key來計算出一個位置來,到數組的相應的位置上去讀取數據,如果沒有數據,則表示此Map中不存在該映射對,若存在則直接返回。說到這里就可以解釋一下為什麼對於不停地存儲的效率相對比較低了,首先在初始化的時候對於數組的長度給了一個初始的長度,當往這裡面添加數據達到一定的程度的時候就沒法繼續添加數據了,繼續添加數據的沖突就會增大,或者沒法添加數據(這里有一個衡量的量就是裝填因子,是指這個數組中的添加的數據的個數和數組長度的比值,在java中比較合理的裝填因子數是0.75),當數據添加到這個程度的時候不能不讓用戶繼續添加數據吧,總得解決繼續添加數據的問題啊,於是提出了解決方案,即開一個更大的數組,把當前上的每一個數據重新在更大的數組上計算位置,並把數據復制過去,這樣完成的數組的擴大,看完這個我們知道,這個過程是很耗時的,所以說對於不停的存儲數據時效率是比較低的。這里有沒有一個稍微好一點的解決方案或者說不需要進行數組的擴大嗎,我們能不能一開始在初始化的時候就把數組的空間開辟的足夠大,這樣就不用在存儲的過程進行復制了,可以嗎,答案是肯定的,java給我們提供了這個在初始化的時候的方式。但是,也是有問題的那就是我們的數據不夠多,就會造成空間的浪費。有沒有一個速度即快又不浪費空間的方式呢,解決方案也有一個,那就是在開始的時候我們就能很好的預測數據的規模,這樣我們在開始的時候按照相應的規模進行初始化,這樣就很好了,實際中我們是不能很好的預測這個規模的。於是對於這種情況提出了下一個解決方案TreeMap。
TreeMap是一個基於樹的存儲結構,學過數據結構的應該知道,樹的實現方式是基於指針實現的,在Java中是用引用模擬實現的,這里大家都知道,其實樹的讀取效率並不低,這里是相對於數組的順序查找來說的,但是與HashMap的查找方式相比就有了差距,HashMap是上來先問你在哪,直接就去取數據了,TreeMap需要遍歷,也就是需要挨個詢問你是我要的東西嗎,對比一下,是就返回,不是就繼續查找,於是查找的效率就低了,但是它解決了HashMap數組擴大的時候的效率問題,就是新添加的數據可以往裡面添加,不會出現復制的情況,這里就是由於模擬的指針的緣故實現的。
其實從總體來說這兩個各有利弊,我們在使用的時候需要根據實際的需要來選擇相應的類。
⑶ 2020-01-17:java中,HashMap底層數據結構是什麼
HashMap的數據結構為:數組+(鏈表或紅黑樹)
hashmap的數據結構
為什麼採用這種結構來存儲元素呢?
數組的特點:查詢效率高,插入,刪除效率低。
鏈表的特點:查詢效率低,插入刪除效率高。
在HashMap底層使用數組加(鏈表或紅黑樹)的結構完美的解決了數組和鏈表的問題,使得查詢和插入,刪除的效率都很高~
⑷ JAVA中的HASHSET和HASHMap的底層實現是怎樣的大致講一下。
HASHSET:底層是將你加入其中的對象進行HASH排列後在放的時候,對比你放入的對象在其中是否有相同的對象存在,如果存在就不放入,反之放入。
HASHMAP:底層是將你加入其中的對象進行HASH排列後在放的時候,將key和對應的value發在一起,可以隨時用key找到value,所以其中如果你讓如相同的key但value不同時,後者value會替換前者。
所以,如果你不希望存相同的值是,用HASHSET,你希望能很方便的用key找到value時,用HASHMAP.
⑸ JAVA裡面set,map,list的區別是什麼(盡量詳細)
java集合的主要分為三種類型:
Set(集)
List(列表)
Map(映射)
要深入理解集合首先要了解下我們熟悉的數組:
數組是大小固定的,並且同一個數組只能存放類型一樣的數據(基本類型/引用類型),而JAVA集合可以存儲和操作數目不固定的一組數據。 所有的JAVA集合都位於 java.util包中! JAVA集合只能存放引用類型的的數據,不能存放基本數據類型。
簡單說下集合和數組的區別:(參考文章:《Thinking In Algorithm》03.數據結構之數組)
Java所有「存儲及隨機訪問一連串對象」的做法,array是最有效率的一種。
1、
效率高,但容量固定且無法動態改變。
array還有一個缺點是,無法判斷其中實際存有多少元素,length只是告訴我們array的容量。
2、Java中有一個Arrays類,專門用來操作array。
arrays中擁有一組static函數,
equals():比較兩個array是否相等。array擁有相同元素個數,且所有對應元素兩兩相等。
fill():將值填入array中。
sort():用來對array進行排序。
binarySearch():在排好序的array中尋找元素。
System.array():array的復制。
若撰寫程序時不知道究竟需要多少對象,需要在空間不足時自動擴增容量,則需要使用容器類庫,array不適用。所以就要用到集合。
那我們開始討論java中的集合。
集合分類:
Collection:List、Set
Map:HashMap、HashTable