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

為什么阿里巴巴建議集合初始化時,指定集合容量大小?

開發 開發工具
集合是Java開發日常開發中經常會使用到的。在之前的一些文章中,我們介紹過一些關于使用集合類應該注意的事項,如《為什么阿里巴巴禁止在 foreach 循環里進行元素的 remove/add 操作》。

 集合是Java開發日常開發中經常會使用到的。在之前的一些文章中,我們介紹過一些關于使用集合類應該注意的事項,如《為什么阿里巴巴禁止在 foreach 循環里進行元素的 remove/add 操作》

[[262417]]

關于集合類,《阿里巴巴Java開發手冊》中其實還有另外一個規定:

 

本文就來分析一下為什么會有如此建議?如果一定要設置初始容量的話,設置多少比較合適?

1.為什么要設置初始容量

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

  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("未初始化容量,耗時 : "+ (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,耗時 : "+ (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,耗時 : "+ (s4 - s3)); 

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

輸出結果:

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

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

當然,以上結論也是有理論支撐的。我們HashMap中傻傻分不清楚的那些概念文章介紹過,HashMap有擴容機制,就是當達到擴容條件時會進行擴容。HashMap的擴容條件就是當HashMap中的元素個數(size)超過臨界值(threshold)時就會自動擴容。在HashMap中, threshold = loadFactor * capacity。

所以,如果我們沒有設置初始容量大小,隨著元素的不斷增加,HashMap會發生多次擴容,而HashMap中的擴容機制決定了每次擴容都需要重建hash表,是非常影響性能的。

從上面的代碼示例中,我們還發現,同樣是設置初始化容量,設置的數值不同也會影響性能,那么當我們已知HashMap中即將存放的KV個數的時候,容量設置成多少為好呢?

2.HashMap中容量的初始化

默認情況下,當我們設置HashMap的初始化容量時,實際上HashMap會采用***個大于該數值的2的冪作為初始化容量。

如以下示例代碼:

  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)); 

在jdk1.7中,初始化容量設置成1的時候,輸出結果是2。在jdk1.8中,如果我們傳入的初始化容量為1,實際上設置的結果也為1,上面代碼輸出結果為2的原因是代碼中map.put(“hahaha”, “hollischuang”);導致了擴容,容量從1擴容到2。

那么,話題再說回來,當我們通過HashMap(int initialCapacity)設置初始容量的時候,HashMap并不一定會直接采用我們傳入的數值,而是經過計算,得到一個新值,目的是提高hash的效率。(1->1、3->4、7->8、9->16)

在Jdk 1.7和Jdk 1.8中,HashMap初始化這個容量的時機不同。jdk1.8中,在調用HashMap的構造函數定義HashMap的時候,就會進行容量的設定。而在Jdk 1.7中,要等到***次put操作時才進行這一操作。

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

  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; 

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

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

聰明的讀者們,如果讓你設計這個算法你準備如何計算?如果你想到二進制的話,那就很簡單了。舉幾個例子看一下:

 

請關注上面的幾個例子中,藍色字體部分的變化情況,或許你會發現些規律。5->8、9->16、19->32、37->64都是主要經過了兩個階段。

  1. Step 1,5->7 
  2. Step 2,7->8 
  3.  
  4. Step 1,9->15 
  5. Step 2,15->16 
  6.  
  7. Step 1,19->31 
  8. Step 2,31->32 
  9.  
  10. Step 1,37->63 
  11. Step 2,63->65 

對應到以上代碼中,Step 1:

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

對應到以上代碼中,Step2:

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

Step 2 比較簡單,就是做一下極限值的判斷,然后把Step 1得到的數值+1。

Step 1 怎么理解呢?其實是對一個二進制數依次向右移位,然后與原值取或。其目的對于一個數字的二進制,從***個不為0的位開始,把后面的所有位都設置成1。

隨便拿一個二進制數,套一遍上面的公式就發現其目的了:

  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 

通過幾次無符號右移和按位或運算,我們把1100 1100 1100轉換成了1111 1111 1111 ,再把1111 1111 1111加1,就得到了1 0000 0000 0000,這就是大于1100 1100 1100的***個2的冪。

