精品欧美一区二区三区在线观看 _久久久久国色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)

少妇大叫太大太粗太爽了a片小说| 97在线视频一区| 亚洲综合20p| 日韩电影免费观看| 久久久亚洲国产美女国产盗摄| 国产精品视频xxx| 免费一级肉体全黄毛片| 精品成人影院| 欧美大胆人体bbbb| 999在线免费视频| 日韩伦理av| 欧美激情一区二区三区在线| 国产传媒一区二区| 亚洲天堂中文网| aa级大片欧美三级| 久久国产精品视频| 中文字幕第4页| 超碰地址久久| 7777精品伊人久久久大香线蕉的| 欧美二区在线视频| 色婷婷av在线| 国产精品传媒视频| 日本一区视频在线观看免费| 蜜臀av中文字幕| 国产剧情一区二区三区| 国产精品美女主播| 天堂а√在线中文在线新版| 欧美日本在线| 久久久国产成人精品| 免费网站在线高清观看| 日本欧美三级| 精品久久久久久久久久久院品网 | 亚洲夜夜综合| 国产精品国产精品国产专区不蜜 | 野战少妇38p| 亚洲免费看片| 欧美日本乱大交xxxxx| 一级黄色香蕉视频| 欧美一级二级视频| 一本色道a无线码一区v| 久久久亚洲精品无码| 七七久久电影网| 亚洲女子a中天字幕| 亚洲一区二区三区精品动漫| sese在线视频| 国产精品全国免费观看高清| 日本欧洲国产一区二区| 免费一级在线观看| 久久久久久久久久久久久久久99| 久久国产精品亚洲va麻豆| 天天干天天操av| 91视视频在线直接观看在线看网页在线看 | 国产香蕉久久| 欧美人狂配大交3d怪物一区| 182午夜在线观看| 欧美一级免费| 日韩一区二区三区视频在线| 免费国偷自产拍精品视频| 成人免费91| 日韩精品一区二区三区视频播放 | 91在线观看喷潮| 老司机精品视频一区二区三区| 国产精品羞羞答答| 国产在成人精品线拍偷自揄拍| 久久精品免费观看| 亚洲bt欧美bt日本bt| av中文字幕免费在线观看| 东方欧美亚洲色图在线| 精品国产一区二区三区久久久久久| 天天干免费视频| 国产日韩精品一区二区三区| 青少年xxxxx性开放hg| 日本片在线看| 欧美日韩中文字幕在线| www亚洲成人| 电影一区二区三区久久免费观看| 日韩欧美在线1卡| 婷婷五月精品中文字幕| 欧美激情在线免费| 精品久久久av| 日韩欧美成人一区二区三区| 日韩不卡一区二区三区| 91视频免费网站| 色婷婷激情五月| 久久精品一区二区三区不卡 | xxxcom在线观看| 欧美日韩一区二区免费在线观看| 日本男人操女人| 国产一区二区三区| 日韩成人中文字幕在线观看| 超碰人人人人人人人| 亚洲午夜黄色| 国产精品盗摄久久久| 精品国产九九九| 久久亚区不卡日本| 成人免费看片视频在线观看| 一本大道色婷婷在线| 日韩一区二区在线观看| 欧美偷拍一区二区三区| 国产综合欧美| 国产伦精品免费视频| 亚洲av综合色区无码一二三区| 久久久国产精品不卡| 成人短视频在线观看免费| 久九九久频精品短视频| 日韩欧美一卡二卡| www久久久久久久| 亚洲美洲欧洲综合国产一区| 成人精品视频99在线观看免费| 午夜成人鲁丝片午夜精品| 亚洲色图欧美在线| 丰满少妇在线观看| 欧美人与动xxxxz0oz| 久久综合伊人77777| 中文字幕精品无| www.亚洲在线| 神马午夜伦理影院| 国产成人午夜性a一级毛片| 日韩高清欧美高清| 久久久久国产精品夜夜夜夜夜| 麻豆久久一区二区| 日本亚洲导航| 成人性生交大片免费网站| 九九视频免费观看视频精品 | 五月天久久久久久| 亚洲精品写真福利| 中文字幕国内自拍| 国产精品一区高清| 欧美一级电影免费在线观看| 国精品人妻无码一区二区三区喝尿| 亚洲欧洲www| 色噜噜狠狠永久免费| 免费久久精品| 欧洲亚洲免费在线| 日本1级在线| 五月天丁香久久| 无码人妻精品一区二区三| 欧美福利在线| 91亚色免费| 中文字幕资源网在线观看| 欧美高清视频一二三区| 欧美另类videoxo高潮| 老司机精品视频导航| 亚洲高清视频一区二区| 深夜视频一区二区| 亚洲午夜国产成人av电影男同| 无码人妻一区二区三区线| 久久久精品黄色| 成人性生生活性生交12| 成人无号精品一区二区三区| 国产精品视频公开费视频| av播放在线观看| 欧美日韩www| 丝袜美腿小色网| 国产成人欧美日韩在线电影| 国产在线视频综合| 日韩精品欧美大片| 国产精品扒开腿做爽爽爽男男 | 中文在线免费一区三区高中清不卡| 亚洲视频在线观看一区二区三区| 不卡日本视频| 91欧美精品成人综合在线观看| www免费在线观看| 精品国免费一区二区三区| 国产精品video| 国产福利资源在线| 亚洲综合精品久久| 黄色片视频免费观看| 三级影片在线观看欧美日韩一区二区| 日韩久久久久久久| 欧美经典影片视频网站| 亚洲91精品在线观看| 成年人视频网站在线| 欧美一卡二卡在线| 奇米影视第四色777| 国产欧美精品一区二区色综合朱莉| av免费一区二区| 欧美视频网站| 欧美人与物videos另类| 疯狂欧洲av久久成人av电影| 韩国精品美女www爽爽爽视频| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美精品v国产精品v日韩精品| 麻豆视频在线观看| 久久精品免视看| 一级淫片在线观看| 免费永久网站黄欧美| 亚洲女人毛片| 丝袜久久网站| 91中文字幕在线| 大胆人体一区| 九九九久久国产免费| 欧美少妇另类| 日韩欧美中文字幕制服| 无码人妻一区二区三区免费| 亚洲已满18点击进入久久| 91精品国自产在线| www.亚洲在线| 奇米777在线| 石原莉奈在线亚洲三区| 日本a在线免费观看| 久久精品高清| 美脚丝袜一区二区三区在线观看| www一区二区三区| 国产91久久婷婷一区二区| 性xxxxfjsxxxxx欧美| 自拍偷拍亚洲在线| 欧美日本韩国一区二区| 精品国产青草久久久久福利| 亚洲综合精品视频| 日本道色综合久久| 国产无码精品在线播放| 综合av第一页| 欧美性受xxxx黑人| 2023国产精品| 国产黑丝一区二区| 国产成人亚洲精品青草天美| 一起操在线视频| 日韩有码一区二区三区| 国产网站免费在线观看| 欧美三级网页| 蜜桃网站在线观看| 婷婷伊人综合| 亚洲精品一区二区毛豆| 奇米色欧美一区二区三区| 精品久久sese| 国内精品偷拍| 国产精品污www一区二区三区| 精品国产乱码一区二区三区| 国产精品99久久久久久久久| 欧美天堂视频| 日本精品中文字幕| 亚洲天堂资源| 国产成人av在线| 欧美xo影院| 欧美中文在线免费| 9i看片成人免费高清| 欧美又大又粗又长| 日本美女一区| 国产成人福利视频| 小黄鸭精品aⅴ导航网站入口| 97超级碰碰人国产在线观看| 密臀av在线播放| 国产91精品久久久| 欧洲av不卡| 国产精品久久久久久超碰 | 欧美日韩中文在线| 国产精品100| 在线视频一区二区三| 国产女主播喷水视频在线观看 | 成人免费视频国产免费麻豆| 精品欧美乱码久久久久久| www三级免费| 亚洲国产欧美精品| 欧美美女色图| 中文欧美在线视频| 1区2区3区在线视频| 欧美激情国产精品| 岛国av在线网站| 日本aⅴ大伊香蕉精品视频| 三上悠亚激情av一区二区三区 | 91精品国自产| 日韩一级黄色大片| 熟妇人妻av无码一区二区三区| 日韩精品久久久久久福利| 邻居大乳一区二区三区| 一区二区三区美女xx视频| 日本在线播放| 欧美激情免费在线| 亚洲美女尤物影院| 国产欧美一区二区三区在线| 欧洲大片精品免费永久看nba| 国产欧美日韩一区二区三区| 色棕色天天综合网| 一级黄色免费在线观看| 亚洲精品看片| 男女污污的视频| 国产v日产∨综合v精品视频| 日韩人妻无码一区二区三区| 国产精品久久毛片a| 久久久综合久久久| 在线免费av一区| www日本高清视频| 亚洲欧洲国产一区| 羞羞的网站在线观看| 青青草精品毛片| 日本少妇精品亚洲第一区| 欧美精品亚洲精品| 欧美jjzz| 国产免费视频传媒| 国产福利电影一区二区三区| 免费人成又黄又爽又色| 亚洲一区二区三区四区中文字幕| 五月婷婷激情视频| 欧美成人aa大片| 在线a免费看| 97热在线精品视频在线观看| 国产精品xnxxcom| 欧美一区二区三区四区五区六区| 欧美国产日本| 污片在线免费看| 91亚洲精品一区二区乱码| 强制高潮抽搐sm调教高h| 欧美性猛交xxxx乱大交| 成人高潮片免费视频| 中文字幕久热精品视频在线| 看黄在线观看| 国产高清自拍一区| 中文字幕乱码亚洲无线精品一区| 成人观看免费完整观看| 成人视屏免费看| 中文字幕在线2021| 欧美三区免费完整视频在线观看| 天堂影院在线| 久久久久女教师免费一区| 国产成年精品| 亚洲精品国产精品国自产观看 | 国产精品精品一区二区三区午夜版| 成人av综合网| 国产一级不卡视频| 国产精品一区三区| 黄色录像一级片| 在线成人免费视频| 91在线不卡| 国产精品久久久久久久av大片| 美女亚洲一区| 日本精品免费在线观看| 99久久免费视频.com| 国产无码精品在线播放| 精品动漫一区二区三区在线观看| av在线播放观看| 亚洲自拍偷拍视频| 亚洲网色网站| 日本成人xxx| 一区二区三区日本| 99在线观看免费| 美女视频黄免费的亚洲男人天堂| 亚洲欧洲二区| 欧美h视频在线观看| 精品一区二区三区视频 | 国产区在线视频| 国产a级全部精品| 色棕色天天综合网| 日韩av片网站| 国产精品国产三级国产有无不卡| 亚洲系列第一页| 久久天堂av综合合色| 欧美日本三级| 欧洲精品在线播放| 97se狠狠狠综合亚洲狠狠| 国产又大又黄又粗| 中文国产成人精品久久一| 99精品美女视频在线观看热舞| 日本一区二区免费高清视频| 国产精品一区二区免费不卡| 久久久久成人网站| 亚洲精品电影网在线观看| 美脚恋feet久草欧美| 婷婷五月色综合| 国产伦精品一区二区三区免费迷| 久久成人在线观看| 日韩电影中文字幕| av在线一区不卡| 欧美三级午夜理伦三级老人| 国产成a人无v码亚洲福利| 欧美一二三区视频| 国产亚洲欧美视频| 精品国产一区二| 国产视频九色蝌蚪| 日本一区二区成人| a在线观看视频| 欧美一级大胆视频| 色97色成人| 一级黄色片毛片| 色婷婷精品大视频在线蜜桃视频| 亚洲精品传媒| 国产在线一区二区三区欧美| 久久精品欧洲| 日韩a级片在线观看| 亚洲女同性videos| 中文幕av一区二区三区佐山爱| 久艹视频在线免费观看| 国产欧美一区二区在线观看| www.蜜臀av.com| 国产成人av在线| 精品成人一区| 人妻互换一区二区激情偷拍| 精品久久国产老人久久综合| 福利精品一区| 天天夜碰日日摸日日澡性色av| 国产精品久久久久久久裸模| 天堂v在线观看| 国产日韩视频在线观看| 一本色道久久精品| 91麻豆免费视频网站| 亚洲精品天天看| 1769国产精品视频| 免费一区二区三区在线观看| 午夜电影一区二区| 国产在线激情视频|