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

關(guān)于HashMap容量的初始化,還有這么多學(xué)問(wèn)

企業(yè)動(dòng)態(tài)
我們?cè)賮?lái)深入學(xué)習(xí)下,到底應(yīng)不應(yīng)該設(shè)置HashMap的默認(rèn)容量?如果真的要設(shè)置HashMap的初始容量,我們應(yīng)該設(shè)置多少?

《HashMap中傻傻分不清楚的那些概念》文章中,我們介紹了HashMap中和容量相關(guān)的幾個(gè)概念,簡(jiǎn)單介紹了一下HashMap的擴(kuò)容機(jī)制。

[[230879]]

文中我們提到,默認(rèn)情況下HashMap的容量是16,但是,如果用戶通過(guò)構(gòu)造函數(shù)指定了一個(gè)數(shù)字作為容量,那么Hash會(huì)選擇大于該數(shù)字的***個(gè)2的冪作為容量。(3->4、7->8、9->16)

本文,延續(xù)上一篇文章,我們?cè)賮?lái)深入學(xué)習(xí)下,到底應(yīng)不應(yīng)該設(shè)置HashMap的默認(rèn)容量?如果真的要設(shè)置HashMap的初始容量,我們應(yīng)該設(shè)置多少?

為什么要設(shè)置HashMap的初始化容量

我們之前提到過(guò),《阿里巴巴Java開(kāi)發(fā)手冊(cè)》中建議我們?cè)O(shè)置HashMap的初始化容量。

那么,為什么要這么建議?你有想過(guò)沒(méi)有。

我們先來(lái)寫(xiě)一段代碼在JDK 1.7 (jdk1.7.0_79)下面來(lái)分別測(cè)試下,在不指定初始化容量和指定初始化容量的情況下性能情況如何。(jdk 8 結(jié)果會(huì)有所不同,我會(huì)在后面的文章中分析)

  1. public static void main(String[] args) { 
  2.    int aHundredMillion = 10000000; 
  3.  
  4.    Map<IntegerInteger> map = new HashMap<>(); 
  5.  
  6.    long s1 = System.currentTimeMillis(); 
  7.    for (int i = 0; i < aHundredMillion; i++) { 
  8.        map.put(i, i); 
  9.    } 
  10.    long s2 = System.currentTimeMillis(); 
  11.  
  12.    System.out.println("未初始化容量,耗時(shí) : " + (s2 - s1)); 
  13.  
  14.  
  15.    Map<IntegerInteger> map1 = new HashMap<>(aHundredMillion / 2); 
  16.  
  17.    long s5 = System.currentTimeMillis(); 
  18.    for (int i = 0; i < aHundredMillion; i++) { 
  19.        map1.put(i, i); 
  20.    } 
  21.    long s6 = System.currentTimeMillis(); 
  22.  
  23.    System.out.println("初始化容量5000000,耗時(shí) : " + (s6 - s5)); 
  24.  
  25.  
  26.    Map<IntegerInteger> map2 = new HashMap<>(aHundredMillion); 
  27.  
  28.    long s3 = System.currentTimeMillis(); 
  29.    for (int i = 0; i < aHundredMillion; i++) { 
  30.        map2.put(i, i); 
  31.    } 
  32.    long s4 = System.currentTimeMillis(); 
  33.  
  34.    System.out.println("初始化容量為10000000,耗時(shí) : " + (s4 - s3)); 

以上代碼不難理解,我們創(chuàng)建了3個(gè)HashMap,分別使用默認(rèn)的容量(16)、使用元素個(gè)數(shù)的一半(5千萬(wàn))作為初始容量、使用元素個(gè)數(shù)(一億)作為初始容量進(jìn)行初始化。然后分別向其中put一億個(gè)KV。

輸出結(jié)果:

  1. 未初始化容量,耗時(shí) : 14419 
  2. 初始化容量5000000,耗時(shí) : 11916 
  3. 初始化容量為10000000,耗時(shí) : 7984 

從結(jié)果中,我們可以知道,在已知HashMap中將要存放的KV個(gè)數(shù)的時(shí)候,設(shè)置一個(gè)合理的初始化容量可以有效的提高性能。

當(dāng)然,以上結(jié)論也是有理論支撐的。我們上一篇文章介紹過(guò),HashMap有擴(kuò)容機(jī)制,就是當(dāng)達(dá)到擴(kuò)容條件時(shí)會(huì)進(jìn)行擴(kuò)容。HashMap的擴(kuò)容條件就是當(dāng)HashMap中的元素個(gè)數(shù)(size)超過(guò)臨界值(threshold)時(shí)就會(huì)自動(dòng)擴(kuò)容。在HashMap中,threshold = loadFactor * capacity。

所以,如果我們沒(méi)有設(shè)置初始容量大小,隨著元素的不斷增加,HashMap會(huì)發(fā)生多次擴(kuò)容,而HashMap中的擴(kuò)容機(jī)制決定了每次擴(kuò)容都需要重建hash表,是非常影響性能的。(關(guān)于resize,后面我會(huì)有文章單獨(dú)介紹)

從上面的代碼示例中,我們還發(fā)現(xiàn),同樣是設(shè)置初始化容量,設(shè)置的數(shù)值不同也會(huì)影響性能,那么當(dāng)我們已知HashMap中即將存放的KV個(gè)數(shù)的時(shí)候,容量設(shè)置成多少為好呢?

HashMap中容量的初始化

在上一篇文章中,我們通過(guò)代碼實(shí)例其實(shí)介紹過(guò),默認(rèn)情況下,當(dāng)我們?cè)O(shè)置HashMap的初始化容量時(shí),實(shí)際上HashMap會(huì)采用***個(gè)大于該數(shù)值的2的冪作為初始化容量。

