精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個HashMap跟面試官扯了半個小時

開發(fā) 后端
HashMap應(yīng)該算是Java后端工程師面試的必問題,因為其中的知識點太多,很適合用來考察面試者的Java基礎(chǔ)。

前言

HashMap應(yīng)該算是Java后端工程師面試的必問題,因為其中的知識點太多,很適合用來考察面試者的Java基礎(chǔ)。

開場

面試官: 你先自我介紹一下吧!

安琪拉: 我是安琪拉,草叢三婊之一,最強中單(鐘馗不服)!哦,不對,串場了,我是**,目前在--公司做--系統(tǒng)開發(fā)。

面試官: 看你簡歷上寫熟悉Java集合,HashMap用過的吧?

安琪拉: 用過的。(還是熟悉的味道)

面試官: 那你跟我講講HashMap的內(nèi)部數(shù)據(jù)結(jié)構(gòu)?

安琪拉: 目前我用的是JDK1.8版本的,內(nèi)部使用數(shù)組 + 鏈表 / 紅黑樹;

安琪拉: 方便我給您畫個數(shù)據(jù)結(jié)構(gòu)圖吧:

面試官: 那你清楚HashMap的數(shù)據(jù)插入原理嗎?

安琪拉: 呃[做沉思狀]。我覺得還是應(yīng)該畫個圖比較清楚,如下:   

  1.  判斷數(shù)組是否為空,為空進行初始化;
  2.  不為空,計算 k 的 hash 值,通過 (n - 1) & hash計算應(yīng)當(dāng)存放在數(shù)組中的下標(biāo) index ;
  3.  查看 table[index] 是否存在數(shù)據(jù),沒有數(shù)據(jù)就構(gòu)造一個Node節(jié)點存放在 table[index] 中;
  4.  存在數(shù)據(jù),說明發(fā)生了hash沖突, 繼續(xù)判斷key是否相等,相等,用新的value替換原數(shù)據(jù)(onlyIfAbsent為false);
  5.  如果不相等,判斷當(dāng)前節(jié)點類型是不是樹型節(jié)點,如果是樹型節(jié)點,創(chuàng)建樹型節(jié)點插入紅黑樹中;
  6.  如果不是樹型節(jié)點,創(chuàng)建普通Node加入鏈表中;判斷鏈表長度是否大于 8, 大于的話鏈表轉(zhuǎn)換為紅黑樹;
  7.  插入完成之后判斷當(dāng)前節(jié)點數(shù)是否大于閾值,如果大于開始擴容為原數(shù)組的二倍。

 面試官: 剛才你提到HashMap的初始化,那HashMap怎么設(shè)定初始容量大小的嗎?

安琪拉: [這也算問題??] 一般如果new HashMap() 不傳值,默認大小是16,負載因子是0.75, 如果自己傳入初始大小k,初始化大小為 大于k的 2的整數(shù)次方,例如如果傳10,大小為16。(補充說明:實現(xiàn)代碼如下) 

  1. static final int tableSizeFor(int cap) {  
  2.   int n = cap - 1;  
  3.   n |= n >>> 1;  
  4.   n |= n >>> 2;  
  5.   n |= n >>> 4;  
  6.   n |= n >>> 8;  
  7.   n |= n >>> 16;  
  8.   return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;  

補充說明:下圖是詳細過程,算法就是讓初始二進制分別右移1,2,4,8,16位,與自己異或,把高位第一個為1的數(shù)通過不斷右移,把高位為1的后面全變?yōu)?,111111 + 1 = 1000000  = (符合大于50并且是2的整數(shù)次冪 )

面試官:  你提到hash函數(shù),你知道HashMap的哈希函數(shù)怎么設(shè)計的嗎?

安琪拉:  [問的還挺細] hash函數(shù)是先拿到通過key 的hashcode,是32位的int值,然后讓hashcode的高16位和低16位進行異或操作。

面試官:  那你知道為什么這么設(shè)計嗎?

安琪拉:  [這也要問],這個也叫擾動函數(shù),這么設(shè)計有二點原因:

  1.  一定要盡可能降低hash碰撞,越分散越好;
  2.  算法一定要盡可能高效,因為這是高頻操作, 因此采用位運算;

