hashmap中的key可以是任何物件或資料型別嗎
hashtable是執行緒安全的麼
concurrenthashmap 執行緒安全嗎, concurrenthashmap如何保證 執行緒安全?
假設我們現在 hashtable 的容量為 5,已經存在了 (5,5),(13,13),(16,16),(17,17),(21,21) 這 5 個鍵值對,目前他們在 hashtable 中的位置如下:
現在,我們插入乙個新的鍵值對,put(16,22),假設 key=16 的索引為 1.但現在索引 1 的位置有兩個 entry 了,所以程式會對鍊錶進行迭代。迭代的過程中,發現其中有乙個 entry 的 key 和我們要插入的鍵值對的 key 相同,所以現在會做的工作就是將 newvalue=22 替換 oldvalue=16,然後返回 oldvalue = 16.
然後我們現在再插入乙個,put(33,33),key=33 的索引為 3,並且在鍊錶中也不存在 key=33 的 entry,所以將該節點插入鍊錶的第乙個位置。
hashtable 與 hashmap 的簡單比較
hashtable 基於 dictionary 類,而 hashmap 是基於 abstractmap。dictionary 是任何可將鍵對映到相應值的類的抽象父類,而 abstractmap 是基於 map 介面的實現,它以最大限度地減少實現此介面所需的工作。
hashmap 的 key 和 value 都允許為 null,而 hashtable 的 key 和 value 都不允許為 null。hashmap 遇到 key 為 null 的時候,呼叫 putfornullkey 方法進行處理,而對 value 沒有處理;hashtable遇到 null,直接返回 nullpointerexception。
hashtable 方法是同步,而hashmap則不是。我們可以看一下原始碼,hashtable 中的幾乎所有的 public 的方法都是 synchronized 的,而有些方法也是在內部通過 synchronized **塊來實現。所以有人一般都建議如果是涉及到多執行緒同步時採用 hashtable,沒有涉及就採用 hashmap,但是在 collections 類中存在乙個靜態方法:synchronizedmap(),該方法建立了乙個執行緒安全的 map 物件,並把它作為乙個封裝的物件來返回。
再雜湊法
j**a 集合框架的集合類,我們有時候稱之為容器。容器的種類有很多種,比如 arraylist、linkedlist、hashset...,每種容器都有自己的特點,arraylist 底層維護的是乙個陣列;linkedlist 是鍊錶結構的;hashset 依賴的是雜湊表,每種容器都有自己特有的資料結構。
因為容器的內部結構不同,很多時候可能不知道該怎樣去遍歷乙個容器中的元素。所以為了使對容器內元素的操作更為簡單,j**a 引入了迭代器模式!
把訪問邏輯從不同型別的集合類中抽取出來,從而避免向外部暴露集合的內部結構。
迭代器模式:就是提供一種方法對乙個容器物件中的各個元素進行訪問,而又不暴露該物件容器的內部細。
publicview codestatic
void
main(string args)
//使用迭代器遍歷set集合
iteratorsetit =set.iterator();
while
(setit.hasnext())
//使用迭代器遍歷linkedlist集合
iteratorlinkit =linklist.iterator();
while
(linkit.hasnext())
}
攻擊原理:
當客戶端傳送乙個請求到伺服器,如果該請求中帶有引數,伺服器端會將 引數名-引數值 作為 key-value 儲存在 hashmap 中。如果有人惡意構造請求,在請求中加入大量相同 hash 值的 string 引數名(key),那麼在伺服器端用於儲存這些 key-value 對的 hashmap 會被強行退化成煉表,如圖:
如果資料量足夠大,那麼在查詢,插入時會占用大量 cpu,達到拒絕服務攻擊的目的。
怎麼處理
限制 post 和 get 請求的引數個數
限制 post 請求的請求體大小
jdk7如何處理
hashmap 會動態的使用乙個專門 treemap 實現來替換掉它。
首先來看一下 hashmap 的 put 方法的原始碼
publicview codev put(k key, v value)
}modcount++;
addentry(hash, key, value, i);
//增加乙個新的entry到table[i]
return
null;//
如果沒有與傳入的key相等的entry,就返回null
}/**
* "按位與"來獲取陣列下標 */
static
int indexfor(int h, int
length)
hashmap 始終將自己的桶保持在2n,這是為什麼?indexfor這個方法解釋了這個問題
大家都知道計算機裡面位運算是基本運算,位運算的效率是遠遠高於取餘 % 運算的
舉個例子:2n 轉換成二進位制就是 1+n 個 0,減 1 之後就是 0+n個1,如16 -> 10000,15 -> 01111
那麼根據 & 位運算的規則,都為 1 (真)時,才為 1,那 0≤運算後的結果≤15,假設 h <= 15,那麼運算後的結果就是 h 本身,h >15,運算後的結果就是最後四位二進位製做 & 運算後的值,最終,就是 % 運算後的餘數。
當容量一定是 2n 時,h & (length - 1) == h % length
python面試指南 Python面試指南
1 python基本語法 1 staticmethod 和 classmethod python中有三種方法,例項方法 類方法 classmethod 靜態方法 staticmethod 類方法的第乙個引數是cls,表示該類的乙個例項,靜態方法基本上和乙個全域性函式相同 class a object...
SQL指南 集合
mysql select ind type cd,cust id,lname name from individual union all select bus type cd,cust id,name from business type cd cust id name ind 1 hadley ...
java面試指南
一 設計模式中的單例模式是什麼,有幾種實現方式。參考 1.單例模式特點 a 單例類只能有乙個例項。b 單例類必須自己建立自己的唯一例項。c 單例類必須給所有其他物件提供這一例項。2.常用寫法 a 懶漢式 執行緒不安全 解決方法 1 加同步synchronized 2 雙重檢查鎖定 判斷例項是否為空,...