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

萬萬沒想到,HashMap默認容量的選擇,竟然背后有這么多思考?。?/h1>

開發 開發工具
集合是Java開發日常開發中經常會使用到的,而作為一種典型的K-V結構的數據結構,HashMap對于Java開發者一定不陌生。

[[284972]]

集合是Java開發日常開發中經常會使用到的,而作為一種典型的K-V結構的數據結構,HashMap對于Java開發者一定不陌生。在日常開發中,我們經常會像如下方式以下創建一個HashMap:

  1. Map<String, String> map = new HashMap<String, String>(); 

但是,大家有沒有想過,上面的代碼中,我們并沒有給HashMap指定容量,那么,這時候一個新創建的HashMap的默認容量是多少呢?為什么呢?本文就來分析下這個問題。

什么是容量

在Java中,保存數據有兩種比較簡單的數據結構:數組和鏈表。數組的特點是:尋址容易,插入和刪除困難;而鏈表的特點是:尋址困難,插入和刪除容易。HashMap就是將數組和鏈表組合在一起,發揮了兩者的優勢,我們可以將其理解為鏈表的數組。在HashMap中,有兩個比較容易混淆的關鍵字段:size和capacity ,這其中capacity就是Map的容量,而size我們稱之為Map中的元素個數。簡單打個比方你就更容易理解了:HashMap就是一個“桶”,那么容量(capacity)就是這個桶當前最多可以裝多少元素,而元素個數(size)表示這個桶已經裝了多少元素。