上一篇文章中有個(gè)例子

  1. Map<String, String> map = new HashMap<String, String>(1); 
  2. map.put("hahaha""hollischuang"); 
  3.  
  4. Class<?> mapType = map.getClass(); 
  5. Method capacity = mapType.getDeclaredMethod("capacity"); 
  6. capacity.setAccessible(true); 
  7. System.out.println("capacity : " + capacity.invoke(map)); 

初始化容量設(shè)置成1的時(shí)候,輸出結(jié)果是2。在jdk1.8中,如果我們傳入的初始化容量為1,實(shí)際上設(shè)置的結(jié)果也為1,上面代碼輸出結(jié)果為2的原因是代碼中map.put("hahaha", "hollischuang");導(dǎo)致了擴(kuò)容,容量從1擴(kuò)容到2。

那么,話題再說(shuō)回來(lái),當(dāng)我們通過(guò)HashMap(int initialCapacity)設(shè)置初始容量的時(shí)候,HashMap并不一定會(huì)直接采用我們傳入的數(shù)值,而是經(jīng)過(guò)計(jì)算,得到一個(gè)新值,目的是提高h(yuǎn)ash的效率。(1->1、3->4、7->8、9->16)

在Jdk 1.7和Jdk 1.8中,HashMap初始化這個(gè)容量的時(shí)機(jī)不同。jdk1.8中,在調(diào)用HashMap的構(gòu)造函數(shù)定義HashMap的時(shí)候,就會(huì)進(jìn)行容量的設(shè)定。而在Jdk 1.7中,要等到***次put操作時(shí)才進(jìn)行這一操作。

不管是Jdk 1.7還是Jdk 1.8,計(jì)算初始化容量的算法其實(shí)是如出一轍的,主要代碼如下:

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

上面的代碼挺有意思的,一個(gè)簡(jiǎn)單的容量初始化,Java的工程師也有很多考慮在里面。

上面的算法目的挺簡(jiǎn)單,就是:根據(jù)用戶傳入的容量值(代碼中的cap),通過(guò)計(jì)算,得到***個(gè)比他大的2的冪并返回。

聰明的讀者們,如果讓你設(shè)計(jì)這個(gè)算法你準(zhǔn)備如何計(jì)算?如果你想到二進(jìn)制的話,那就很簡(jiǎn)單了。舉幾個(gè)例子看一下:

請(qǐng)關(guān)注上面的幾個(gè)例子中,藍(lán)色字體部分的變化情況,或許你會(huì)發(fā)現(xiàn)些規(guī)律。5->8、9->16、19->32、37->64都是主要經(jīng)過(guò)了兩個(gè)階段。

  • Step 1,5->7
  • Step 2,7->8
  • Step 1,9->15
  • Step 2,15->16
  • Step 1,19->31
  • Step 2,31->32

對(duì)應(yīng)到以上代碼中,Step1:

  1. n |= n >>> 1;  
  2. n |= n >>> 2;  
  3. n |= n >>> 4; 
  4. n |= n >>> 8;  
  5. n |= n >>> 16; 

