日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java集合学习系列】HashMap实现原理及源码分析

發(fā)布時間:2024/4/14 java 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java集合学习系列】HashMap实现原理及源码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HashMap特性

hashMap是基于哈希表的Map接口的非同步實現(xiàn),繼承自AbstractMap接口,實現(xiàn)了Map接口(HashTable跟HashMap很像,HashTable中的方法是線程安全的,也就是同步的,而HashMap是非同步的,這是唯一的區(qū)別),此實現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。

HashMap的數(shù)據(jù)結構

HashMap是基于hashing的原理,實際上就是一個“鏈表的數(shù)組”的數(shù)據(jù)結構,每個元素存放在鏈表頭結點的數(shù)組,即數(shù)組和鏈表的結合體—哈希表。

PS:數(shù)組的特點是尋址容易,但是插入和刪除困難;鏈表的特點是尋址困難,但是插入和刪除容易。哈希表就是綜合了這兩者特性的一種數(shù)據(jù)結構,尋址容易,插入和刪除也容易。

下面我們就結合哈希表的一種常用實現(xiàn)-拉鏈法來學習一下哈希表的使用:

拉鏈法:將具有同一散列地址的記錄存儲在一條線性鏈表中。在除留余數(shù)法中,取關鍵字被某個不大于哈希表長m的數(shù)p除后所得余數(shù)為我們需要的哈希地址。
H(key) = key MOD p(p <= m)
比如,以上length為16的數(shù)組,每個數(shù)組元素存儲的都是一個鏈表的頭結點。設關鍵字為(12,28,108,140),除數(shù)為16(小于等于16),散列地址為(12,12,12,12),所以(12,28,108,140)都存儲在數(shù)組下標為12的位置。

從以上我們可以看出HashMap存儲數(shù)據(jù)結構的容器就是一個線性數(shù)組。說到這里,我們知道HashMap是按鍵值對來存取數(shù)據(jù)的,但是線性數(shù)組怎么實現(xiàn)按鍵值對存取數(shù)據(jù)?

看HashMap的源碼我們知道,HashMap里面實現(xiàn)了一個靜態(tài)內(nèi)部類Entry,Entry的主要屬性key、value、next??吹竭@里就明白了,原來HashMap按照鍵值對存取數(shù)據(jù)是通過Entry這個基礎bean來實現(xiàn)的。再回頭看我們上面說的線性數(shù)組實現(xiàn)按鍵值對存取數(shù)據(jù),這個線性數(shù)組就是Entry[],Map中的數(shù)據(jù)都保存在線性數(shù)組Entry中。數(shù)組中的每一項又是一個鏈表,當新建一個HashMap的時候,就會初始化一個數(shù)組。其中Entry就是數(shù)組中的元素,每個Map.Entry其實就是一個key-value對,它持有一個指向下一個元素的引用next,這就構成了鏈表,如下圖。

數(shù)組是HashMap的主體,鏈表則是主要為了解決哈希沖突而存在的,如果定位到的數(shù)組位置不含鏈表(當前entry的next指向null),那么對于查找,添加等操作很快,僅需一次尋址即可;如果定位到的數(shù)組包含鏈表,對于添加操作,其時間復雜度依然為O(1),因為最新的Entry會插入鏈表頭部,急需要簡單改變引用鏈即可,而對于查找操作來講,此時就需要遍歷鏈表,然后通過key對象的equals方法逐一比對查找。所以,性能考慮,HashMap中的鏈表出現(xiàn)越少,性能才會越好。

static class Entry<K,V> implements Map.Entry<K,V> {final K key;V value;Entry<K,V> next;int hash;/*** Creates new entry.*/Entry(int h, K k, V v, Entry<K,V> n) {value = v;next = n;key = k;hash = h;}public final K getKey() {return key;}public final V getValue() {return value;}public final V setValue(V newValue) {V oldValue = value;value = newValue;return oldValue;}public final boolean equals(Object o) {if (!(o instanceof Map.Entry))return false;Map.Entry e = (Map.Entry)o;Object k1 = getKey();Object k2 = e.getKey();if (k1 == k2 || (k1 != null && k1.equals(k2))) {Object v1 = getValue();Object v2 = e.getValue();if (v1 == v2 || (v1 != null && v1.equals(v2)))return true;}return false;}public final int hashCode() {return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());}public final String toString() {return getKey() + "=" + getValue();}/*** This method is invoked whenever the value in an entry is* overwritten by an invocation of put(k,v) for a key k that's already* in the HashMap.*/void recordAccess(HashMap<K,V> m) {}/*** This method is invoked whenever the entry is* removed from the table.*/void recordRemoval(HashMap<K,V> m) {}}

HashMap的存取實現(xiàn)

我們上面說到HashMap是線性數(shù)組,因為我們知道HashMap可以隨機存取,線性數(shù)組實現(xiàn)隨機存取?HashMap是怎么實現(xiàn)的呢?我們看下下面的算法:

//存儲時 int hash = key.hashCode();// 每個key的hash是一個固定的int值 int index = hash % Entry[].length; Entry[index] = value; //取值時 int hash = key.hashCode(); int index = hash % Entry[].length; return Entry[index];

這就是HashMap通過鍵值對實現(xiàn)存取的基本原理。

我們看下源碼:
存儲:

public V put(K key, V value) {if (table == EMPTY_TABLE) {inflateTable(threshold);}//HashMap允許存放null key和null value,當key為null時,調(diào)用putForNullKey方法,將value放到數(shù)組第一個位置if (key == null)return putForNullKey(value);//計算hash值int hash = hash(key);//搜素指定的hash值所對應的table中的索引int i = indexFor(hash, table.length);//如果索引i處的Entry不為null,通過不斷遍歷元素e的下一個元素,直到找到索引i處的Entry為null,表明此處還沒有Entryfor (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;//modCount記錄HashMap中修改結構的次數(shù)//將key、value添加到索引i處addEntry(hash, key, value, i);return null; }

當我們向HashMap中put元素的時候,先根據(jù)key值計算hashcode,然后根據(jù)hash值得到這個元素在數(shù)組中的位置(下標)。如果數(shù)組的相應位置已經(jīng)存放了元素,則在該位置上的元素以鏈表的形式存放,新加入的元素存放在鏈表的頭部,最先加入的元素存放在鏈表的尾部。如果數(shù)組的該位置上沒有元素,就直接將該元素放到此數(shù)組的該位置上。

void addEntry(int hash, K key, V value, int bucketIndex) {//如果Map中的key-value對的數(shù)量超過了極限或者bucketIndex索引不存在,將table對象的長度擴充到原來的2倍if ((size >= threshold) && (null != table[bucketIndex])) {resize(2 * table.length);hash = (null != key) ? hash(key) : 0;bucketIndex = indexFor(hash, table.length);}//添加EntrycreateEntry(hash, key, value, bucketIndex); }void createEntry(int hash, K key, V value, int bucketIndex) {//獲取指定bucketIndex所引處的EntryEntry<K,V> e = table[bucketIndex];//將新建的Entry放入bucketIndex索引處,并讓新的Entry指向原來的Entrytable[bucketIndex] = new Entry<>(hash, key, value, e);size++; }

根據(jù)hash值調(diào)用addEntry(hash,key,value,i)方法將key、value值鍵值對存儲在數(shù)組table的i索引處。從源碼中我們可以看到,當系統(tǒng)決定存儲HashMap中的key、value鍵值對的時候,沒有有關value的操作,只是根據(jù)key來計算每個Entry的存儲位置。也就是說,當系統(tǒng)決定了key存儲的位置之后,value也就隨之保存了。

上面的hash(int h)方法根據(jù)key值重新計算了一次散列。此算法加入了高位計算,防止低位不變,高位變化時造成的hash沖突。

final int hash(Object k) {int h = hashSeed;if (0 != h && k instanceof String) {return sun.misc.Hashing.stringHash32((String) k);}h ^= k.hashCode();// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4); }

我們可以看到,在上面我們是使用hash算法根據(jù)key來求得元素在對應數(shù)組中的位置。因為我們知道HashMap的數(shù)據(jù)結構是數(shù)組和鏈表的結合,如果HashMap里面的元素位置分布得比較均勻,每個位置上的元素數(shù)量只有一個,那么當我們用hash算法求位置的時候,馬上就可以知道對應位置的元素是不是我們需要的,而不需要再去遍歷鏈表,這樣能大大優(yōu)化查詢效率。

對于任意對象。只要它的key值相同,

int hash = hash(key); int i = indexFor(hash, table.length);

調(diào)用hash算法求得的hash值就是相同的。我們上面提到過的拉鏈法是值對表長度取模,在這里如果使用hash值對數(shù)組長度取模,元素的分配相對來說也會比較均勻。但是“?!边\算的消耗比較大,HashMap是怎么解決這個問題的呢?

HashMap使用了indexFor(int h,int length)方法來計算該對象應該保存在table數(shù)組的哪個索引處,方法如下:

/*** Returns index for hash code h.*/ static int indexFor(int h, int length) {// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";return h & (length-1); }

我們注意到注釋里面有一行:table的長度length必須是2的非零冪??吹竭@里,我們需要提到另一個知識點,HashMap底層數(shù)組的長度總是2的n次方,這是HashMap在速度上的優(yōu)化。

看下HashMap的putAll方法的源碼:

public void putAll(Map<? extends K, ? extends V> m) {int numKeysToBeAdded = m.size();if (numKeysToBeAdded == 0)return;if (table == EMPTY_TABLE) {inflateTable((int) Math.max(numKeysToBeAdded * loadFactor, threshold));}if (numKeysToBeAdded > threshold) {int targetCapacity = (int)(numKeysToBeAdded / loadFactor + 1);if (targetCapacity > MAXIMUM_CAPACITY)targetCapacity = MAXIMUM_CAPACITY;int newCapacity = table.length;while (newCapacity < targetCapacity)newCapacity <<= 1;if (newCapacity > table.length)resize(newCapacity);}for (Map.Entry<? extends K, ? extends V> e : m.entrySet())put(e.getKey(), e.getValue()); }

我們注意到有這么一行:

while (newCapacity < targetCapacity)newCapacity <<= 1;

PS:
int i = 1;
//類似于 i++就是 i = i+1;的這結構
i <<= 1;//i = i<<1 i等于i乘以2的1次方
i <<= 2;//i = i<<2 i等于i乘以2的2次方,>>就是相除了

這段代碼在JDK1.7之前出現(xiàn)在HashMap的構造函數(shù)中,保證了初始化HashMap的容量(即底層數(shù)組的長度)總是2的n次方。

擴容的時候也有一個方法:

private static int roundUpToPowerOf2(int number) {// assert number >= 0 : "number must be non-negative";return number >= MAXIMUM_CAPACITY? MAXIMUM_CAPACITY: (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1; }

當length總是 2 的n次方時,h& (length-1)運算等價于對length取模,也就是h%length,但是&比%具有更高的效率。

這看上去很簡單,其實比較有玄機的,我們舉個例子來說明:

假設數(shù)組長度分別為15和16,優(yōu)化后的hash碼分別為8和9,那么&運算后的結果如下:

h & (table.length-1) | hash | table.length-1

8 & (15-1): | 0100 & 1110 = 0100

9 & (15-1): | 0101 & 1110 = 0100


8 & (16-1): | 0100 & 1111 = 0100

9 & (16-1): | 0101 & 1111 = 0101


從上面的例子中可以看出:當8、9兩個數(shù)和(15-1)2=(1110)進行“與運算&”的時候,產(chǎn)生了相同的結果,都為0100,也就是說它們會定位到數(shù)組中的同一個位置上去,這就產(chǎn)生了碰撞,8和9會被放到數(shù)組中的同一個位置上形成鏈表,那么查詢的時候就需要遍歷這個鏈 表,得到8或者9,這樣就降低了查詢的效率。同時,我們也可以發(fā)現(xiàn),當數(shù)組長度為15的時候,hash值會與(15-1)2=(1110)進行“與運算&”,那么最后一位永遠是0,而0001,0011,0101,1001,1011,0111,1101這幾個位置永遠都不能存放元素了,空間浪費相當大,更糟的是這種情況中,數(shù)組可以使用的位置比數(shù)組長度小了很多,這意味著進一步增加了碰撞的幾率,減慢了查詢的效率!

  而當數(shù)組長度為16時,即為2的n次方時,2n-1得到的二進制數(shù)的每個位上的值都為1(比如(24-1)2=1111),這使得在低位上&時,得到的和原h(huán)ash的低位相同,加之hash(int h)方法對key的hashCode的進一步優(yōu)化,加入了高位計算,就使得只有相同的hash值的兩個值才會被放到數(shù)組中的同一個位置上形成鏈表。

  所以說,當數(shù)組長度為2的n次冪的時候,不同的key算得得index相同的幾率較小,那么數(shù)據(jù)在數(shù)組上分布就比較均勻,也就是說碰撞的幾率小,相對的,查詢的時候就不用遍歷某個位置上的鏈表,這樣查詢效率也就較高了。

讀取:

public V get(Object key) {if (key == null)return getForNullKey();Entry<K,V> entry = getEntry(key);return null == entry ? null : entry.getValue(); }private V getForNullKey() {if (size == 0) {return null;}for (Entry<K,V> e = table[0]; e != null; e = e.next) {if (e.key == null)return e.value;}return null; }final Entry<K,V> getEntry(Object key) {if (size == 0) {return null;}int hash = (key == null) ? 0 : hash(key);for (Entry<K,V> e = table[indexFor(hash, table.length)];e != null;e = e.next) {Object k;if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))return e;}return null; }

總結起來,從HashMap中get元素的時候,會首先計算key的hash值,找到數(shù)組中對應位置的元素,然后通過equals比較key值從而找出需要的元素,

HashMap的存取歸納來說,就是HashMap 在底層將 key-value 當成一個整體進行處理,這個整體就是一個 Entry 對象。HashMap 底層采用一個 Entry[] 數(shù)組來保存所有的 key-value 對,當需要存儲一個 Entry 對象時,會根據(jù)hash算法來決定其在數(shù)組中的存儲位置,在根據(jù)equals方法決定其在該數(shù)組位置上的鏈表中的存儲位置;當需要取出一個Entry時,也會根據(jù)hash算法找到其在數(shù)組中的存儲位置,再根據(jù)equals方法從該位置上的鏈表中取出該Entry。

HashMap的resize(rehash)

  當HashMap中的元素越來越多的時候,hash沖突的幾率也就越來越高,因為數(shù)組的長度是固定的。所以為了提高查詢的效率,就要對HashMap的數(shù)組進行擴容,數(shù)組擴容這個操作也會出現(xiàn)在ArrayList中,這是一個常用的操作,而在HashMap數(shù)組擴容之后,最消耗性能的點就出現(xiàn)了:原數(shù)組中的數(shù)據(jù)必須重新計算其在新數(shù)組中的位置,并放進去,這就是resize。

  那么HashMap什么時候進行擴容呢?當HashMap中的元素個數(shù)超過數(shù)組大小*loadFactor時,就會進行數(shù)組擴容,loadFactor的默認值為0.75,這是一個折中的取值。也就是說,默認情況下,數(shù)組大小為16,那么當HashMap中元素個數(shù)超過16*0.75=12(這個值就是代碼中的threshold值,也叫做臨界值)的時候,就把數(shù)組的大小擴展為 2*16=32,即擴大一倍,然后重新計算每個元素在數(shù)組中的位置,而這是一個非常消耗性能的操作,所以如果我們已經(jīng)預知HashMap中元素的個數(shù),那么預設元素的個數(shù)能夠有效的提高HashMap的性能。

void resize(int newCapacity) {Entry[] oldTable = table;int oldCapacity = oldTable.length;//如果當前數(shù)組的長度已經(jīng)達到最大值則不進行調(diào)整if (oldCapacity == MAXIMUM_CAPACITY) {threshold = Integer.MAX_VALUE;return;}//根據(jù)入?yún)⒌拈L度定義新數(shù)組Entry[] newTable = new Entry[newCapacity];//按照最新的規(guī)則,將舊數(shù)組中的元素轉移到新數(shù)組transfer(newTable, initHashSeedAsNeeded(newCapacity));table = newTable;//更新臨界值threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1); }/*** Transfers all entries from current table to newTable.*/ void transfer(Entry[] newTable, boolean rehash) {//生成的新數(shù)組的長度int newCapacity = newTable.length;//遍歷舊數(shù)組取值放入新數(shù)組for (Entry<K,V> e : table) {while(null != e) {Entry<K,V> next = e.next;if (rehash) {e.hash = null == e.key ? 0 : hash(e.key);}int i = indexFor(e.hash, newCapacity);e.next = newTable[i];newTable[i] = e;e = next;}} }

HashMap構造函數(shù):

其中有兩個要注意的性能參數(shù):initialCapacity(初始容量), loadFactor(負載因子)。

/*** 構建一個初始容量為16,,負載因子為0.75的HashMap** initialCapacity:HashMap的最大容量,即為底層數(shù)組的長度,默認為16.* loadFactor:負載因子loadFactor定義為:散列表的實際元素數(shù)目(n)/ 散列表的容量(m),默認為0.75.*/ public HashMap() {this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); }/*** 構建一個初始容量為initialCapacity,,負載因子為0.75的HashMap*/ public HashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR); }/*** 構建一個指定初始容量和指定負載因子的HashMap*/ public HashMap(int initialCapacity, float loadFactor) {if (initialCapacity < 0)throw new IllegalArgumentException("Illegal initial capacity: " +initialCapacity);if (initialCapacity > MAXIMUM_CAPACITY)initialCapacity = MAXIMUM_CAPACITY;if (loadFactor <= 0 || Float.isNaN(loadFactor))throw new IllegalArgumentException("Illegal load factor: " +loadFactor);this.loadFactor = loadFactor;threshold = initialCapacity;//臨界值init(); }

負載因子衡量的是一個散列表的空間的使用程度,負載因子越大表示散列表的裝填程度越高,反之愈小。對于使用鏈表法的散列表來說,查找一個元素的平均時間是O(1+a),因此如果負載因子越大,對空間的利用更充分,然而后果是查找效率的降低;如果負載因子太小,那么散列表的數(shù)據(jù)將過于稀疏,對空間造成嚴重浪費。

threshold臨界值就是在此loadFactor和capacity對應下允許的最大元素數(shù)目,超過這個數(shù)目就重新resize,以降低實際的負載因子。當容量超出最大容量時,resize后的HashMap容量是現(xiàn)有容量的兩倍,addEntry方法中有這樣一段代碼:

if ((size >= threshold) && (null != table[bucketIndex])) {resize(2 * table.length);

ConcurrentModificationException

java.util.HashMap不是線程安全的(為什么HashMap不是線程安全的),如果在使用迭代器的過程中有其它線程修改了map,就會拋出ConcurrentModificationException。

關于這個異常,我們需要學習HashMap源碼的一個抽象內(nèi)部類HashIterator,這牽涉到fail-fast策略。這一策略在源碼中的實現(xiàn)是通過modCount。在上面的學習中我們知道m(xù)odCount是記錄的修改次數(shù),每次對HashMap內(nèi)容的修改,這個值都會增加。在迭代器初始化的過程中會將這個值賦值給迭代器的expectedModCount。在迭代過程中,判斷modCount跟expectedModCount是否相等,如果不相等就表示已經(jīng)有其他線程修改了Map??戳嗽创a我們就會知道,modCount聲明為volatile,保證線程之間修改的可見性。(volatile之所以線程安全是因為被volatile修飾的變量不保存緩存,直接在內(nèi)存中修改,因此能夠保證線程之間修改的可見性)。

private abstract class HashIterator<E> implements Iterator<E> {Entry<K,V> next; // next entry to returnint expectedModCount; // For fast-failint index; // current slotEntry<K,V> current; // current entryHashIterator() {expectedModCount = modCount;if (size > 0) { // advance to first entryEntry[] t = table;while (index < t.length && (next = t[index++]) == null);}}public final boolean hasNext() {return next != null;}final Entry<K,V> nextEntry() {if (modCount != expectedModCount)throw new ConcurrentModificationException();Entry<K,V> e = next;if (e == null)throw new NoSuchElementException();if ((next = e.next) == null) {Entry[] t = table;while (index < t.length && (next = t[index++]) == null);}current = e;return e;}public void remove() {if (current == null)throw new IllegalStateException();if (modCount != expectedModCount)throw new ConcurrentModificationException();Object k = current.key;current = null;HashMap.this.removeEntryForKey(k);expectedModCount = modCount;} }

重寫equals方法需同時重寫hashCode方法

在此之前我們先來看一下java中==和equals的區(qū)別:

String str1=new String("apple"); String str2=new String("apple");str1==str2;//false str1.equals(str2);//true

結果解析:==比較的是兩個對象的地址,equals比較的是兩個對象的內(nèi)容.

如果一個類沒有自己定義equals方法,那么它將繼承Object類的equals方法,Object類的equals方法的實現(xiàn)代碼如下:

boolean equals(Object o){return this==o; }

這說明,如果一個類沒有自己定義equals方法,它默認的equals方法(從Object 類繼承的)就是使用==操作符,也是在比較兩個變量指向的對象是否是同一對象,這時候使用equals和使用==會得到同樣的結果,如果比較的是兩個獨立的對象則總返回false

總結來說:

1)對于==,如果作用于基本數(shù)據(jù)類型的變量,則直接比較其存儲的 “值”是否相等;如果作用于引用類型的變量,則比較的是所指向的對象的地址

2)對于equals方法,注意:equals方法不能作用于基本數(shù)據(jù)類型的變量。如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址;諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內(nèi)容。

下面我們來看,為什么重寫equals方法時必須要重寫hashCode方法:

在使用HashMap添加對象時,hashCode()方法會被調(diào)用,判斷與已經(jīng)存儲在集合中對象的hashCode值是否一致。如果不一致則直接加進去(不用比較equals()提高效率);如果一致,則進行equals方法的比較,如果返回true,說明集合中已經(jīng)存在這個對象,不能添加。如果返回false,表名集合中沒有這個對象,可以加進去。所以,在重寫hashCode()方法或者equals()方法的任何一個方法時,都必須重寫另外一個。

object對象中默認的public boolean equals(Object obj),對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 true。Object默認的hashCode散列碼是對象的存儲地址,對象不同其所調(diào)用的hashCode方法所得到的值也不同

equals()方法和hashCode()方法有一個常規(guī)協(xié)定,如下:

(1)當obj1.equals(obj2)為true時,obj1.hashCode() == obj2.hashCode()必須為true【同一個對象的hashCode必須相等】

(2)當obj1.hashCode() == obj2.hashCode()為false時,obj1.equals(obj2)必須為false【hashCode不相等的兩個對象一定不是同一個對象】

如果不重寫equals,就相當于使用==,那么比較的是對象的引用是否指向同一塊內(nèi)存地址。重寫之后的目的是為了區(qū)別于==,去比較兩個對象的value值是否相等。

通過上面的學習,我們知道,hashCode是用于散列數(shù)據(jù)的快速存取,如利用HashSet/HashMap/HashTable類來存儲數(shù)據(jù)時,都是根據(jù)存儲對象的hashCode值來進行判斷是否相同。

這樣,如果我們對一個對象重寫了equals,意思是只要對象的成員變量的值都相等那么equals就等于true,但不重寫hashCode,那么當我們再重新new一個新對象,當原對象.equals(新對象)等于true的時候,兩者的hashCode是不一樣的,由此產(chǎn)生了理解的不一致。如果在存儲散列集合時(如set時),將會存儲兩個值一樣的對象,導致混淆,看下面的測試代碼。因此,重寫equals方法時也必須要重寫hashCode方法。

測試代碼:

import java.util.Collection; import java.util.HashSet;public class HelloWord {public static void main(String[] args) {Person n1 = new Person("Tom");Person n2 = new Person("Tom");Collection c = new HashSet();System.out.println("n1放入collection集合");c.add(n1);System.out.println("n2放入collection集合");c.add(n2);System.out.println("equals比較");System.out.println("n1.equals(n2) : " + n1.equals(n2));System.out.println("計算hashCode");System.out.println("n1.hashCode() : " + n1.hashCode());System.out.println("n2.hashCode() :" + n2.hashCode());System.out.println("顯示集合列表");System.out.println("c : " + c);} } public class Person {private String name;public Person(String name) {this.name = name;}public String toString(){return this.name;}public boolean equals(Object obj) {if (obj instanceof Person) {Person person = (Person) obj;System.out.println("[equals:name]"+ name);System.out.println("[equals:person.name]"+ person.name);return (name.equals(person.name));}return super.equals(obj);}/*public int hashCode() {Person person = (Person) this;System.out.println("[hashCode:person.name]" + person.name);System.out.println("[hashCode:name.hashCode()]" + name.hashCode());return name.hashCode(); }*/ }

重寫了hashCode方法的運行結果:

n1放入collection集合
[hashCode:person.name]Tom
[hashCode:name.hashCode()]84274
n2放入collection集合
[hashCode:person.name]Tom
[hashCode:name.hashCode()]84274
[equals:name]Tom
[equals:person.name]Tom
equals比較
[equals:name]Tom
[equals:person.name]Tom
n1.equals(n2) : true
計算hashCode
[hashCode:person.name]Tom
[hashCode:name.hashCode()]84274
n1.hashCode() : 84274
[hashCode:person.name]Tom
[hashCode:name.hashCode()]84274
n2.hashCode() :84274
顯示集合列表
c : [Tom]

不重寫hashCode方法的運行結果:

n1放入collection集合
n2放入collection集合
equals比較
[equals:name]Tom
[equals:person.name]Tom
n1.equals(n2) : true
計算hashCode
n1.hashCode() : 1326101490
n2.hashCode() :1202453864
顯示集合列表
c : [Tom, Tom]

HashMap在應用中遇到的問題

HashMap在并發(fā)下可能出現(xiàn)的問題分析

總結

以上是生活随笔為你收集整理的【Java集合学习系列】HashMap实现原理及源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

夜夜狠狠 | 伊人资源站 | 欧美成人xxx| 在线不卡a | 欧美精品乱码久久久久久按摩 | wwwwww黄| 天天曰| 国产欧美精品xxxx另类 | 亚洲精品视频在线观看免费视频 | 黄色小说免费在线观看 | 亚洲 综合 国产 精品 | 日韩女同一区二区三区在线观看 | 国产99爱| 激情偷乱人伦小说视频在线观看 | 中文字幕久久久精品 | 亚洲视频 视频在线 | 国产69精品久久久久久 | 日韩电影在线视频 | 国产精品爽爽爽 | 国产护士av | 日日爱视频 | 精品国产伦一区二区三区观看方式 | 欧美色插| 亚洲欧美一区二区三区孕妇写真 | 国产不卡在线观看视频 | 久久久精品国产免费观看同学 | 国产激情免费 | 欧美日韩高清在线一区 | 黄色av一区二区三区 | 丁香高清视频在线看看 | 色综合天天 | 国产一级片在线播放 | 美女免费视频黄 | 深爱婷婷 | 91女子私密保健养生少妇 | 欧美福利久久 | 亚洲理论影院 | 91在线免费公开视频 | 在线观看av网 | 国产精品每日更新 | 在线观看免费高清视频大全追剧 | 国产专区欧美专区 | 免费的国产精品 | 视频在线91| 亚一亚二国产专区 | 久久只精品99品免费久23小说 | 91黄在线看 | 毛片网免费 | 久久精品艹 | 国产成人一区二区三区 | 91九色视频网站 | 国产.精品.日韩.另类.中文.在线.播放 | 91麻豆精品一区二区三区 | 丁香婷婷深情五月亚洲 | 波多野结衣在线观看一区 | 岛国av在线 | 色资源网在线观看 | 一级免费黄视频 | 国产精品永久免费在线 | 在线成人看片 | 麻豆精品视频在线观看免费 | 亚洲激情国产精品 | 免费a网址 | 色婷婷视频网 | 色婷婷激情综合 | 亚洲视频在线观看网站 | 成人在线免费小视频 | 天天射天天搞 | 国产成人1区 | 国内久久看 | 天天翘av | 毛片的网址 | 国产精品区二区三区日本 | 福利电影久久 | 国产偷国产偷亚洲清高 | 国产麻豆精品久久 | 国产小视频福利在线 | 久久99精品国产99久久6尤 | 日本性动态图 | 成人毛片在线观看 | 免费视频成人 | 久久九九免费视频 | 欧美精品一区二区免费 | 伊人激情网 | 在线观看色视频 | 国内久久久 | 亚洲a在线观看 | 精品a视频 | 亚洲精品久久在线 | 欧美日韩亚洲在线观看 | 精品网站999www | 91久久国产自产拍夜夜嗨 | 五月天激情综合 | 狠狠狠色丁香婷婷综合久久88 | 日韩在线无 | 久久免费福利 | 亚洲激情精品 | 91麻豆精品国产91久久久久久久久 | 国产成人精品在线播放 | 伊人五月天.com | www日韩在线观看 | 久久久国产毛片 | 三级黄色免费片 | 免费黄色一区 | av软件在线观看 | 久久激情影院 | 视频在线国产 | 久久国内精品 | 国产精品第十页 | 97超碰在线人人 | 免费视频一二三 | 中文字幕无吗 | 伊人天堂久久 | 久久新视频 | 精品国产福利在线 | 午夜免费久久看 | 在线天堂亚洲 | 亚洲激情在线播放 | 日韩欧美在线不卡 | 成人在线视频免费 | www.五月婷婷 | 亚洲欧美视频一区二区三区 | www.色就是色| 99国产精品视频免费观看一公开 | a在线观看国产 | 亚洲国产成人久久综合 | 九色精品免费永久在线 | 免费观看黄 | 色a综合 | 91亚洲国产成人久久精品网站 | av在线收看| 欧美日韩三级 | 久草在线高清 | 精品国产乱码一区二区三区在线 | 在线观看免费视频你懂的 | 一级一片免费看 | 在线观看中文字幕一区 | 天天做日日做天天爽视频免费 | 欧美精品久 | 九九热精品视频在线播放 | 久久精品中文字幕免费mv | 成人中文字幕av | 日韩一区二区三区免费视频 | 一级理论片在线观看 | 最近日本韩国中文字幕 | 超碰人人91 | 国产日本在线观看 | 黄色大片免费播放 | 99久在线精品99re8热视频 | 色视频在线免费 | 成年人免费在线看 | 国产精品99久久久久人中文网介绍 | 在线播放av网址 | 夜夜躁狠狠躁日日躁 | 99r国产精品 | 国产网站在线免费观看 | 日本少妇久久久 | 97免费中文视频在线观看 | 国产成人一区二区三区在线观看 | 欧美热久久 | 国产精品原创av片国产免费 | 国产精品乱码一区二三区 | 国产日韩亚洲 | 精品国产乱码 | 亚洲免费av一区二区 | 中文字幕免费一区二区 | 久久久官网| 欧美日韩不卡在线视频 | 国产精品精品国产婷婷这里av | 五月花婷婷 | www.色午夜.com | av在线精品 | 免费高清在线观看成人 | 就要色综合 | 正在播放亚洲精品 | 午夜黄色一级片 | 久久精品美女视频网站 | 日韩丝袜在线观看 | 日本黄色免费观看 | 免费视频一级片 | 蜜臀久久99精品久久久酒店新书 | 国产精品丝袜在线 | 国产精品麻豆三级一区视频 | 人人干狠狠操 | 丁香九月激情综合 | 日韩欧美高清视频在线观看 | 97超碰伊人 | 日韩久久网站 | 久久精品5 | av在线色 | 免费高清看电视网站 | 激情视频综合网 | 欧美一进一出抽搐大尺度视频 | 在线免费观看黄色大片 | 午夜精品福利一区二区 | 欧美a免费 | 久久夜色精品国产欧美乱极品 | 国产黄色电影 | 91九色蝌蚪国产 | av在线亚洲天堂 | 日韩视频一区二区在线观看 | 久久视频在线免费观看 | av在线直接看| 色综合久久综合 | 亚洲精品小视频在线观看 | 99热99| 黄色大全在线观看 | 免费看一级黄色 | 九色视频自拍 | 丁香婷婷综合五月 | 日韩二区三区在线 | 天躁狠狠躁 | 色综合www | 国产精品永久免费在线 | 日p视频在线观看 | 91夜夜夜 | 日日爱网址 | 我要色综合天天 | 日本女人的性生活视频 | 婷婷丁香花五月天 | 欧美精品乱码久久久久 | 久久人人爽人人爽人人片av软件 | 在线午夜电影神马影院 | 亚洲日韩欧美视频 | 国产一区二区久久 | 麻豆系列在线观看 | 黄色av网站在线观看免费 | 亚洲无线视频 | 国产一区二区成人 | 日韩一三区 | 中国一级片在线播放 | 久草亚洲视频 | 黄色av电影免费观看 | 亚洲精品大片www | 99久久精品久久久久久动态片 | 91精品国产麻豆 | av中文资源在线 | 国产91精品在线播放 | 69视频在线| 黄色av三级在线 | 色婷五月天 | av黄色在线播放 | 亚洲黄色一级大片 | 奇米四色影狠狠爱7777 | www.五月天 | 日韩网站免费观看 | av免费观看网站 | 黄免费网站 | 97人人模人人爽人人喊网 | 天天射综合 | 在线视频18在线视频4k | 精品在线观看一区二区三区 | 欧美一二区在线 | 国产视 | 91人人视频在线观看 | 国产成人精品国内自产拍免费看 | 亚洲人成在线电影 | 国产高清视频在线播放 | 国产 视频 高清 免费 | 欧美性生活久久 | aaa亚洲精品一二三区 | 亚洲欧美成人网 | www.久草.com | 日韩一区二区三区免费视频 | 四虎影视精品成人 | 久久国产精品系列 | 黄网站免费久久 | 亚洲一本视频 | 国产一级二级在线播放 | 天天综合视频在线观看 | 免费网站看v片在线a | 亚洲国产操 | 久久久久一区二区三区四区 | 亚洲蜜桃在线 | 9999在线观看 | 永久免费精品视频网站 | 天天操夜操视频 | 亚洲精品麻豆视频 | 精品五月天 | 亚洲 欧美 另类人妖 | 中文字幕在线看视频国产中文版 | 日韩1级片 | 狠狠亚洲 | 久草久草在线观看 | 国产中文在线视频 | 国产成人免费在线 | 久久午夜精品影院一区 | 黄网站色成年免费观看 | 国产一区高清在线观看 | 国产成人久久精品亚洲 | 日韩中文久久 | 99视频+国产日韩欧美 | 天天操天天操天天操 | 日本三级在线观看中文字 | 欧美 日韩 国产 中文字幕 | 久久综合成人 | 国产成人一区二区在线观看 | 亚洲国产精品va在线看黑人动漫 | av综合网址 | 国产精品欧美久久久久无广告 | 色播五月激情综合网 | 亚洲一区网 | 四虎在线观看网址 | 综合久久网 | 最新av在线播放 | 久久国内精品视频 | 久久尤物电影视频在线观看 | 欧美午夜精品久久久久 | 91精品国产成人观看 | 五月婷婷香蕉 | 在线黄色免费av | 亚洲国产精品成人精品 | 夜夜骑天天操 | 欧美一区二区三区在线视频观看 | 蜜臀av在线一区二区三区 | 久久久国产精品人人片99精片欧美一 | 日韩av在线一区二区 | 欧美日韩高清不卡 | 玖玖在线看 | 99精品国产高清在线观看 | 99久久超碰中文字幕伊人 | 日韩日韩日韩日韩 | 一级一片免费视频 | 国产色婷婷在线 | 97人人模人人爽人人喊网 | 日韩在线观看的 | 国产资源免费 | 欧美嫩草影院 | 欧美一区免费在线观看 | 92精品国产成人观看免费 | 在线观看激情av | 日韩网站在线观看 | 欧美另类xxxxx | 国产成人精品午夜在线播放 | 91在线区| 最新的av网站 | 日韩视 | 麻豆免费在线播放 | 99在线观看视频网站 | 久久久久久久久久久久久国产精品 | 久久免费国产精品1 | 91在线精品秘密一区二区 | 91秒拍国产福利一区 | h网站免费在线观看 | a午夜电影 | 丁香六月婷婷开心 | 中文字幕中文字幕在线中文字幕三区 | 亚洲春色综合另类校园电影 | 日韩高清免费在线 | 97视频成人| 精品国产三级 | 日本久久久久久久久久 | 91传媒91久久久 | 悠悠av资源片 | a在线观看国产 | 亚洲精品字幕在线观看 | 九九九在线观看视频 | 亚洲久草网| 久久tv| 久久国产精品电影 | 中文字幕在线看视频 | 麻豆久久 | 午夜影院一级 | 国产精品亚洲成人 | 成人国产网站 | 日日夜夜狠狠干 | 日本护士三级少妇三级999 | 色99色| 免费看短| 久久久久麻豆v国产 | 久久久午夜剧场 | 婷婷开心久久网 | 激情一区二区三区欧美 | 伊人天天| 久久久久久网址 | 日韩精品一区二区三区电影 | 91手机电视 | 久久99精品久久久久久清纯直播 | 久久国产精品99久久久久 | 91香蕉视频色版 | 国产专区第一页 | 天天干天天插伊人网 | 国产区在线 | 精品久久久久亚洲 | 在线观看视频中文字幕 | 亚洲精品www久久久久久 | 日韩系列在线 | 在线看片91 | 网址你懂的在线观看 | 国产精品片 | 久久免视频 | 色婷婷骚婷婷 | 久久国产精品久久精品 | 日韩欧美高清在线观看 | av网在线观看 | 久草在线在线精品观看 | 成人一级黄色片 | 9ⅰ精品久久久久久久久中文字幕 | www.亚洲激情.com | 伊人影院得得 | www.黄色在线| 精品久久久99 | 国内精品久久久久久久影视简单 | 日韩啪视频 | 久久国产网 | 色永久免费视频 | 日韩城人在线 | 日韩av手机在线看 | 欧美 亚洲 另类 激情 另类 | 亚洲精品免费视频 | 99久久久国产精品免费观看 | 999精品网| 成年人黄色免费看 | 麻豆激情电影 | 久久综合久久综合这里只有精品 | 国产精品9区 | 色成人亚洲网 | 久久久久久久久久伊人 | 国产免费作爱视频 | 日韩中文字幕国产 | 日韩欧美精品一区二区三区经典 | 国产一区欧美在线 | 97网站| 99成人免费视频 | 久久深夜福利免费观看 | 91av视频播放 | 99国产在线视频 | 国产福利精品视频 | 国产成人久久 | 最新中文字幕在线资源 | 日韩中文字幕免费 | 国产综合精品一区二区三区 | 夜色成人网 | 9色在线视频 | 国产v欧美 | 日韩二区三区在线观看 | 久草久视频 | 久久国产精品一区二区三区四区 | 国产成人精品一区二区在线 | 亚洲狠狠干| 日韩欧美一区二区在线观看 | 综合网成人 | 开心丁香婷婷深爱五月 | 国产色妞影院wwwxxx | 色婷婷综合久久久久中文字幕1 | 国产精品色婷婷 | 中文字幕一区av | 亚洲乱码精品久久久久 | 五月婷婷欧美视频 | 成人黄色在线观看视频 | 丁香九月婷婷综合 | 午夜美女网站 | www亚洲一区 | 92av视频| 欧美一级久久 | www久 | 久久久久黄| 在线观看麻豆av | 天天草天天色 | 国产91在线免费视频 | 亚洲区色 | 超级碰碰碰视频 | 91完整版在线观看 | 国产一区视频导航 | 96超碰在线 | 久久国产精品久久久 | 国产日韩中文字幕 | 99久久精品无免国产免费 | 日韩三区在线观看 | 中文字幕在线观看完整 | 国产高清不卡一区二区三区 | 69精品人人人人 | 国产专区在线 | 狠狠狠狠狠狠操 | 免费看黄色大全 | 91porny九色91啦中文 | 人人舔人人插 | 成人免费看片98欧美 | 色婷婷视频在线观看 | 久久国产精品一区二区 | 99视频在线观看免费 | 中文字幕在线播放一区 | 久久精品麻豆 | 国产一级二级在线观看 | 国产亚洲日本 | 高潮毛片无遮挡高清免费 | 日日天天av | 亚洲欧洲精品一区二区精品久久久 | 亚洲成人欧美 | 一区三区视频在线观看 | 国产高清av | 69欧美视频 | 91久久精| 91丨九色丨蝌蚪丨对白 | 婷婷深爱激情 | 中文字幕av免费在线观看 | 国产精品高潮在线观看 | 久久艹免费 | wwwwww国产| 美女在线黄 | 人人射人人插 | 精品国精品自拍自在线 | 亚洲春色综合另类校园电影 | 日韩av不卡在线播放 | wwxxxx日本 | 久久久国产在线视频 | 免费a级观看 | 久久草 | 久久av在线 | 欧美精品久久久久久久久久丰满 | 久久久久国产精品午夜一区 | 亚洲黄色a| 国产一二三四在线视频 | 欧美日韩国产精品久久 | 午夜精品久久久久 | 九九精品视频在线观看 | 成人在线视频免费 | 色www. | 97在线成人 | 免费热情视频 | 国产亚洲午夜高清国产拍精品 | www操操| 国产精品久久久久久久久久妇女 | 欧美成人69av| 九九电影在线 | 天天天综合 | 高清av在线免费观看 | 天天综合成人网 | 在线观看a视频 | 91av视频免费在线观看 | 在线 国产一区 | 日韩在线免费不卡 | 黄色电影在线免费观看 | 香蕉视频在线网站 | 超碰在线天天 | 三级a视频 | 97在线超碰 | 欧美色综合天天久久综合精品 | 久久精久久精 | 日韩亚洲在线视频 | 日本中文字幕在线视频 | 成人久久精品 | 国产成人一区在线 | 国产精品免费在线视频 | 亚洲婷婷丁香 | 狠狠色狠狠色合久久伊人 | 97超视频在线观看 | 亚洲日本韩国一区二区 | 精品国产欧美一区二区 | av中文字幕av | 日韩精品综合在线 | 日韩精品视频网站 | 精品国产伦一区二区三区观看方式 | 国产黄色在线观看 | 国产91精品久久久久 | 97人人精品 | 亚洲国产精品一区二区久久,亚洲午夜 | 中文字幕免费高清av | 伊人狠狠操 | 天天干天天看 | 国产手机在线精品 | 国产高清av免费在线观看 | 亚洲三级黄色 | 色综合 久久精品 | 国产精品原创av片国产免费 | 国产成人综合在线观看 | 狠狠色丁香久久综合网 | 午夜视频亚洲 | 午夜男人影院 | 欧美一级久久 | 97人人模人人爽人人喊中文字 | 91av手机在线 | 午夜在线免费视频 | 久久电影网站中文字幕 | 欧美日韩国产一区 | 99久久er热在这里只有精品66 | 国产丝袜制服在线 | 日韩激情影院 | 久久久亚洲精品 | 成人免费影院 | 丁香激情网 | 日韩视频免费在线观看 | 国产一区二区三区在线 | 亚洲国产精彩中文乱码av | 国产午夜一区二区 | 91视频在线观看下载 | 在线一区二区三区 | 精品av在线播放 | 免费在线观看不卡av | 免费中文字幕视频 | 日韩av网址在线 | 日韩久久久久久久久久久久 | 激情av资源网 | 91九色porny蝌蚪视频 | 国产精品99久久久久的智能播放 | 天天操天天操天天操天天操天天操天天操 | 国产毛片aaa | 欧美日韩国产色综合一二三四 | 色在线免费 | 天天操天天添 | 中文字幕中文字幕中文字幕 | 国产亚洲综合精品 | 九九视频一区 | 久久久国产精品一区二区中文 | 九九视频这里只有精品 | 久久a视频 | 色99色| 亚洲综合精品视频 | av一区二区在线观看中文字幕 | 韩国一区二区av | 亚洲1级片| 国产精品资源网 | 丁香婷五月 | 婷婷综合成人 | 精品视频不卡 | av中文字幕在线免费观看 | 久久99精品久久久久久清纯直播 | 久久在现 | 麻豆精品在线视频 | 国产97免费 | 国产一区二区三区黄 | 亚洲久草视频 | 五月天婷婷在线观看视频 | 丁香av| 成人免费在线网 | 天天爽网站 | 色综合色综合久久综合频道88 | 亚洲精品电影在线 | 久久撸在线视频 | 狠狠躁日日躁狂躁夜夜躁av | 国产一区视频在线播放 | 久久免费视频一区 | 久久99国产综合精品 | 伊人宗合| 视频一区视频二区在线观看 | 四虎影视国产精品免费久久 | 五月天综合激情网 | 高清不卡一区二区在线 | av免费看在线 | 狠狠色丁香婷婷综合久小说久 | 99情趣网视频 | 国产精品久久久久999 | 丁香六月欧美 | 久久精品网| 中文日韩在线视频 | 欧美经典久久 | 亚洲欧洲精品一区二区精品久久久 | 成人在线观看资源 | 免费h精品视频在线播放 | 色网站免费在线看 | 国产美女精品在线 | 99国产精品视频免费观看一公开 | 国产视频在线观看一区 | 精品国产乱码久久 | 丁香色婷婷 | 日韩欧美一区二区三区视频 | 国产韩国日本高清视频 | 久热久草在线 | 一级黄毛片 | 日韩伦理片hd | 国产在线观看不卡 | 99视 | 91精品秘密在线观看 | 亚洲国内精品在线 | 丁香午夜婷婷 | 18久久久久| 97视频人人澡人人爽 | 偷拍精偷拍精品欧洲亚洲网站 | 亚州免费视频 | 黄色大片免费网站 | 日本三级大片 | 在线播放日韩av | 成人黄色电影在线观看 | 91大神精品视频在线观看 | 成人小视频在线观看免费 | 国语对白少妇爽91 | 欧美精品久久久久久久久久 | 久久综合婷婷综合 | 久久精品电影院 | 国产亚洲精品久久久网站好莱 | 日韩一区二区三区免费电影 | 91精品免费在线 | 97精品久久人人爽人人爽 | 黄色一级免费电影 | 国产免费观看视频 | 伊甸园永久入口www 99热 精品在线 | 欧美成人按摩 | 国产中文字幕视频在线 | 国产在线精品二区 | 久草久草在线观看 | 亚洲一级黄色大片 | 日本免费久久高清视频 | 五月在线 | 国产特级毛片aaaaaa | 亚洲欧美经典 | 国内精品久久久久影院优 | 国产h片在线观看 | 国产精彩视频 | 97精品国产 | 亚洲三级黄色 | 国模吧一区 | 色网站免费在线观看 | 国产精品破处视频 | 久久久久成 | 日韩精品中文字幕在线不卡尤物 | 日韩网站在线 | 精品99在线视频 | 波多野结衣在线观看一区 | 97超碰人人 | 九九九九九精品 | 欧美日韩一区二区在线观看 | 国产在线久草 | 一区二区三区在线影院 | 操操操日日日干干干 | 午夜久久网站 | 91精品视频在线观看免费 | 久久天天躁夜夜躁狠狠85麻豆 | 91成人精品一区在线播放69 | 亚洲成av人片在线观看www | 久久久久女人精品毛片九一 | 天天操夜夜拍 | 丁香五月网久久综合 | 国产一区高清在线 | 美女免费网视频 | 99精品国产免费久久久久久下载 | 色欧美综合 | 亚洲全部视频 | 色婷婷综合成人av | 久草99| 成人91在线观看 | 伊人久久国产 | 中文字幕日韩伦理 | 亚洲一区免费在线 | 五月婷婷香蕉 | 天天色天天射天天综合网 | 深爱婷婷| 国产精品乱看 | 一色av| 国内精品在线看 | 看v片 | 久草免费在线视频 | 国产午夜精品一区二区三区 | 国产精品网址在线观看 | 久久一区二区三区日韩 | 国产小视频你懂的在线 | 国产精品久久一区二区三区不卡 | 香蕉久草在线 | 精品视频久久 | 日韩精品免费一区二区在线观看 | 国产一区在线视频播放 | 91禁在线看 | 久久精品7 | 中文字幕黄色 | 亚洲欧美国产视频 | 激情欧美一区二区三区免费看 | 98超碰人人 | 丁香视频| 久久黄色片子 | 丰满少妇在线观看 | 久久久性 | 日韩午夜三级 | 激情丁香综合 | 国产不卡在线视频 | av一区在线| 91精品久久久久久综合乱菊 | 国产精品一区二区久久久 | 欧洲亚洲国产视频 | 91精品国产92久久久久 | 日韩精品你懂的 | 91亚洲欧美激情 | 欧美 日韩精品 | 日本在线精品视频 | 天天夜夜亚洲 | 国产精品第十页 | 色99导航 | 日韩成人免费在线观看 | 婷婷四房综合激情五月 | 日韩国产精品一区 | 国产最新福利 | 在线成人性视频 | 久久久久久久久久久福利 | 99精品免费在线 | 欧美不卡视频在线 | 最新色站| 婷婷丁香花五月天 | 人人爽人人做 | 精品国偷自产国产一区 | 91精品国产成人观看 | 国产精品久久久久av | 久久精品香蕉 | 国产成人精品一区二区三区免费 | 十八岁免进欧美 | www.黄色片.com | 色婷婷av一区二 | 又紧又大又爽精品一区二区 | 久久人人爽人人爽人人 | 国产精品久久久视频 | 亚洲视频久久 | 亚洲天堂精品视频 | 丁香激情视频 | 黄色网免费 | 欧美性做爰猛烈叫床潮 | 日韩欧美黄色网址 | 欧美成人中文字幕 | 国产精品免费久久久久久久久久中文 | 国内外成人免费在线视频 | 成人在线播放网站 | 婷婷综合 | 亚洲午夜大片 | 精品一区二三区 | 成人在线免费小视频 | 激情欧美一区二区三区免费看 | 中国黄色一级大片 | www日韩欧美 | 亚洲免费资源 | 亚洲综合成人专区片 | 干干夜夜 | 欧美极品少妇xbxb性爽爽视频 | 国产精品久久久久久久久费观看 | 美女视频黄在线 | 中文字幕在线观看三区 | 女人18毛片a级毛片一区二区 | 色婷婷九月 | 69热国产视频 | 超碰人人在线 | 久久精品专区 | 国产1级毛片 | 精品91| 日韩h在线观看 | 一级一片免费观看 | 国产专区第一页 | 99视频在线免费 | 黄色一级影院 | 一区av在线播放 | 成人午夜电影免费在线观看 | 色中射| 亚洲精品久久久蜜臀下载官网 | 亚洲欧美va| 免费影视大全推荐 | 视频国产在线 | 996久久国产精品线观看 | 日韩在线三区 | 国产精品不卡一区 | 69国产盗摄一区二区三区五区 | 视频一区在线播放 | 国内精品久久影院 | 久九视频 | 欧美精品二 | av久久在线 | www.激情五月.com| 91视频a | 丁香婷五月 | 狠狠干网 | 色久天 | 91在线小视频 | 国产剧在线观看片 | av在线免费播放网站 | 国产96视频 | 亚洲人人精品 | 深爱激情五月综合 | 国产精品精品视频 | 欧美日韩一级久久久久久免费看 | 日本久草电影 | 欧美另类交人妖 | 日本最大色倩网站www | 亚洲精品网址在线观看 | 亚洲国产成人在线 | 在线观看国产高清视频 | 国产在线观看,日本 | 天天综合导航 | 91网免费观看 | av成人资源 | 日韩精品免费一区 | 日韩精品免费在线观看视频 | 国产精品亚州 | 久久99日韩 | 成人毛片在线观看视频 | 一区三区在线欧 | 国产男男gay做爰 | 精品国产乱码久久久久久1区2匹 | 中文av字幕在线观看 | 国产亚洲无 | 玖玖精品在线 | 久久国产精品视频 | 黄色影院在线免费观看 | 91久久久久久久一区二区 | 国产中文字幕在线看 | 久久久国产高清 | 在线看岛国av| 国产精品福利在线观看 | 高潮毛片无遮挡高清免费 | 日韩一级电影在线观看 | 国语精品久久 | 色婷婷丁香 | 在线观看视频97 | 国产成人免费观看久久久 | 国产精品久久久久久麻豆一区 | 日韩中文幕 | 欧美一级电影免费观看 | 日日干视频 | 91高清不卡| 久久久久久久久久久久久久免费看 | 国产精品久久久久久麻豆一区 | 美女网站视频一区 | 亚洲视频aaa | 国产精品久久久久久婷婷天堂 | 91精品国产91久久久久久三级 | 日韩剧情 | 亚洲视屏 | www色| 国产成人福利在线 | 亚洲精品乱码久久久久久 | 97超碰影视| 丁香五婷| 在线免费三级 | 91综合色| 欧美午夜剧场 | 精品影院一区二区久久久 | 在线国产激情视频 | 久久国产三级 | 久久色视频 | 欧美专区国产专区 | 69国产盗摄一区二区三区五区 | 亚洲男男gaygay无套同网址 | 日韩精品一区二区免费视频 | 四虎国产精品成人免费4hu | 亚洲国产人午在线一二区 | 日韩中文字幕电影 | 久久久久久久久久免费视频 | 欧美午夜理伦三级在线观看 | 天天摸天天舔天天操 | 久久久成人精品 | 日韩精品欧美视频 | 一区二区久久 | 亚洲国产精品视频在线观看 | 国产黄色片久久久 | 天天搞天天干天天色 | 欧美日韩一级久久久久久免费看 | 三级av免费观看 | 色婷婷狠狠五月综合天色拍 | 夜夜视频资源 | 午夜精品久久久久久久久久久久久久 | 国产操在线 | 国产高清视频在线观看 | 免费毛片一区二区三区久久久 | www视频在线免费观看 | 天海翼一区二区三区免费 | 欧美日韩二区在线 | 天天干天天草天天爽 | 亚洲精品高清在线 | 国产精品久久久久久久久久东京 | 91九色免费视频 | 午夜精品在线看 | 成人黄色中文字幕 | 日韩精品中字 | 8090yy亚洲精品久久 | 久久成人综合视频 | 亚洲清纯国产 | 国产精品99久久久精品免费观看 | 久久精品之 | 国产91在线观看 | 91重口视频| 久久久国产电影 | 久久精品国产亚洲aⅴ | 91你懂的| 91最新地址永久入口 | 久久激情视频 | 久草青青在线观看 | 色综合天天色综合 | 99视频在线看 | 天堂va在线高清一区 | 人人舔人人爱 | 五月婷婷丁香在线观看 | 在线观看国产www | av成人在线观看 | 五月开心婷婷 | 色天天| 国产成人在线精品 | 网站免费黄色 | 91桃色视频 | 1024在线看片 | 9999免费视频 | 一区二区精品国产 | 日韩精品免费在线观看视频 | 91精品国产高清自在线观看 | 国产精品一区二区久久精品 | 色婷婷久久久综合中文字幕 | 97香蕉视频| 国产精品久久久久久久久久ktv | 911国产在线观看 | 国产精品久久久久免费 | 色综合天天色综合 | 正在播放国产一区 | av片在线观看免费 | 国产精品视频在线看 | 91av在线免费看 | 亚洲精品婷婷 | 亚洲精品mv在线观看 |