面試官:  為什么采用hashcode的高16位和低16位異或能降低hash碰撞?hash函數(shù)能不能直接用key的hashcode?

[這問題有點刁鉆], 安琪拉差點原地💥了,恨不得出biubiubiu 二一三連招。

安琪拉:  因為 key.hashCode() 函數(shù)調(diào)用的是key鍵值類型自帶的哈希函數(shù),返回int型散列值。int值范圍為**-2147483648~2147483647**,前后加起來大概40億的映射空間。只要哈希函數(shù)映射得比較均勻松散,一般應(yīng)用是很難出現(xiàn)碰撞的。但問題是一個40億長度的數(shù)組,內(nèi)存是放不下的。你想,如果HashMap數(shù)組的初始大小才16,用之前需要對數(shù)組的長度取模運算,得到的余數(shù)才能用來訪問數(shù)組下標(biāo)。

源碼中模運算就是把散列值和數(shù)組長度-1做一個"與"操作,位運算比%運算要快。 

  1. bucketIndex = indexFor(hash, table.length);  
  2. static int indexFor(int h, int length) {  
  3. return h & (length-1);  

順便說一下,這也正好解釋了為什么HashMap的數(shù)組長度要取2的整數(shù)冪。因為這樣(數(shù)組長度-1)正好相當(dāng)于一個“低位掩碼”。“與”操作的結(jié)果就是散列值的高位全部歸零,只保留低位值,用來做數(shù)組下標(biāo)訪問。以初始長度16為例,16-1=15。2進制表示是00000000 00000000 00001111。和某散列值做“與”操作如下,結(jié)果就是截取了最低的四位值。 

  1.  10100101 11000100 00100101  
  2. & 00000000 00000000 00001111  
  3. ----------------------------------  
  4.   00000000 00000000 00000101    //高位全部歸零,只保留末四位 

但這時候問題就來了,這樣就算我的散列值分布再松散,要是只取最后幾位的話,碰撞也會很嚴(yán)重。更要命的是如果散列本身做得不好,分布上成等差數(shù)列的漏洞,如果正好讓最后幾個低位呈現(xiàn)規(guī)律性重復(fù),就無比蛋疼。

這時候 hash 函數(shù)(“擾動函數(shù)”)的價值就體現(xiàn)出來了,說到這里大家應(yīng)該猜出來了。看下面這個圖,

右位移16位,正好是32bit的一半,自己的高半?yún)^(qū)和低半?yún)^(qū)做異或,就是為了混合原始哈希碼的高位和低位,以此來加大低位的隨機性。而且混合后的低位摻雜了高位的部分特征,這樣高位的信息也被變相保留下來。

最后我們來看一下Peter Lawley的一篇專欄文章《An introduction to optimising a hashing strategy》里的的一個實驗:他隨機選取了352個字符串,在他們散列值完全沒有沖突的前提下,對它們做低位掩碼,取數(shù)組下標(biāo)。

結(jié)果顯示,當(dāng)HashMap數(shù)組長度為512的時候(),也就是用掩碼取低9位的時候,在沒有擾動函數(shù)的情況下,發(fā)生了103次碰撞,接近30%。而在使用了擾動函數(shù)之后只有92次碰撞。碰撞減少了將近10%。看來擾動函數(shù)確實還是有功效的。

另外Java1.8相比1.7做了調(diào)整,1.7做了四次移位和四次異或,但明顯Java 8覺得擾動做一次就夠了,做4次的話,多了可能邊際效用也不大,所謂為了效率考慮就改成一次了。