如以下代碼:

  1. Map<String, String> map = new HashMap<String, String>();  
  2. map.put("hollis""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));  
  8.  
  9. Field size = mapType.getDeclaredField("size");  
  10. size.setAccessible(true);  
  11. System.out.println("size : " + size.get(map)); 

輸出結果:

  1. capacity : 16、size : 1 

上面我們定義了一個新的HashMap,并向其中put了一個元素,然后通過反射的方式打印capacity和size,其容量是16,已經存放的元素個數是1。通過前面的例子,我們發現了,當我們創建一個HashMap的時候,如果沒有指定其容量,那么會得到一個默認容量為16的Map,那么,這個容量是怎么來的呢?又為什么是這個數字呢?

容量與哈希

要想講清楚這個默認容量的緣由,我們要首先要知道這個容量有什么用?我們知道,容量就是一個HashMap中"桶"的個數,那么,當我們想要往一個HashMap中put一個元素的時候,需要通過一定的算法計算出應該把他放到哪個桶中,這個過程就叫做哈希(hash),對應的就是HashMap中的hash方法。

我們知道,hash方法的功能是根據Key來定位這個K-V在鏈表數組中的位置的。也就是hash方法的輸入應該是個Object類型的Key,輸出應該是個int類型的數組下標。如果讓你設計這個方法,你會怎么做?其實簡單,我們只要調用Object對象的hashCode()方法,該方法會返回一個整數,然后用這個數對HashMap的容量進行取模就行了。如果真的是這么簡單的話,那HashMap的容量設置就會簡單很多了,但是考慮到效率等問題,HashMap的hash方法實現還是有一定的復雜的。 

hash的實現

接下來就介紹下HashMap中hash方法的實現原理。具體實現上,由兩個方法int hash(Object k)和int indexFor(int h, int length)來實現。

  • hash :該方法主要是將Object轉換成一個整型。
  • indexFor :該方法主要是將hash生成的整型轉換成鏈表數組中的下標。

為了聚焦本文的重點,我們只來看一下indexFor方法。我們先來看下Java 7(Java8中雖然沒有這樣一個單獨的方法,但是查詢下標的算法也是和Java 7一樣的)中該實現細節:

  1. static int indexFor(int h, int length) { 
  2.     return h & (length-1); 

indexFor方法其實主要是將hashcode換成鏈表數組中的下標。其中的兩個參數h表示元素的hashcode值,length表示HashMap的容量。那么return h & (length-1) 是什么意思呢?其實,他就是取模。Java之所有使用位運算(&)來代替取模運算(%),最主要的考慮就是效率。

位運算(&)效率要比代替取模運算(%)高很多,主要原因是位運算直接對內存數據進行操作,不需要轉成十進制,因此處理速度非???。

那么,為什么可以使用位運算(&)來實現取模運算(%)呢?這實現的原理如下:

  1. X % 2^n = X & (2^n – 1) 

假設n為3,則2^3 = 8,表示成2進制就是1000。2^3 -1 = 7 ,即0111。此時X & (2^3 – 1) 就相當于取X的2進制的最后三位數。從2進制角度來看,X / 8相當于 X >> 3,即把X右移3位,此時得到了X / 8的商,而被移掉的部分(后三位),則是X % 8,也就是余數。上面的解釋不知道你有沒有看懂,沒看懂的話其實也沒關系,你只需要記住這個技巧就可以了?;蛘吣憧梢哉規讉€例子試一下。

  1. 6 % 8 = 6 ,6 & 7 = 6 
  2. 10 & 8 = 2 ,10 & 7 = 2 

運算過程如下如:

 

所以,return h & (length-1);只要保證length的長度是2^n 的話,就可以實現取模運算了。

所以,因為位運算直接對內存數據進行操作,不需要轉成十進制,所以位運算要比取模運算的效率更高,所以HashMap在計算元素要存放在數組中的index的時候,使用位運算代替了取模運算。之所以可以做等價代替,前提是要求HashMap的容量一定要是2^n 。那么,既然是2^n ,為啥一定要是16呢?為什么不能是4、8或者32呢?關于這個默認容量的選擇,JDK并沒有給出官方解釋,筆者也沒有在網上找到關于這個任何有價值的資料。(如果哪位有相關的權威資料或者想法,可以留言交流)根據作者的推斷,這應該就是個經驗值(Experience Value),既然一定要設置一個默認的2^n 作為初始值,那么就需要在效率和內存使用上做一個權衡。這個值既不能太小,也不能太大。太小了就有可能頻繁發生擴容,影響效率。太大了又浪費空間,不劃算。所以,16就作為一個經驗值被采用了。

在JDK 8中,關于默認容量的定義為:static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 ,其故意把16寫成1<<4,就是提醒開發者,這個地方要是2的冪。值得玩味的是:注釋中的aka 16 也是1.8中新增的,

那么,接下來我們再來談談,HashMap是如何保證其容量一定可以是2^n 的呢?如果用戶自己設置了的話又會怎么樣呢?關于這部分,HashMap在兩個可能改變其容量的地方都做了兼容處理,分別是指定容量初始化時以及擴容時。

指定容量初始化

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

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

看一下JDK是如何找到比傳入的指定值大的第一個2的冪的:

  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; 

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

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

  1. Step 1,5->7 
  2. Step 2,7->8 
  3. Step 1,9->15 
  4. Step 2,15->16 
  5. Step 1,19->31 
  6. Step 2,31->32 

對應到以上代碼中,Step1:

  1. n |= n >>> 1; 
  2.  
  3. n |= n >>> 2; 
  4.  
  5. n |= n >>> 4; 
  6.  
  7. n |= n >>> 8; 
  8.  
  9. 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.  
  3. 1100 1100 1100 | 0110 0110 0110 = 1110 1110 1110 
  4.  
  5. 1110 1110 1110 >>>2 = 0011 1011 1011 
  6.  
  7. 1110 1110 1110 | 0011 1011 1011 = 1111 1111 1111 
  8.  
  9. 1111 1111 1111 >>>4 = 1111 1111 1111 
  10.  
  11. 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的冪。

但是還有一種特殊情況套用以上公式不行,這些數字就是2的冪自身。如果數字4套用公式的話。得到的會是 8,不過其實這個問題也被解決了。

總之,HashMap根據用戶傳入的初始化容量,利用無符號右移和按位或運算等方式計算出第一個大于該數的2的冪。

擴容

除了初始化的時候會指定HashMap的容量,在進行擴容的時候,其容量也可能會改變。HashMap有擴容機制,就是當達到擴容條件時會進行擴容。HashMap的擴容條件就是當HashMap中的元素個數(size)超過臨界值(threshold)時就會自動擴容。在HashMap中,threshold = loadFactor * capacity。loadFactor是裝載因子,表示HashMap滿的程度,默認值為0.75f,設置成0.75有一個好處,那就是0.75正好是3/4,而capacity又是2的冪。所以,兩個數的乘積都是整數。對于一個默認的HashMap來說,默認情況下,當其size大于12(16*0.75)時就會觸發擴容。下面是HashMap中的擴容方法(resize)中的一段:

  1. if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && 
  2.  
  3.                  oldCap >= DEFAULT_INITIAL_CAPACITY) 
  4.  
  5.     newThr = oldThr << 1; // double threshold 
  6.  

從上面代碼可以看出,擴容后的table大小變為原來的兩倍,這一步執行之后,就會進行擴容后table的調整,這部分非本文重點,省略??梢?,當HashMap中的元素個數(size)超過臨界值(threshold)時就會自動擴容,擴容成原容量的2倍,即從16擴容到32、64、128 …所以,通過保證初始化容量均為2的冪,并且擴容時也是擴容到之前容量的2倍,所以,保證了HashMap的容量永遠都是2的冪。

總結

HashMap作為一種數據結構,元素在put的過程中需要進行hash運算,目的是計算出該元素存放在hashMap中的具體位置。

hash運算的過程其實就是對目標元素的Key進行hashcode,再對Map的容量進行取模,而JDK 的工程師為了提升取模的效率,使用位運算代替了取模運算,這就要求Map的容量一定得是2的冪。

而作為默認容量,太大和太小都不合適,所以16就作為一個比較合適的經驗值被采用了。為了保證任何情況下Map的容量都是2的冪,HashMap在兩個地方都做了限制。

首先是,如果用戶制定了初始容量,那么HashMap會計算出比該數大的第一個2的冪作為初始容量。

另外,在擴容的時候,也是進行成倍的擴容,即4變成8,8變成16。

本文,通過分析為什么HashMap的默認容量是16,我們深入HashMap的原理,分析了下背后的原理,從代碼中我們可以發現,JDK 的工程師把各種位運算運用到了極致,想盡各種辦法優化效率。值得我們學習!

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

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

 

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

2021-08-31 09:35:01

TCPIP漏洞

2016-09-01 13:54:23

Google太空電梯懸滑板

2021-11-29 05:37:24

Windows Def操作系統微軟

2020-08-14 08:19:25

Shell命令行數據

2015-07-15 13:00:31

英特爾開源

2017-12-12 11:09:39

顯卡散熱CPU

2018-05-02 09:38:02

程序員代碼互聯網

2021-02-21 17:14:27

程序員技能開發者

2021-03-18 09:06:17

函數MainJava

2016-10-11 14:19:07

2022-11-29 09:12:12

硬件技術拼圖

2021-01-27 18:13:35

日志nginx信息

2019-08-19 09:21:36

程序員Bug代碼

2020-06-08 08:38:24

可執行文件文件字符

2023-10-31 12:29:25

模型訓練

2021-08-12 06:52:02

谷歌面試ArrayList

2022-03-21 08:55:53

RocketMQ客戶端過濾機制

2019-10-12 08:53:26

Redis多線程版本

2018-06-27 14:23:38

機器學習人工智能入門方法

2018-05-29 14:57:59

HashMap容量初始化
點贊
收藏

51CTO技術棧公眾號

国产桃色电影在线播放| 看黄色一级大片| 麻豆国产一区| 亚洲自拍偷拍图区| 久久波多野结衣| 中文字幕乱码在线观看| 国产精品国内免费一区二区三区| 欧美一区二区久久久| 精品视频在线观看一区| 高清中文字幕一区二区三区| 国产精品综合在线视频| 亚州成人av在线| 丰满的亚洲女人毛茸茸| 亚洲免费一区三区| 色88888久久久久久影院野外 | 色综合久久久久无码专区| 免费毛片在线| 国产精品一区专区| 日本精品免费一区二区三区| 午夜剧场免费在线观看| 亚洲男人都懂第一日本| 欧美一区二区二区| 成人精品小视频| 波多野结衣在线高清| 国产精品人成在线观看免费| 国产一区二区在线网站| 国产尤物在线观看| 三级欧美在线一区| 久久免费视频在线观看| 天天鲁一鲁摸一摸爽一爽| 亚洲毛片免费看| 精品国精品国产| 久久久久久久高清| 国产成人精品亚洲日本在线观看| 亚洲国产精品久久一线不卡| 日本丰满少妇黄大片在线观看| 欧美日韩伦理片| 99热这里都是精品| 91嫩草视频在线观看| 亚洲手机在线观看| 视频一区国产视频| 欧亚精品中文字幕| 亚洲国产综合久久| 欧美午夜电影在线观看| 久久中文字幕国产| 少妇视频一区二区| 欧美h版在线| 在线观看亚洲视频| 亚洲精品国产精品国自产网站| 日韩高清在线免费观看| 亚洲成人av片| 成人午夜精品无码区| 亚洲三级av| 精品嫩草影院久久| 亚洲婷婷在线观看| 美国十次av导航亚洲入口| 精品久久久久久久久久久久包黑料| 日韩高清一二三区| 天堂av一区| 精品久久久久一区| 国产精品成人99一区无码| 韩国精品福利一区二区三区 | 成人在线短视频| 日韩精品中文字幕一区二区 | 国产精品视频久久| 欧美日韩一区二区在线观看| 五码日韩精品一区二区三区视频| 黄色视屏网站在线免费观看| 久久久久久亚洲综合| 蜜桃传媒视频麻豆一区| 男人的天堂av高清在线| 国产亚洲一区二区三区在线观看| 日韩精品一区二区三区色偷偷 | 蜜桃传媒一区二区三区| av影院在线免费观看| 狠狠色狠狠色综合日日五| 精品人妻一区二区三区四区在线 | 亚洲欧美视频一区二区| 国产精品国产a| 一级全黄肉体裸体全过程| 调教一区二区| 精品国产乱码久久久久酒店| 欧在线一二三四区| 9999在线精品视频| 精品国产91九色蝌蚪| 国产吞精囗交久久久| 日韩国产在线| 久久99亚洲热视| 国产精品黄色大片| 美女视频黄 久久| 99视频国产精品免费观看| 天堂av中文在线资源库| 国产精品区一区二区三区| 无码人妻精品一区二区蜜桃百度| 午夜影院在线播放| 欧美日韩精品一区二区三区 | 国产一区二区视频免费观看| 国产黄色成人av| 欧美日韩一区在线观看视频| 国产原创在线观看| 色综合久久综合网97色综合 | 国产99久久久久久免费看| 国产综合久久久久久久久久久久| 国产精品免费一区二区三区在线观看| 毛片在线播放网址| 亚洲激情图片一区| 搡女人真爽免费午夜网站| 嫩呦国产一区二区三区av| 精品一区电影国产| 亚洲天堂黄色片| 老司机免费视频久久| 91精品国产91久久久久青草| 国产美女视频一区二区三区| 亚洲综合色婷婷| 中文字幕在线导航| 欧美色资源站| 超碰日本道色综合久久综合 | 制服.丝袜.亚洲.另类.中文 | 国产精品全国免费观看高清 | 色综合电影网| 国产精品蜜臀| 在线综合视频播放| 2019男人天堂| 亚洲永久视频| 国产精品美女久久久久av福利| 欧美精品videos另类| 色欲综合视频天天天| 日本泡妞xxxx免费视频软件| 日韩极品一区| 清纯唯美亚洲综合| 性xxxx搡xxxxx搡欧美| 亚洲黄色在线视频| 久久婷婷中文字幕| 欧美xxxx中国| 国产精品丝袜一区二区三区| 国产小视频在线观看| 天天亚洲美女在线视频| 久草免费资源站| 一区二区不卡| 亚洲精品免费一区二区三区| 免费在线观看黄| 欧美日韩一区二区三区高清| 影音先锋制服丝袜| 青青草97国产精品免费观看无弹窗版| 欧美日韩另类丝袜其他| 色在线视频观看| 亚洲精品视频二区| 欧美一区二区三区四| 99久久精品国产麻豆演员表| 国产69精品久久久久999小说| 99a精品视频在线观看| 欧美第一黄网免费网站| 亚洲国产精品久久久久久6q| 亚洲午夜视频在线| 中文字幕天堂网| 亚洲乱亚洲高清| 久久精品二区| 久久精品女人天堂av免费观看| 国产视频精品免费播放| 一级黄色av片| 国产精品久久久久久妇女6080 | 国产免费一区二区视频| 97久久综合区小说区图片区| 97视频在线观看播放| 日韩有码电影| 在线观看日韩av先锋影音电影院| 夫妇露脸对白88av| 久久成人免费电影| 黑人巨茎大战欧美白妇| 9l亚洲国产成人精品一区二三 | 亚洲人成网站免费播放| 天天干,天天干| 国产精品久久久久久妇女6080| 特级黄色片视频| 激情久久五月| 久久影院理伦片| 韩国成人在线| 久久成人精品视频| 色婷婷综合视频| 色伊人久久综合中文字幕| a级黄色免费视频| 国产精品一区二区91| 3d动漫一区二区三区| 精品国产一区二区三区四区| 成人黄在线观看| www视频在线观看| 永久免费精品影视网站| 国产伦理吴梦梦伦理| 亚洲大片精品永久免费| 久久国产柳州莫菁门| 国产综合色产在线精品| 国产av麻豆mag剧集| 不卡中文一二三区| 成人在线免费观看一区| 久久久人成影片一区二区三区在哪下载 | 97超级碰碰碰久久久| jizzjizz在线观看| 日韩精品一区二区三区老鸭窝| 6080午夜伦理| 亚洲蜜臀av乱码久久精品蜜桃| 男女一区二区三区| 蜜臀久久99精品久久久画质超高清| 天天想你在线观看完整版电影免费 | 欧美日韩国产成人在线91| 久久一区二区三| 国产欧美一二三区| 日本精品一二三区| 久久精品国产精品亚洲精品| 国产伦精品一区二区三区四区视频_ | 日韩电影第一页| 97免费观看视频| 色吊一区二区三区| 国产性猛交普通话对白| 国产精品激情偷乱一区二区∴| 欧产日产国产精品98| 国产乱码精品1区2区3区| 久久黄色免费看| 亚洲久久在线| 国产av熟女一区二区三区| 青青草国产免费一区二区下载| 国产综合色一区二区三区| 一区二区三区| 国产精品久久久久不卡| 波多野结衣久久精品| 欧美精品国产精品日韩精品| 人人干在线视频| 亚洲无限av看| 内衣办公室在线| 亚洲精品国产精品乱码不99按摩| 国内精品偷拍视频| 欧美精品国产精品| 中文 欧美 日韩| 91精品办公室少妇高潮对白| 欧美一级特黄视频| 五月天精品一区二区三区| 久久国产一级片| 一区二区久久久久久| 亚洲国产美女视频| 日韩一区在线免费观看| 手机看片国产日韩| 中文字幕一区二区三| 亚洲AV无码成人精品区明星换面| 久久伊人中文字幕| 懂色av粉嫩av蜜乳av| 99久久免费精品高清特色大片| 午夜性福利视频| 国产福利一区二区三区| 国模大尺度视频| 国产电影一区在线| 国产精品一级无码| 国产成人av一区二区三区在线观看| www.五月天色| 国产福利精品一区| 国内自拍偷拍视频| 成人精品在线视频观看| 日批视频免费看| 成人精品国产一区二区4080| 午夜不卡久久精品无码免费| 91一区二区三区在线播放| 少妇特黄一区二区三区| 久久久久国产精品人| 国精产品一区二区三区| 亚洲国产精品成人综合色在线婷婷| 国产成人免费观看网站| 亚洲天堂成人网| 青青草原在线免费观看| 亚洲国产一区二区三区青草影视| 日韩成人一区二区三区| 欧美性高跟鞋xxxxhd| 欧美激情一区二区三区免费观看 | 国产成人精品999| 日韩精品免费观看视频| 国产欧美日韩精品专区| 精品视频一区二区三区| 国产伦精品一区二区三区视频孕妇 | 欧美一区二区三区视频| 亚洲爱爱综合网| 亚洲精品日韩久久久| 亚洲s色大片| 欧美黑人视频一区| 免费日韩电影| 成人亚洲欧美一区二区三区| 精品三级av在线导航| 青青草久久网络| 欧美激情麻豆| 黄色片一级视频| 精品夜夜嗨av一区二区三区| 欧美久久久久久久久久久| 久久精品人人做人人爽人人 | 欧美日韩裸体免费视频| 国产精品51麻豆cm传媒| 日韩免费成人网| 美州a亚洲一视本频v色道| 久久久成人精品| 女人高潮被爽到呻吟在线观看| 国产精品无码专区在线观看| 国产精品白丝av嫩草影院| 亚洲激情一区二区三区| 在线看片一区| 超碰在线资源站| 久久久91精品国产一区二区三区| 国产人妻精品一区二区三区不卡| 欧美日韩亚洲一区二区三区| 国产精品亚洲lv粉色| 亚洲乱码av中文一区二区| 亚洲精品白浆| 国产成人午夜视频网址| jizzjizzjizz欧美| 伊人久久av导航| 男女精品视频| 四虎永久免费观看| 国产精品国产自产拍在线| 91美女免费看| 亚洲精品一区二区三区福利| 日本精品在线| 国产精品pans私拍| 欧美日韩破处| 人人妻人人澡人人爽欧美一区| 人人爽香蕉精品| 白丝女仆被免费网站| 亚洲成人免费电影| 精品女同一区二区三区| 日日骚av一区| 91另类视频| 欧美精品在线一区| 99xxxx成人网| 中文字幕人妻一区| 一区二区三区在线播放| 国产又大又黄的视频| 最近免费中文字幕视频2019| 成人欧美大片| 精品亚洲欧美日韩| 亚洲狠狠婷婷| 日本五十肥熟交尾| 亚洲一区二区三区国产| av男人天堂av| 久久国产精品电影| 高清一区二区| 精品国产三级a∨在线| 久久超碰97中文字幕| www.涩涩爱| 欧美日韩卡一卡二| 91成人高清| 国产日韩欧美视频| 色婷婷色综合| 超碰在线资源站| 亚洲天堂精品在线观看| av在线资源观看| 九九久久综合网站| 亚洲一二av| 玩弄中年熟妇正在播放| 91香蕉视频mp4| 无码人妻丰满熟妇区bbbbxxxx| 亚洲人成在线观| 国产成+人+综合+亚洲欧美| 亚洲一区二区三区涩| 蜜桃视频一区二区三区| 中文国语毛片高清视频| 日韩欧美一区二区免费| gogo高清午夜人体在线| 精品免费日产一区一区三区免费| 在线综合亚洲| 国产精品久久久视频| 欧美日韩精品系列| 黄色av电影在线播放| 91丨九色丨国产| 伊人久久综合| 白丝女仆被免费网站| 欧美蜜桃一区二区三区| huan性巨大欧美| 国产日韩欧美精品| 鲁大师影院一区二区三区| 成人黄色a级片| 欧美一卡在线观看| 女人高潮被爽到呻吟在线观看 | av在线电影观看| 91久久精品视频| 日韩天天综合| 青青操在线播放| 精品国产三级电影在线观看| 成人性生交大片免费观看网站| 天堂精品一区二区三区| 国产黄色成人av| 在线永久看片免费的视频| 日韩最新av在线| 国产成人澳门| 一区二区三区网址| 亚洲一区二区三区三| 国产在线视频资源| 亚洲bt欧美bt日本bt| 国产精品老牛| 日韩av手机在线免费观看| 亚洲电影免费观看高清完整版在线| 日韩欧美一区二区三区在线观看| 青青视频免费在线| 久久久久久久久久久久久女国产乱 | 五月天色婷婷丁香| 亚洲国产91精品在线观看| 九九九精品视频| 国产成人精品视频免费看|