好了,我們現在解釋清楚了Step 1和Step 2的代碼。就是可以把一個數轉化成***個比他自身大的2的冪。(可以開始佩服Java的工程師們了,使用無符號右移和按位或運算大大提升了效率。)

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

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

為了解決這個問題,JDK的工程師把所有用戶傳進來的數在進行計算之前先-1,就是源碼中的***行:

  1. int n = cap - 1; 

至此,再來回過頭看看這個設置初始容量的代碼,目的是不是一目了然了:

  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; 

3.HashMap初始容量的合理值

當我們使用 HashMap(int initialCapacity) 來初始化容量的時候,jdk會默認幫我們計算一個相對合理的值當做初始容量。那么,是不是我們只需要把已知的HashMap中即將存放的元素個數直接傳給initialCapacity就可以了呢?

關于這個值的設置,在《阿里巴巴Java開發手冊》有以下建議:

 

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

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

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

雖然,當我們使用 HashMap(int initialCapacity) 來初始化容量的時候,jdk會默認幫我們計算一個相對合理的值當做初始容量。但是這個值并沒有參考loadFactor的值。

也就是說,如果我們設置的默認值是7,經過Jdk處理之后,會被設置成8,但是,這個HashMap在元素個數達到 8*0.75 = 6的時候就會進行一次擴容,這明顯是我們不希望見到的。

如果我們通過 expectedSize / 0.75F + 1.0F 計算,7/0.75 + 1 = 10 ,10經過Jdk處理之后,會被設置成16,這就大大的減少了擴容的幾率。

當HashMap內部維護的哈希表的容量達到75%時(默認情況下),會觸發rehash,而rehash的過程是比較耗費時間的。所以初始化容量要設置成expectedSize/0.75 + 1的話,可以有效的減少沖突也可以減小誤差。

所以,我可以認為,當我們明確知道HashMap中元素的個數的時候,把默認容量設置成 expectedSize / 0.75F + 1.0F 是一個在性能上相對好的選擇,但是,同時也會犧牲些內存。

4.總結

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

但是,JDK并不會直接拿用戶傳進來的數字當做默認容量,而是會進行一番運算,最終得到一個2的冪。原因在《全網把Map中的hash()分析的最透徹的文章,別無二家》介紹過,得到這個數字的算法其實是使用了使用無符號右移和按位或運算來提升效率。

但是,為了***程度的避免擴容帶來的性能消耗,我們建議可以把默認容量的數字設置成expectedSize / 0.75F + 1.0F 。在日常開發中,可以使用

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

來創建一個HashMap,計算的過程guava會幫我們完成。

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

***,留一個思考題:為什么JDK 8中,putAll方法采用了這個expectedSize / 0.75F + 1.0F公式,而put、構造函數等并沒有默認使用這個公式呢?

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

 

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

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2022-06-14 09:52:39

ArrayList初始化容量

2021-08-04 17:20:30

阿里巴巴AsyncJava

2019-09-04 11:02:54

繼承層次組合

2019-09-02 15:20:28

Java開發繼承

2020-02-19 13:15:22

JavaHashMap數據結構

2018-10-16 15:34:17

阿里巴巴Apache Flin大數據

2013-08-22 09:26:38

去IOE王堅

2016-09-21 20:28:55

阿里巴巴IOE

2019-02-27 09:00:13

阿里巴巴for循環Java

2019-01-29 10:30:32

阿里巴巴Java字符串

2021-10-11 09:32:40

包裝類型屬性

2021-09-07 17:22:43

阿里巴巴辭職高薪

2023-04-03 07:03:51

阿里巴巴List元素

2025-07-14 00:00:00

2010-06-28 10:43:47

2020-09-08 16:25:18

Apache BeancopyJava

2022-09-05 10:06:21

MySQL外循環內循環

2021-10-20 14:53:31

Foreach強制阿里巴巴

2020-07-30 12:16:33

阿里巴巴Apache對象

2019-06-26 07:54:53

ArrayListsubList源碼
點贊
收藏

51CTO技術棧公眾號