下面是1.7的hash代碼: 

  1. static int hash(int h) {  
  2.     h ^= (h >>> 20) ^ (h >>> 12);  
  3.     return h ^ (h >>> 7) ^ (h >>> 4);  

面試官:  看來做過功課,有點料啊!是不是偷偷看了安琪拉的博客公眾號, 你剛剛說到1.8對hash函數(shù)做了優(yōu)化,1.8還有別的優(yōu)化嗎?

安琪拉: 1.8還有三點主要的優(yōu)化:

  1.  數(shù)組+鏈表改成了數(shù)組+鏈表或紅黑樹;
  2.  鏈表的插入方式從頭插法改成了尾插法,簡單說就是插入時,如果數(shù)組位置上已經(jīng)有元素,1.7將新元素放到數(shù)組中,原始節(jié)點作為新節(jié)點的后繼節(jié)點,1.8遍歷鏈表,將元素放置到鏈表的最后;
  3.  擴容的時候1.7需要對原數(shù)組中的元素進行重新hash定位在新數(shù)組的位置,1.8采用更簡單的判斷邏輯,位置不變或索引+舊容量大小;
  4.  在插入時,1.7先判斷是否需要擴容,再插入,1.8先進行插入,插入完成再判斷是否需要擴容;

面試官:  你分別跟我講講為什么要做這幾點優(yōu)化;

安琪拉:  【咳咳,果然是連環(huán)炮】

  1.  防止發(fā)生hash沖突,鏈表長度過長,將時間復(fù)雜度由O(n)降為O(logn);
  2.  因為1.7頭插法擴容時,頭插法會使鏈表發(fā)生反轉(zhuǎn),多線程環(huán)境下會產(chǎn)生環(huán);

    A線程在插入節(jié)點B,B線程也在插入,遇到容量不夠開始擴容,重新hash,放置元素,采用頭插法,后遍歷到的B節(jié)點放入了頭部,這樣形成了環(huán),如下圖所示:

1.7的擴容調(diào)用transfer代碼,如下所示: 

  1. void transfer(Entry[] newTable, boolean rehash) {  
  2.   int newCapacity = newTable.length;  
  3.   for (Entry<K,V> e : table) {  
  4.     while(null != e) {  
  5.       Entry<K,V> next = e.next;  
  6.       if (rehash) {  
  7.         e.hash = null == e.key ? 0 : hash(e.key);  
  8.       }  
  9.       int i = indexFor(e.hash, newCapacity);  
  10.       e.next = newTable[i]; //A線程如果執(zhí)行到這一行掛起,B線程開始進行擴容  
  11.       newTable[i] = e;  
  12.       e = next 
  13.     }  
  14.   }  

      3.  擴容的時候為什么1.8 不用重新hash就可以直接定位原節(jié)點在新數(shù)據(jù)的位置呢?

這是由于擴容是擴大為原數(shù)組大小的2倍,用于計算數(shù)組位置的掩碼僅僅只是高位多了一個1,舉個例子:擴容前長度為16,用于計算 (n-1) & hash 的二進制n - 1為0000 1111,  

 擴容后為32后的二進制就高位多了1,============>為0001 1111。

     4.  因為是& 運算,1和任何數(shù) & 都是它本身,那就分二種情況,如下圖:原數(shù)據(jù)hashcode高位第4位為0和高位為1的情況;

第四位高位為0,重新hash數(shù)值不變,第四位為1,重新hash數(shù)值比原來大16(舊數(shù)組的容量)

面試官:  那HashMap是線程安全的嗎?

安琪拉:  不是,在多線程環(huán)境下,1.7 會產(chǎn)生死循環(huán)、數(shù)據(jù)丟失、數(shù)據(jù)覆蓋的問題,1.8 中會有數(shù)據(jù)覆蓋的問題。

以1.8為例,當(dāng)A線程執(zhí)行到下面代碼第6行判斷index位置為空后正好掛起,B線程開始執(zhí)行第7 行,往index位置的寫入節(jié)點數(shù)據(jù),這時A線程恢復(fù)現(xiàn)場,執(zhí)行賦值操作,就把A線程的數(shù)據(jù)給覆蓋了;

還有第38行++size這個地方也會造成多線程同時擴容等問題。 

  1. final V putVal(int hash, K key, V value, boolean onlyIfAbsent,  
  2.                boolean evict) {  
  3.   Node<K,V>[] tab; Node<K,V> p; int n, i;  
  4.   if ((tab = table) == null || (n = tab.length) == 0)  
  5.     n = (tab = resize()).length;  
  6.   if ((p = tab[i = (n - 1) & hash]) == null)  //多線程執(zhí)行到這里  
  7.     tab[i] = newNode(hash, key, value, null);  
  8.   else {  
  9.     Node<K,V> e; K k;  
  10.     if (p.hash == hash &&  
  11.         ((k = p.key) == key || (key != null && key.equals(k))))  
  12.       e = p 
  13.     else if (p instanceof TreeNode)  
  14.       e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);  
  15.     else {  
  16.       for (int binCount = 0; ; ++binCount) {  
  17.         if ((e = p.next) == null) {  
  18.           p.next = newNode(hash, key, value, null);  
  19.           if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st  
  20.             treeifyBin(tab, hash);  
  21.           break;  
  22.         }  
  23.         if (e.hash == hash &&  
  24.             ((k = e.key) == key || (key != null && key.equals(k))))  
  25.           break; 
  26.          p = e 
  27.       }  
  28.     }  
  29.     if (e != null) { // existing mapping for key  
  30.       V oldValue = e.value;  
  31.       if (!onlyIfAbsent || oldValue == null)  
  32.         e.value = value;  
  33.       afterNodeAccess(e);  
  34.       return oldValue;  
  35.     }  
  36.   }  
  37.   ++modCount;  
  38.   if (++size > threshold) // 多個線程走到這,可能重復(fù)resize()  
  39.     resize();  
  40.   afterNodeInsertion(evict); 
  41.    return null;  

面試官:  那你平常怎么解決這個線程不安全的問題?

安琪拉:  Java中有HashTable、Collections.synchronizedMap、以及ConcurrentHashMap可以實現(xiàn)線程安全的Map。

  1.  HashTable是直接在操作方法上加synchronized關(guān)鍵字,鎖住整個數(shù)組,粒度比較大;
  2.  Collections.synchronizedMap是使用Collections集合工具的內(nèi)部類,通過傳入Map封裝出一個SynchronizedMap對象,內(nèi)部定義了一個對象鎖,方法內(nèi)通過對象鎖實現(xiàn);
  3.  ConcurrentHashMap使用分段鎖,降低了鎖粒度,讓并發(fā)度大大提高。

面試官:  那你知道ConcurrentHashMap的分段鎖的實現(xiàn)原理嗎?

安琪拉:  【天啦擼! 俄羅斯套娃,一個套一個】ConcurrentHashMap成員變量使用volatile 修飾,免除了指令重排序,同時保證內(nèi)存可見性,另外使用CAS操作和synchronized結(jié)合實現(xiàn)賦值操作,多線程操作只會鎖住當(dāng)前操作索引的節(jié)點。

如下圖,線程A鎖住A節(jié)點所在鏈表,線程B鎖住B節(jié)點所在鏈表,操作互不干涉。

面試官:  你前面提到鏈表轉(zhuǎn)紅黑樹是鏈表長度達到閾值,這個閾值是多少?

安琪拉:  閾值是8,紅黑樹轉(zhuǎn)鏈表閾值為6

面試官:  為什么是8,不是16,32甚至是7 ?又為什么紅黑樹轉(zhuǎn)鏈表的閾值是6,不是8了呢?

安琪拉: 【你去問作者啊!天啦擼,biubiubiu 真想213連招】

因為作者就這么設(shè)計的,哦,不對,因為經(jīng)過計算,在hash函數(shù)設(shè)計合理的情況下,發(fā)生hash碰撞8次的幾率為百萬分之6,概率說話。。因為8夠用了,至于為什么轉(zhuǎn)回來是6,因為如果hash碰撞次數(shù)在8附近徘徊,會一直發(fā)生鏈表和紅黑樹的轉(zhuǎn)化,為了預(yù)防這種情況的發(fā)生。

面試官:  HashMap內(nèi)部節(jié)點是有序的嗎?

安琪拉:  是無序的,根據(jù)hash值隨機插入

面試官:  那有沒有有序的Map?

安琪拉:  LinkedHashMap 和 TreeMap

面試官:  跟我講講LinkedHashMap怎么實現(xiàn)有序的?

安琪拉:  LinkedHashMap內(nèi)部維護了一個單鏈表,有頭尾節(jié)點,同時LinkedHashMap節(jié)點Entry內(nèi)部除了繼承HashMap的Node屬性,還有before 和 after用于標(biāo)識前置節(jié)點和后置節(jié)點。可以實現(xiàn)按插入的順序或訪問順序排序。 

  1. /**  
  2.  * The head (eldest) of the doubly linked list.  
  3. */  
  4. transient LinkedHashMap.Entry<K,V> head;  
  5. /**  
  6.   * The tail (youngest) of the doubly linked list.  
  7. */  
  8. transient LinkedHashMap.Entry<K,V> tail;  
  9. //鏈接新加入的p節(jié)點到鏈表后端  
  10. private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {  
  11.   LinkedHashMap.Entry<K,V> last = tail 
  12.   tail = p 
  13.   if (last == null)  
  14.     head = p 
  15.   else {  
  16.     p.before = last 
  17.     last.after = p 
  18.   }  
  19.  
  20. //LinkedHashMap的節(jié)點類  
  21. static class Entry<K,V> extends HashMap.Node<K,V> {  
  22.   Entry<K,V> before, after;  
  23.   Entry(int hash, K key, V value, Node<K,V> next) {  
  24.     super(hash, key, value, next);  
  25.   }  

示例代碼: 

  1. public static void main(String[] args) {  Map<String, String> map = new LinkedHashMap<String, String>();  map.put("1", "安琪拉");  map.put("2", "的");  map.put("3", "博客");  for(Map.Entry<String,String> item: map.entrySet()){    System.out.println(item.getKey() + ":" + item.getValue());  }}//console輸出1:安琪拉2:的3:博客 

面試官:  跟我講講TreeMap怎么實現(xiàn)有序的?

安琪拉:TreeMap是按照Key的自然順序或者Comprator的順序進行排序,內(nèi)部是通過紅黑樹來實現(xiàn)。所以要么key所屬的類實現(xiàn)Comparable接口,或者自定義一個實現(xiàn)了Comparator接口的比較器,傳給TreeMap用戶key的比較。

面試官:  前面提到通過CAS 和 synchronized結(jié)合實現(xiàn)鎖粒度的降低,你能給我講講CAS 的實現(xiàn)以及synchronized的實現(xiàn)原理嗎?

安琪拉:  下一期咋們再約時間,OK?

面試官:  好吧,回去等通知吧! 

 

責(zé)任編輯:龐桂玉 來源: Hollis
相關(guān)推薦

2020-07-07 07:41:32

Java線程生命周期

2021-09-28 13:42:55

Chrome Devwebsocket網(wǎng)絡(luò)協(xié)議

2022-02-16 16:36:55

阿里面試面試流程背景

2020-12-03 07:39:50

HashMap底層數(shù)據(jù)

2022-04-08 08:26:03

JavaHTTP請求

2025-10-20 04:00:00

2025-11-11 09:25:19

2020-06-19 15:32:56

HashMap面試代碼

2021-05-19 08:17:35

秒殺場景高并發(fā)

2023-07-31 08:26:09

2022-01-10 11:04:41

單鏈表面試編程

2020-06-22 07:47:46

提交面試官訂單

2022-08-18 20:02:04

JSLRU緩存

2017-03-16 15:27:10

面試官測試技術(shù)

2025-09-19 09:57:46

2024-05-28 10:14:31

JavaScrip模板引擎

2021-12-08 06:53:28

HashMap面試JDK 8

2022-09-13 14:44:40

HashMap哈希表紅黑樹

2024-08-07 08:15:47

2020-12-10 08:43:17

垃圾回收JVM
點贊
收藏

51CTO技術(shù)棧公眾號

国产熟女高潮视频| 久久人人九九| 国产在线一区视频| 五月天亚洲一区| 欧洲一区二区av| 国产日本欧美在线| 四虎影院在线域名免费观看| 亚洲永久网站| 久久视频这里只有精品| 国产精品嫩草av| 欧洲亚洲精品久久久久| 亚洲一级二级在线| 亚洲激情一区二区| 婷婷亚洲一区二区三区| 精彩视频一区二区| 日本精品视频网站| 久操免费在线视频| 首页国产精品| 亚洲精品天天看| 丰满人妻一区二区三区大胸 | 欧美激情三级免费| 日本一区二区视频在线播放| 蜜臀av一区| 欧美一二三区在线| 午夜视频在线网站| 国模冰冰炮一区二区| 亚洲资源中文字幕| 中文字幕一区二区三区有限公司 | xxxx日韩| 8x8x8国产精品| 天堂社区在线视频| 三级在线观看视频| 亚洲国产精品精华液网站| 最近看过的日韩成人| 岛国大片在线观看| 久久综合久久鬼色中文字| 国产高清自拍一区| 精品人妻伦一二三区久久| 视频一区欧美日韩| 国产成+人+综合+亚洲欧洲| 国产一级特黄aaa大片| 欧美日韩国产亚洲一区| 久久国产精品99国产精| 日韩精品久久久久久久的张开腿让| 丝袜av一区| 日韩精品中文字幕久久臀| 一边摸一边做爽的视频17国产| 天堂va在线高清一区| 日韩亚洲欧美在线| 三年中文在线观看免费大全中国| 欧美黄色a视频| 欧美性大战久久久久久久蜜臀| 丁香啪啪综合成人亚洲| 伊人久久视频| 日本精品一级二级| 日本精品久久久久中文字幕| 在线观看欧美日韩电影| 色狠狠色狠狠综合| 黄色免费网址大全| 色成人综合网| 日韩一二三区视频| 97精品人妻一区二区三区蜜桃| 国产欧美一区二区三区米奇| 亚洲激情久久久| 久久午夜夜伦鲁鲁片| 亚洲日本三级| 一区二区三区四区视频| 国产在视频线精品视频| 91精品动漫在线观看| 大量国产精品视频| 国产亚洲色婷婷久久99精品| 亚洲精品日本| 国产精品 欧美在线| 中文在线最新版天堂| 久久66热re国产| 99re视频在线播放| 天堂v在线观看| 久久久久国产成人精品亚洲午夜| 亚洲国产婷婷香蕉久久久久久99| 免费网站成人| 亚洲国产精品嫩草影院| 黑森林福利视频导航| 黄页免费欧美| 亚洲成人999| 国产又粗又猛又爽又黄的视频四季 | 国产色在线观看| 亚洲一区在线看| 少妇性l交大片| 动漫一区二区三区| 亚洲精品videossex少妇| 国产精品一二三区在线观看| 久久精品青草| 欧美在线xxx| 91精品国产乱码久久| 成人h版在线观看| 日韩中文字幕av在线| 成人免费网址| 欧美性猛交xxxx偷拍洗澡| 伊人国产在线视频| 久久国产精品免费精品3p| 中文字幕一区二区精品| 不卡的免费av| 久久er99精品| 欧美日韩国产不卡在线看| 成人免费在线| 91福利在线导航| 人妖粗暴刺激videos呻吟| 日韩在线不卡| 日本不卡视频在线播放| 99久久精品无免国产免费| 久久亚洲免费视频| 亚洲精品久久久久久久蜜桃臀| 精品日本视频| 日韩国产激情在线| 久久久久99精品成人片试看| 青青草国产精品97视觉盛宴| 国产伦精品一区二区三区在线| 麻豆视频在线免费观看| 在线影视一区二区三区| 国产又黄又粗又猛又爽的视频| 欧美一区久久| 国产欧美日韩中文字幕| 国产中文字幕在线播放| 亚洲国产sm捆绑调教视频| 亚洲午夜激情影院| av伊人久久| 国产高清视频一区三区| 人妻精品无码一区二区| 日韩毛片高清在线播放| 人妻无码视频一区二区三区| 亚洲精品3区| 91国产精品91| 熟妇人妻中文av无码| 一区二区三区四区激情| 午夜视频在线观| 日韩精品水蜜桃| 国产精品视频网| 国产永久av在线| 欧美小视频在线| 免费的av网站| 国产精品嫩草99av在线| 久久精品国产精品国产精品污| 成年人国产在线观看| 日韩一级免费观看| 久久久久久av无码免费网站| 国产精品综合视频| 800av在线免费观看| 日韩视频一二区| 欧美精品aaa| 黄色美女一级片| 午夜精品在线视频一区| 欧美一级片黄色| 在线亚洲免费| 另类小说综合网| 二吊插入一穴一区二区| 亚洲天堂精品在线| 中文字幕 亚洲视频| 国产精品丝袜久久久久久app| 亚洲人辣妹窥探嘘嘘| 日韩情爱电影在线观看| 91久久久在线| 国产蜜臀av在线播放| 日韩电视剧免费观看网站| 少妇一级淫片免费放中国 | 欧美日韩电影免费看| 亚洲欧美成人在线| 日本一区二区三区久久| 亚洲视频资源在线| 一本色道久久hezyo无码| 国产欧美丝祙| 日韩三级电影| 国产日韩欧美中文在线| 午夜免费久久久久| 国产精品秘入口| 88在线观看91蜜桃国自产| 免费无遮挡无码永久在线观看视频| 成人va在线观看| 久热免费在线观看| 99久久www免费| 国产精品一区二区三区精品| 一区一区三区| 久久影视电视剧免费网站清宫辞电视| 成人免费观看在线视频| 一本色道**综合亚洲精品蜜桃冫| 啪啪一区二区三区| www.亚洲色图| 超碰在线公开97| 精品成人一区| 亚洲一区影院| 国产精品高潮呻吟久久久久| 国产精品户外野外| 亚洲妇熟xxxx妇色黄| 国产视频精品在线| 国产视频在线免费观看| 日韩欧美极品在线观看| 国产午夜手机精彩视频| 久久久久亚洲蜜桃| 日本在线观看视频一区| 性娇小13――14欧美| 2021狠狠干| 国产精品嫩草影院在线看| 97在线资源站| 亚洲美女色播| 情事1991在线| 久草在线视频福利| 丝袜情趣国产精品| 青青久草在线| 精品久久一区二区| 国产又大又黄的视频| 欧美视频在线观看免费网址| 麻豆亚洲av熟女国产一区二| 国产精品久久久久久久久免费桃花 | 亚洲图中文字幕| 亚洲第一色视频| 欧美日韩精品免费观看视频 | 尤物yw193can在线观看| 亚洲性视频网址| 无码h黄肉3d动漫在线观看| 日韩视频免费观看高清在线视频| 一区二区三区在线免费观看视频| 精品久久久久久久久久国产 | 精品视频在线视频| 99热只有这里有精品| 亚洲国产一区二区三区| 日本高清一二三区| 中文字幕欧美日韩一区| 美女久久久久久久久久| 91亚洲精品乱码久久久久久蜜桃| 绯色av蜜臀vs少妇| 国产综合久久久久影院| 亚洲成人福利在线| 美腿丝袜亚洲色图| 午夜在线观看av| 日韩av一二三| 最近中文字幕一区二区| 免费人成黄页网站在线一区二区| aaaaaa亚洲| 久久久久99| aⅴ在线免费观看| 亚洲永久在线| 精品久久久久av| 日韩一区欧美二区| 欧洲黄色一级视频| 国产精品亚洲综合久久| 怡红院av亚洲一区二区三区h| 在线不卡欧美| 亚洲 高清 成人 动漫| 日韩视频一区| 亚洲色欲综合一区二区三区| 久久久久久久高潮| 日韩一级理论片| 日本视频中文字幕一区二区三区| 日韩一级片播放| 免费成人小视频| 亚洲第一天堂久久| 国产精品一区二区在线播放| 99热这里只有精品2| 成人久久久精品乱码一区二区三区 | mm131午夜| 国产精品多人| 美女av免费在线观看| 久久字幕精品一区| 日韩一区二区三区久久| 国产精品资源在线| 182在线视频| 国产欧美综合色| sm捆绑调教视频| 一区二区免费看| 久久露脸国语精品国产91| 日本精品一区二区三区高清| 中文字幕在线播放av| 日韩一区二区三区电影在线观看| 欧美 日韩 国产 成人 在线| 亚洲午夜国产成人av电影男同| 午夜在线观看视频| 欧美激情精品久久久久久| 国产无遮挡裸体视频在线观看| 国产99久久精品一区二区 夜夜躁日日躁 | 成人a级免费视频| 人人九九精品视频| 免费日韩av电影| 香蕉久久网站| 少妇高潮喷水在线观看| 美国十次了思思久久精品导航| 国产ts在线观看| 国产欧美中文在线| 国产一卡二卡在线| 欧美日韩亚洲综合在线 | 精品少妇人欧美激情在线观看| 国产精品人人爽人人做我的可爱| 一级黄色特级片| av一二三不卡影片| 青青操在线播放| 欧美日韩精品国产| 国产一区二区三区成人| 亚洲精品久久久久久久久久久久| 蜜桃视频网站在线| 91成人免费观看网站| 亚洲精品777| 欧美国产视频在线观看| 午夜精品免费| 乌克兰美女av| 26uuu欧美日本| 看片网站在线观看| 欧美日韩一区中文字幕| 日本不卡免费播放| 欧美疯狂xxxx大交乱88av| 日韩高清不卡| 精品免费二区三区三区高中清不卡 | 天海翼一区二区| 制服丝袜亚洲精品中文字幕| 久久精品国产亚洲a∨麻豆| 色综合视频一区中文字幕| 美女视频一区| 欧美日韩在线高清| 在线看片一区| 国产人妻精品午夜福利免费| 国产精品伦一区二区三级视频| 影音先锋在线国产| 精品成人一区二区三区四区| 九色porny丨首页在线| 国产精品久久久久久久久久久不卡| 精品视频在线你懂得| 免费在线看黄色片| 国产精品自在在线| 日韩欧美综合视频| 欧美久久久久久久久久| www.视频在线.com| 国产精品白嫩美女在线观看| 欧美日韩直播| 9久久9毛片又大又硬又粗| 国产91精品久久久久久久网曝门| 一区二区国产精品精华液| 欧美日韩在线播放一区| 自拍视频在线网| 国产乱肥老妇国产一区二 | 日韩欧美另类中文字幕| 中文字幕精品—区二区日日骚| 麻豆国产精品官网| 色婷婷粉嫩av| 5月丁香婷婷综合| free性欧美hd另类精品| 91最新在线免费观看| 国产精品videosex性欧美| 亚洲一区在线不卡| 国产精品美女久久久久aⅴ| 亚洲天堂自拍偷拍| 日韩视频免费大全中文字幕| 欧美激情不卡| 干日本少妇视频| 成人丝袜18视频在线观看| 日韩成人高清视频| 精品视频www| 三级成人在线| 亚洲一区三区电影在线观看| 国内精品伊人久久久久av影院 | 人妻精品久久久久中文字幕| 都市激情亚洲色图| 欧美拍拍视频| 国产精品视频免费在线| 国产精品久久占久久| 日本wwwxx| 精品美女国产在线| 成人亚洲性情网站www在线观看| 国产精品视频在线播放| 亚洲国产精品久久久天堂| 国产一精品一aⅴ一免费| 欧美日韩国产色| a中文在线播放| 99国精产品一二二线| av成人天堂| 国产欧美一区二区三区在线观看视频| 欧美一区二区在线免费观看| segui88久久综合| 亚洲成色www久久网站| 国产麻豆精品theporn| 在线观看亚洲欧美| www.国产精品一二区| 超碰精品在线观看| 在线视频日韩一区| 亚洲另类色综合网站| 婷婷国产在线| 成人综合国产精品| 国产精品色网| 欧美精品久久久久久久久46p| 亚洲娇小xxxx欧美娇小| 黄色成人小视频| 久在线观看视频| 亚洲色图一区二区三区| 色鬼7777久久| 91精品国产高清久久久久久91裸体| 国产日韩一区二区三区在线| 久久久99999| 亚洲欧美中文在线视频| 国内精品视频| 日韩免费高清在线| 亚洲成人资源在线| 欧美性videos| 日韩.欧美.亚洲| 岛国av在线一区|