對(duì)應(yīng)到以上代碼中,Step2:

  1. return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; 

Step 2 比較簡(jiǎn)單,就是做一下極限值的判斷,然后把Step 1得到的數(shù)值+1。

Step 1 怎么理解呢?其實(shí)是對(duì)一個(gè)二進(jìn)制數(shù)依次向右移位,然后與原值取或。其目的對(duì)于一個(gè)數(shù)字的二進(jìn)制,從***個(gè)不為0的位開(kāi)始,把后面的所有位都設(shè)置成1。

隨便拿一個(gè)二進(jìn)制數(shù),套一遍上面的公式就發(fā)現(xiàn)其目的了:

  1. 1100 1100 1100 >>>1 = 0110 0110 0110 
  2. 1100 1100 1100 | 0110 0110 0110 = 1110 1110 1110 
  3. 1110 1110 1110 >>>2 = 0011 1011 1011 
  4. 1110 1110 1110 | 0011 1011 1011 = 1111 1111 1111 
  5. 1111 1111 1111 >>>4 = 1111 1111 1111 
  6. 1111 1111 1111 | 1111 1111 1111 = 1111 1111 1111 

通過(guò)幾次無(wú)符號(hào)右移和按位或運(yùn)算,我們把1100 1100 1100轉(zhuǎn)換成了1111 1111 1111 ,再把1111 1111 1111加1,就得到了1 0000 0000 0000,這就是大于1100 1100 1100的***個(gè)2的冪。

好了,我們現(xiàn)在解釋清楚了Step 1和Step 2的代碼。就是可以把一個(gè)數(shù)轉(zhuǎn)化成***個(gè)比他自身大的2的冪。(可以開(kāi)始佩服Java的工程師們了,使用無(wú)符號(hào)右移和按位或運(yùn)算大大提升了效率。)

但是還有一種特殊情況套用以上公式不行,這些數(shù)字就是2的冪自身。如果數(shù)字4 套用公式的話。得到的會(huì)是 8 :

  1. Step 1:  
  2. 0100 >>>1 = 0010 
  3. 0100 | 0010 = 0110 
  4. 0110 >>>1 = 0011 
  5. 0110 | 0011 = 0111 
  6.  
  7.  
  8. Step 2: 
  9. 0111 + 0001 = 1000 

為了解決這個(gè)問(wèn)題,JDK的工程師把所有用戶傳進(jìn)來(lái)的數(shù)在進(jìn)行計(jì)算之前先-1,就是源碼中的***行:

  1. int n = cap - 1; 

至此,再來(lái)回過(guò)頭看看這個(gè)設(shè)置初始容量的代碼,目的是不是一目了然了:

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

HashMap中初始容量的合理值

當(dāng)我們使用HashMap(int initialCapacity)來(lái)初始化容量的時(shí)候,jdk會(huì)默認(rèn)幫我們計(jì)算一個(gè)相對(duì)合理的值當(dāng)做初始容量。那么,是不是我們只需要把已知的HashMap中即將存放的元素個(gè)數(shù)直接傳給initialCapacity就可以了呢?

關(guān)于這個(gè)值的設(shè)置,在《阿里巴巴Java開(kāi)發(fā)手冊(cè)》有以下建議:

這個(gè)值,并不是阿里巴巴的工程師原創(chuàng)的,在guava(21.0版本)中也使用的是這個(gè)值。

  1. public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) { 
  2.    return new HashMap<K, V>(capacity(expectedSize)); 
  3.  
  4. /** 
  5. Returns a capacity that is sufficient to keep the map from being resized as long as it grows no 
  6. * larger than expectedSize and the load factor is ≥ its default (0.75). 
  7. */ 
  8. static int capacity(int expectedSize) { 
  9.    if (expectedSize < 3) { 
  10.      checkNonnegative(expectedSize, "expectedSize"); 
  11.      return expectedSize + 1; 
  12.    } 
  13.    if (expectedSize < Ints.MAX_POWER_OF_TWO) { 
  14.      // This is the calculation used in JDK8 to resize when a putAll 
  15.      // happens; it seems to be the most conservative calculation we 
  16.      // can make.  0.75 is the default load factor. 
  17.      return (int) ((float) expectedSize / 0.75F + 1.0F); 
  18.    } 
  19.    return Integer.MAX_VALUE; // any large value 

在return (int) ((float) expectedSize / 0.75F + 1.0F);上面有一行注釋,說(shuō)明了這個(gè)公式也不是guava原創(chuàng),參考的是JDK8中putAll方法中的實(shí)現(xiàn)的。感興趣的讀者可以去看下putAll方法的實(shí)現(xiàn),也是以上的這個(gè)公式。

雖然,當(dāng)我們使用HashMap(int initialCapacity)來(lái)初始化容量的時(shí)候,jdk會(huì)默認(rèn)幫我們計(jì)算一個(gè)相對(duì)合理的值當(dāng)做初始容量。但是這個(gè)值并沒(méi)有參考loadFactor的值。

也就是說(shuō),如果我們?cè)O(shè)置的默認(rèn)值是7,經(jīng)過(guò)Jdk處理之后,會(huì)被設(shè)置成8,但是,這個(gè)HashMap在元素個(gè)數(shù)達(dá)到 8*0.75 = 6的時(shí)候就會(huì)進(jìn)行一次擴(kuò)容,這明顯是我們不希望見(jiàn)到的。

如果我們通過(guò)expectedSize / 0.75F + 1.0F計(jì)算,7/0.75 + 1 = 10 ,10經(jīng)過(guò)Jdk處理之后,會(huì)被設(shè)置成16,這就大大的減少了擴(kuò)容的幾率。

當(dāng)HashMap內(nèi)部維護(hù)的哈希表的容量達(dá)到75%時(shí)(默認(rèn)情況下),會(huì)觸發(fā)rehash,而rehash的過(guò)程是比較耗費(fèi)時(shí)間的。所以初始化容量要設(shè)置成expectedSize/0.75 + 1的話,可以有效的減少?zèng)_突也可以減小誤差。

所以,我可以認(rèn)為,當(dāng)我們明確知道HashMap中元素的個(gè)數(shù)的時(shí)候,把默認(rèn)容量設(shè)置成expectedSize / 0.75F + 1.0F 是一個(gè)在性能上相對(duì)好的選擇,但是,同時(shí)也會(huì)犧牲些內(nèi)存。

總結(jié)

當(dāng)我們想要在代碼中創(chuàng)建一個(gè)HashMap的時(shí)候,如果我們已知這個(gè)Map中即將存放的元素個(gè)數(shù),給HashMap設(shè)置初始容量可以在一定程度上提升效率。

但是,JDK并不會(huì)直接拿用戶傳進(jìn)來(lái)的數(shù)字當(dāng)做默認(rèn)容量,而是會(huì)進(jìn)行一番運(yùn)算,最終得到一個(gè)2的冪。原因在(全網(wǎng)把Map中的hash()分析的最透徹的文章,別無(wú)二家。)介紹過(guò),得到這個(gè)數(shù)字的算法其實(shí)是使用了使用無(wú)符號(hào)右移和按位或運(yùn)算來(lái)提升效率。

但是,為了***程度的避免擴(kuò)容帶來(lái)的性能消耗,我們建議可以把默認(rèn)容量的數(shù)字設(shè)置成expectedSize / 0.75F + 1.0F 。在日常開(kāi)發(fā)中,可以使用

  1. Map<String, String> map = Maps.newHashMapWithExpectedSize(10); 

來(lái)創(chuàng)建一個(gè)HashMap,計(jì)算的過(guò)程guava會(huì)幫我們完成。

但是,以上的操作是一種用內(nèi)存換性能的做法,真正使用的時(shí)候,要考慮到內(nèi)存的影響。

***,留一個(gè)思考題:為什么JDK 8中,putAll方法采用了這個(gè)expectedSize / 0.75F + 1.0F公式,而put、構(gòu)造函數(shù)等并沒(méi)有默認(rèn)使用這個(gè)公式呢?

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號(hào)Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2021-01-14 05:08:44

編譯鏈接

2017-07-04 14:01:40

機(jī)房機(jī)柜

2023-11-13 08:49:54

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2017-06-16 16:16:36

庫(kù)存扣減查詢

2024-01-31 12:34:16

panic錯(cuò)誤檢測(cè)recover

2018-06-26 15:00:24

Docker安全風(fēng)險(xiǎn)

2024-01-02 12:48:49

2019-12-09 10:13:20

HashMap選擇容量

2022-01-12 20:04:09

網(wǎng)絡(luò)故障斷網(wǎng)事件網(wǎng)絡(luò)安全