国产精品久久97| 欧美www视频| 色综合久久88色综合天天提莫| 中文字幕永久在线| 久久久久久影院| 欧美刺激午夜性久久久久久久| 热99这里只有精品| 久久精品色图| 国内精品国产三级国产a久久| 成年人精品视频| 三级男人添奶爽爽爽视频| av在线影院| 懂色av一区二区在线播放| 欧美性受xxxx白人性爽| 小毛片在线观看| 原纱央莉成人av片| 亚洲欧美综合色| 国产精品一区二区三区不卡 | 91theporn国产在线观看| 久久精品国内一区二区三区水蜜桃 | 曰韩不卡视频| 蜜桃久久一区二区三区| 久久激情一区| 国产精品久久久久久久浪潮网站| 欧美激情女人20p| 亚洲av成人精品一区二区三区 | 亚洲欧美一区二区视频| 懂色一区二区三区av片| 六月丁香婷婷综合| 性欧美69xoxoxoxo| 亚洲精品国精品久久99热| 日本老熟妇毛茸茸| 99在线播放| www久久精品| 亚洲已满18点击进入在线看片| 久久免费公开视频| 国产精品日韩精品中文字幕| 91精品国产高清一区二区三区 | 成人免费观看在线观看| 国产精品久久久久久妇女6080| 国产偷国产偷亚洲高清97cao| 久久这里只有精品9| 亚洲黄色视屏| 久久艳片www.17c.com| 免费看黄色的视频| 白浆在线视频| 亚洲人成在线观看一区二区| 欧美日韩亚洲在线| 欧美一区二区三区成人片在线| 韩日精品视频一区| 国产精品小说在线| 欧美人一级淫片a免费播放| 国产精品videossex久久发布| 亚洲最新视频在线| 国精产品一区一区三区免费视频| 2020最新国产精品| 欧美高清视频在线高清观看mv色露露十八 | 色橹橹欧美在线观看视频高清 | 50路60路老熟妇啪啪| av理论在线观看| 国产精品久久二区二区| 日本电影一区二区三区| 性做久久久久久久| 国产一区二区伦理| 91免费电影网站| 夜夜爽8888| 久久精品久久99精品久久| 国产ts人妖一区二区三区 | 国产51人人成人人人人爽色哟哟| 99精品国产热久久91蜜凸| 成人免费看片视频| 91九色蝌蚪91por成人| 精品制服美女丁香| 91九色国产在线| 国产欧美日韩成人| 国产伦精品一区二区三区视频青涩| 国产欧美日韩专区发布| 中文字幕久久熟女蜜桃| 蜜臀av国产精品久久久久| 国产精品麻豆va在线播放| 波多野结衣在线电影| 日韩电影在线免费看| 国产精品成人av性教育| 中文字幕男人天堂| 国精产品一区一区三区mba桃花| 91久久精品美女高潮| 国产色在线视频| 国产电影精品久久禁18| 国产精品裸体一区二区三区| 无码国产精品96久久久久| 91在线porny国产在线看| 欧美极品一区二区| 一本一道波多野毛片中文在线| 国产精品久久夜| 永久免费在线看片视频| 国产福利在线免费观看| 懂色aⅴ精品一区二区三区蜜月| 日韩在线视频在线观看| 日本另类视频| 欧美一区二区性放荡片| 国模无码视频一区| 国产精选一区| 欧美大胆在线视频| 精品成人av一区二区在线播放| 青青国产91久久久久久| 51国偷自产一区二区三区 | 国产精品伦一区二区| 这里只有精品电影| 黄色av网址在线观看| 北条麻妃国产九九九精品小说| 久久手机免费视频| 男女啊啊啊视频| 麻豆国产精品视频| 精品一区二区不卡| 日本免费中文字幕在线| 亚洲第一福利视频在线| 88av.com| 成人av资源网址| 国产亚洲欧洲高清一区| 日韩女优一区二区| 日韩高清欧美激情| 风间由美一区二区三区| av影片在线看| 天天色天天操综合| 91插插插影院| 精品一二三区| 久久久久久国产精品美女| 无码国产69精品久久久久同性| 日韩在线综合| 91精品国产91久久久久久吃药| 亚洲一级黄色大片| 91免费国产在线| 久久久久福利视频| 91看片一区| 亚洲精品国产综合久久| 国产精品老熟女一区二区| 视频一区欧美精品| 国产一区精品在线| 青草影视电视剧免费播放在线观看| 91国内精品野花午夜精品| 黄色免费视频网站| 国产一在线精品一区在线观看| 国产欧美va欧美va香蕉在| av女名字大全列表| 亚洲一级在线观看| 深夜做爰性大片蜜桃| 成人一二三区| 国产91色在线| 四虎国产精品永远| 香蕉影视欧美成人| 熟女人妻一区二区三区免费看| 欧美xxxxx视频| 国产精品九九久久久久久久| 久久伊伊香蕉| 色猫猫国产区一区二在线视频| yjizz视频| 激情成人综合| 99久久99| 日本高清在线观看视频| 人人超碰91尤物精品国产| 亚洲人一二三区| 手机看片福利盒子久久| 成人激情自拍| 91精品国产91久久| 天堂中文字幕av| 午夜影院在线观看欧美| 影音先锋资源av| 亚洲国产网站| 精品久久蜜桃| 最新日韩精品| 亚洲午夜未删减在线观看 | 国产精品福利在线观看| 日韩欧美在线番号| 欧美视频在线观看 亚洲欧| 国产福利短视频| 亚洲欧美日韩专区| 日韩欧美一区二区视频在线播放| 欧美最新精品| 色哟哟入口国产精品| 国产精品天天操| 亚洲免费av在线| 香蕉久久久久久av成人| 亚洲黄色影片| 狠狠色综合网站久久久久久久| 日韩大片免费观看| 一区二区日韩精品| 国产精品国产精品国产专区| 国产精品久久久久久亚洲毛片 | 亚洲欧美精品一区二区| 久久午夜鲁丝片| 国产精品九色蝌蚪自拍| 国产高潮失禁喷水爽到抽搐 | 你懂的在线免费观看| 欧美三级三级三级| 精品人妻在线播放| 国产亚洲欧美在线| 波多野结衣网页| 亚洲女人av| 亚洲第一精品区| 高清精品xnxxcom| 日本中文字幕不卡免费| 日本免费在线观看| 精品盗摄一区二区三区| 中文字幕国产在线观看| 中文字幕在线免费不卡| 国产人妻精品午夜福利免费| 美女黄色成人网| 色乱码一区二区三区熟女 | 日韩欧美成人激情| 国产香蕉在线视频| 99久久综合国产精品| 久久久久久久久久久福利| 99国内精品久久久久久久| 亚洲综合在线小说| 一二三四视频在线中文| 亚洲欧美综合区自拍另类| 国产精品一级视频| 欧美日韩另类在线| www.99re6| www.欧美日韩| 欧美一级小视频| 久久aⅴ国产紧身牛仔裤| 最新黄色av网站| 精品久久成人| 国内外成人免费视频| 欧洲美女精品免费观看视频| 午夜精品一区二区三区在线播放| 日本视频在线免费观看| 亚洲免费伊人电影在线观看av| 99久久精品国产一区二区成人| 欧美色播在线播放| 欧美三级在线免费观看| 国产欧美日韩卡一| 久草视频福利在线| 美国十次了思思久久精品导航| 4444在线观看| 日产午夜精品一线二线三线| 精品无人区一区二区三区| 天天干天天干天天干天天干天天干| 国产精品色在线网站| 国产日本欧美在线观看| 波多视频一区| 国语自产精品视频在线看一大j8 | 伊人五月天婷婷| 日本亚洲欧美天堂免费| 久久精品99国产| 亚洲黄页一区| 蜜臀精品一区二区| 欧美一区国产在线| 午夜久久久久久久久久久| 久久网站免费观看| 亚洲国产成人不卡| 少妇一区二区视频| 蜜桃精品久久久久久久免费影院| 国产精品zjzjzj在线观看| 99久久精品久久久久久ai换脸| 亚洲电影二区| 91精品综合久久久久久五月天| 久久精品国产福利| 国产精品专区h在线观看| 456亚洲精品成人影院| 日本中文字幕不卡免费| 成人福利视频| 日本久久久久久久久久久| 在线免费看h| 日本高清不卡的在线| a欧美人片人妖| 热久久这里只有精品| 午夜欧美巨大性欧美巨大| 国产精品18久久久久久首页狼| 97久久网站| 亚洲一区二区三区777| 97久久亚洲| 久久久99爱| 欧美a级片视频| 97超碰在线人人| 亚洲免费影视| 欧美第一页浮力影院| 精品一二线国产| 成人啪啪18免费游戏链接| 成人免费视频免费观看| 波多野结衣办公室33分钟| 国产色产综合产在线视频| 俄罗斯毛片基地| 亚洲免费观看高清在线观看| 加勒比婷婷色综合久久| 五月婷婷激情综合网| 国产成人免费观看视频| 欧美色图在线视频| 亚洲天堂自拍偷拍| 欧美不卡在线视频| 欧美高清电影在线| 中文字幕av一区二区| a视频在线观看免费| 久久久久久av| 澳门av一区二区三区| 成人免费网站在线| 另类图片第一页| 日韩精品一线二线三线| 艳女tv在线观看国产一区| 免费拍拍拍网站| 三级精品在线观看| 图片区乱熟图片区亚洲| av激情亚洲男人天堂| 一级黄色录像毛片| 亚洲精品午夜久久久| 免费看日韩毛片| 欧美在线观看你懂的| 99久久精品无免国产免费| 精品中文字幕久久久久久| 日韩成人影视| 8x拔播拔播x8国产精品| 亚洲成av在线| 国产不卡一区二区在线观看| 精品国产99| 国产在线视频在线| 日本少妇一区二区| 精品熟女一区二区三区| 中文字幕一区二区三区av| 国产精品美女毛片真酒店| 欧美系列亚洲系列| 五月婷婷六月色| 欧美大码xxxx| 欧美jizz18| 久久久久一区二区三区| 一本一道久久a久久精品蜜桃 | 欧美日本韩国在线| 91精品推荐| 88av.com| 91小视频在线| 精品无码人妻一区二区三区品| 欧美午夜精品理论片a级按摩| 亚洲av少妇一区二区在线观看 | 亚洲二区在线观看| 天天爽夜夜爽人人爽| 日韩欧美精品在线视频| 国产天堂在线| 性日韩欧美在线视频| 91九色综合| 精品国产一区二区三区四区vr| 999国产精品视频| www黄色av| 国产成人三级在线观看| 亚洲图片第一页| 欧美日韩免费在线| 亚洲精品一区二区三区四区| 色婷婷综合久久久久| 黑人巨大精品| 久久精品国产99精品国产亚洲性色| 你懂的国产精品永久在线| 中文字幕在线观看日| 日本一区二区成人| 亚洲 欧美 中文字幕| 亚洲乱码av中文一区二区| 超碰在线公开| 精品一区二区国产| 亚洲区一区二| 麻豆精品国产传媒av| 亚洲一区二区三区不卡国产欧美| www.爱爱.com| 色综合天天狠天天透天天伊人| 精品国产美女a久久9999| 久久精品国产一区二区三区日韩| 欧美a级在线| 最好看的中文字幕| 中文字幕在线播放不卡一区| 欧美成人精品网站| 亚洲欧美一区二区激情| 国产精品13p| 国产高清自拍一区| 激情综合在线| 激情综合激情五月| 精品国产精品自拍| 四虎在线观看| 国产精品美乳一区二区免费| 欧美大片aaaa| 日韩成人av免费| 亚洲影视在线播放| 婷婷开心激情网| 国产a级全部精品| 日韩在线视屏| 国产xxxxhd| 午夜精品一区二区三区电影天堂| 日韩私人影院| 国产精品日韩专区| 亚洲国产一区二区三区在线播放| 四虎国产精品永久免费观看视频| 亚洲综合激情另类小说区| 黄色一级a毛片| 日韩美女毛茸茸| 97精品国产| 在线观看成人动漫| 在线免费观看不卡av| 久操视频在线播放| 国产精品视频福利| 可以免费看不卡的av网站| 一起操在线播放| 亚洲精品二三区| 91亚洲精品| 免费 成 人 黄 色|