2022-05-29 08:54:44

Edge瀏覽器

2018-01-31 16:12:47

筆記本輕薄本游戲本

2013-01-15 09:41:45

編程語(yǔ)言

2017-12-21 19:38:50

潤(rùn)乾中間表

2022-07-26 23:43:29

編程語(yǔ)言開(kāi)發(fā)Java

2024-05-13 16:22:25

固態(tài)硬盤(pán)接口硬盤(pán)

2021-05-31 22:26:20

5G技術(shù)通信

2020-06-16 14:11:48

find命令文件查找

2017-07-12 08:20:32

閃存用途企業(yè)

2021-01-05 07:00:53

微信隱藏功能移動(dòng)應(yīng)用
點(diǎn)贊
收藏

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

二区三区在线观看| 中文字幕乱码视频| 成人av综合网| 日韩欧美一区二区在线| 三区精品视频观看| 国产日本精品视频| 亚洲综合社区| 久久久久www| 成人免费av片| 国产一精品一av一免费爽爽| 五月天激情综合| 一区二区成人国产精品| 天堂网在线资源| 美女高潮久久久| 97视频在线观看成人| 美国一级片在线观看| 精品淫伦v久久水蜜桃| 欧美日韩一级大片网址| 欧美 日本 亚洲| 精品视频在线一区二区| 久久亚洲精精品中文字幕早川悠里| 国产有码在线一区二区视频| 成年人视频在线免费看| 欧美91大片| 中文字幕九色91在线| 在线观看亚洲免费视频| 国产美女久久| 色婷婷精品大在线视频| 日本一区午夜艳熟免费| 毛片在线播放a| 国产视频一区在线播放| 国产一区二区三区高清| av免费在线不卡| 免费观看久久久4p| 国产精品69av| 91porny在线| 亚洲激情不卡| 久久99久久99精品免观看粉嫩| 国产aaaaaaaaa| 国产在线观看91一区二区三区 | 中文字幕在线2018| 男人天堂欧美日韩| 97色在线播放视频| 久久精品国产亚洲AV无码男同| 亚洲色图欧美| 久久精品视频亚洲| 久久精品色妇熟妇丰满人妻| 欧洲毛片在线视频免费观看| 亚洲老板91色精品久久| 国产美女喷水视频| 美女一区2区| 亚洲精品美女久久久| 怡红院一区二区| 国产成人一二片| 精品国产1区二区| 亚洲av午夜精品一区二区三区| 国产精品亚洲欧美一级在线 | 亚洲国产欧美在线| 成人免费在线视频播放| 污污视频在线看| 一区二区三区**美女毛片| 99热都是精品| 欧美性猛片xxxxx免费中国| 一区二区三区在线免费| 福利在线小视频| 日韩123区| 亚洲成人av电影在线| 青青草国产精品视频| 精精国产xxxx视频在线野外| 欧美色视频日本版| 亚洲精品怡红院| 激情久久99| 91麻豆精品国产| 亚洲无人区码一码二码三码| 久久亚洲道色| 亚洲欧美在线免费观看| 超碰人人干人人| 亚洲国产一成人久久精品| 久久999免费视频| av资源免费观看| 六月丁香综合在线视频| 91在线视频导航| 免费观看黄一级视频| 99久久精品情趣| 视频一区国产精品| 亚洲小说区图片区都市| 欧美日韩在线一区| 污视频网址在线观看| 88久久精品| 亚洲欧洲国产精品| 国产天堂av在线| 国产精品毛片在线| 国产精品一区电影| 男人天堂手机在线观看| 国产清纯白嫩初高生在线观看91| 日本久久高清视频| 综合另类专区| 欧美一区二区女人| 亚洲国产无码精品| 你懂的国产精品永久在线| 欧美亚洲成人免费| 国产裸体无遮挡| 久久久久免费观看| 天天想你在线观看完整版电影免费| 天堂√8在线中文| 538在线一区二区精品国产| 少妇一级淫片免费放播放| 日韩在线二区| 777午夜精品福利在线观看| 夜夜爽8888| 26uuu欧美日本| 2022中文字幕| 国产一区高清| 亚洲精品在线91| 久久久久久久黄色| 毛片基地黄久久久久久天堂| 麻豆av一区| 污污的网站在线看| 欧美日韩国产免费一区二区| 在线 丝袜 欧美 日韩 制服| 欧美视频在线观看| 国产欧美婷婷中文| 麻豆国产在线播放| 天天色 色综合| 国产精品91av| 五月天久久网站| 国产精品美女www爽爽爽视频| 天堂av资源网| 亚洲成人综合网站| 女同性αv亚洲女同志| 999精品在线| 国产精品盗摄久久久| 视频二区在线| 精品免费在线观看| 在线观看亚洲免费视频| 欧美片第1页综合| 亚洲影院高清在线| 国产超级va在线视频| 欧美优质美女网站| 一级片视频免费看| 久久久久网站| 青青草成人网| 91国内外精品自在线播放| 亚洲欧美一区二区三区久久 | 国产精品视频一区二区三区经| 国产精品久久久久久福利| 欧美色手机在线观看| 国产成人福利在线| 亚洲深爱激情| 久久久久久久免费| 性国裸体高清亚洲| 亚洲乱码国产乱码精品精天堂| 日韩在线视频免费播放| 久久亚洲二区三区| 妺妺窝人体色www在线小说| 欧美黑白配在线| 555www成人网| 日本一区高清| 欧美日韩在线观看一区二区| 国产精品久久国产精麻豆96堂| 麻豆91小视频| 国内自拍中文字幕| 久久草在线视频| 2019亚洲男人天堂| 免费一级在线观看播放网址| 在线看不卡av| 操她视频在线观看| 国产美女精品一区二区三区| 日韩 欧美 视频| 亚洲美女久久| 国产免费一区二区三区香蕉精| 日本三级在线视频| 日韩欧美视频一区| 亚洲免费激情视频| 国产欧美一区二区精品性| 亚洲一级免费在线观看| 欧美特黄一级| 欧美色欧美亚洲另类七区| a成人v在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 91久久极品少妇xxxxⅹ软件| 丰满诱人av在线播放| 亚洲欧美日韩视频一区| 国产美女无遮挡永久免费| 亚洲电影中文字幕在线观看| 三上悠亚影音先锋| 国产一二三精品| 日韩网址在线观看| 99免费精品| 久久青青草综合| 国产成人久久精品一区二区三区| 高清在线视频日韩欧美| seseavlu视频在线| 欧美r级电影在线观看| 高潮毛片又色又爽免费| 亚洲精品欧美激情| 国产毛片久久久久久久| 国产精品18久久久| 男女污污的视频| 海角社区69精品视频| 日韩亚洲一区在线播放| 中文无码日韩欧| 国产精品日韩欧美大师| japanese色国产在线看视频| 最近2019中文字幕第三页视频| 风流少妇一区二区三区91| 欧美吻胸吃奶大尺度电影| 日韩黄色a级片| 亚洲视频在线观看一区| www.中文字幕av| 成人一区二区三区视频| 一道本在线免费视频| 亚洲永久免费| 青草青青在线视频| 外国成人激情视频| 亚洲成人av动漫| 亚洲裸色大胆大尺寸艺术写真| 国产不卡一区二区在线观看 | 国产亚洲自拍偷拍| **国产精品| 国产精品久久久久久久美男| 色黄视频在线观看| 久久久在线视频| 制服丝袜在线播放| 日韩亚洲第一页| 波多野结衣一区二区| 精品亚洲一区二区| 天堂中文网在线| 精品欧美黑人一区二区三区| 国产精品美女一区| 欧美日韩国产一级| 中文字幕在线2018| 欧美日韩一级片在线观看| 午夜精品免费观看| 日韩欧美极品在线观看| 五月婷婷亚洲综合| 激情av一区二区| 日本熟妇毛茸茸丰满| 亚洲第一激情av| 精品一区二区三区人妻| 亚洲一区在线观看免费观看电影高清| 日本黄色免费片| 日韩一区在线看| 希岛爱理中文字幕| 亚洲欧美成aⅴ人在线观看 | 日韩欧美成人免费视频| 91美女免费看| 在线一区二区视频| 久久久国产免费| 成人免费视频国产| 亚洲电影在线播放| 日韩av在线播| 黑人精品xxx一区| 中文在线第一页| 在线观看91视频| 瑟瑟视频在线免费观看| 欧美三级三级三级| 国产精品人人爽| 日韩免费福利电影在线观看| 成人爽a毛片一区二区| 亚洲国产精品字幕| 男女视频在线观看免费| 中国china体内裑精亚洲片| 91网在线播放| 欧美久久精品一级黑人c片| 免费污视频在线| 欧美在线精品免播放器视频| 久久夜夜操妹子| 成人国产亚洲精品a区天堂华泰| 欧美大片91| 久久99精品久久久久久秒播放器| 欧美女优在线视频| 色乱码一区二区三区熟女| 国内久久精品| 日日摸天天爽天天爽视频| 久久精品国产999大香线蕉| 三级网站免费看| 91麻豆国产福利精品| www.日本高清视频| 亚洲欧美日韩国产另类专区 | 色婷婷综合久色| 亚洲一级在线播放| 欧美va日韩va| 国产美女性感在线观看懂色av | 亚洲韩国日本中文字幕| 久久伊伊香蕉| 久久久精品999| 91福利在线免费| 国产精品久久久久久久久久久不卡| 国产不卡精品在线| 欧美午夜免费| 欧美日韩国产免费观看| www.xxx亚洲| 懂色av一区二区三区免费看| 国产精品av久久久久久无| 亚洲男帅同性gay1069| 久久久久在线视频| 日韩免费观看高清完整版在线观看| 天堂成人在线| 欧美日韩成人在线观看| 日韩欧美精品一区二区综合视频| 超碰97人人人人人蜜桃| 欧美精品尤物在线观看 | 蜜桃久久av一区| a天堂视频在线观看| 成人免费在线播放视频| 亚洲天堂视频网站| 精品国产一区久久| 日韩免费网站| 国产精品91在线观看| 99热这里只有精品首页| 在线成人性视频| 久久中文欧美| 一级少妇精品久久久久久久| 中文字幕一区二区在线播放| 一级黄色大片视频| 亚洲精品国产免费| 肉肉视频在线观看| 91久久精品国产| 欧美xxav| 牛夜精品久久久久久久| 久久综合成人精品亚洲另类欧美 | 精品国产sm最大网站免费看| 麻豆传媒在线免费| 国产精品久久久久久影视| 亚洲理论电影| 欧美国产亚洲一区| hitomi一区二区三区精品| 久久久久久国产精品视频| 欧美一个色资源| 国产三级在线播放| 国产玖玖精品视频| 欧美一区二区三| 美女网站免费观看视频| 久久男人中文字幕资源站| 好吊操这里只有精品| 欧美精品一区二区三区蜜桃| 午夜激情在线| 国产精品v欧美精品∨日韩| 综合天堂av久久久久久久| 国产女同无遮挡互慰高潮91| 亚洲特黄一级片| 国产伦精品一区二区三区视频痴汉| 中文字幕日本精品| 久久久久久久性潮| 一本久久a久久精品vr综合| 美腿丝袜亚洲综合| 娇小11一12╳yⅹ╳毛片| 欧美日韩激情在线| 好操啊在线观看免费视频| 91麻豆国产语对白在线观看| 性xxxx欧美老肥妇牲乱| 少妇愉情理伦片bd| 亚洲综合清纯丝袜自拍| 人妻与黑人一区二区三区| 午夜精品久久久久久久99热 | 影音先锋亚洲视频| 韩国毛片一区二区三区| 欧美三级日本三级| 精品日韩欧美在线| 国产精品一二三产区| 免费在线国产精品| 免费观看久久久4p| 亚洲色图综合区| 精品国产91亚洲一区二区三区婷婷| 丁香高清在线观看完整电影视频| 国产一区二区三区四区五区加勒比 | 欧美日韩一区二区在线免费观看 | 人妻人人澡人人添人人爽| 日韩欧美专区在线| 国产在线88av| 手机在线观看国产精品| 国内精品视频一区二区三区八戒| 欧美黑吊大战白妞| 亚洲毛片在线看| 日本免费一区二区三区等视频| 91传媒免费视频| 久久一夜天堂av一区二区三区| 中文精品久久久久人妻不卡| 久久视频在线播放| 欧美美女啪啪| 天天干天天玩天天操| 亚洲一级在线观看| 国际av在线| av观看久久| 日日噜噜夜夜狠狠视频欧美人| 超碰手机在线观看| 亚洲另类激情图| 久久视频免费| 女人另类性混交zo| 亚洲精品日韩一| 国产在线视频网| 99精品国产高清在线观看| 麻豆成人精品| 欧美交换国产一区内射| 亚洲欧美激情四射在线日| 日韩欧美另类中文字幕| 日本三区在线观看| 亚洲已满18点击进入久久| 国际av在线|