久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java源碼解析之HashMap的put、resize方法詳解

瀏覽:52日期:2022-08-14 08:07:10
一、HashMap 簡(jiǎn)介

HashMap 底層采用哈希表結(jié)構(gòu) 數(shù)組加鏈表加紅黑樹(shù)實(shí)現(xiàn),允許儲(chǔ)存null鍵和null值

數(shù)組優(yōu)點(diǎn):通過(guò)數(shù)組下標(biāo)可以快速實(shí)現(xiàn)對(duì)數(shù)組元素的訪(fǎng)問(wèn),效率高

鏈表優(yōu)點(diǎn):插入或刪除數(shù)據(jù)不需要移動(dòng)元素,只需要修改節(jié)點(diǎn)引用效率高

二、源碼分析2.1 繼承和實(shí)現(xiàn)

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { private static final long serialVersionUID = 362498820763181265L;

繼承AbstractMap<K,V>

實(shí)現(xiàn)了map接口 cloneable接口和可序列化接口

2.2 屬性

//hashmap默認(rèn)容量為 16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 HashMap默認(rèn)容量 16//最大容量為2的30 1073741824static final int MAXIMUM_CAPACITY = 1 << 30; ////默認(rèn)加載因子為0.75static final float DEFAULT_LOAD_FACTOR = 0.75f;//鏈表轉(zhuǎn)為紅黑樹(shù)的閾值static final int TREEIFY_THRESHOLD = 8;//紅黑樹(shù)轉(zhuǎn)為鏈表的閾值static final int UNTREEIFY_THRESHOLD = 6;//鏈表轉(zhuǎn)為紅黑樹(shù)時(shí)數(shù)組容量必須大于64static final int MIN_TREEIFY_CAPACITY = 64;//transient Node<K,V>[] table;transient Set<Map.Entry<K,V>> entrySet;transient int size;//用于快速失敗機(jī)制 在對(duì)HashMap進(jìn)行迭代時(shí),如果期間其他線(xiàn)程的參與導(dǎo)致HashMap的結(jié)構(gòu)發(fā)生變化了(比如put,remove等操作),直接拋出ConcurrentModificationException異常transient int modCount;//擴(kuò)容閾值,計(jì)算方法為數(shù)組容量*填充因子int threshold;//加載因子 填充因子final float loadFactor;

loadFactor決定數(shù)組何時(shí)進(jìn)行擴(kuò)容,而且為什么是0.75f

它也叫擴(kuò)容因子 比如數(shù)組長(zhǎng)度為32,所以數(shù)組擴(kuò)容閾值為32*0.75=24當(dāng)數(shù)組中數(shù)據(jù)個(gè)數(shù)為24時(shí)數(shù)組進(jìn)行擴(kuò)容,

數(shù)組容量在創(chuàng)建的時(shí)候就確定,擴(kuò)容時(shí)重新創(chuàng)建一個(gè)指定容量的數(shù)組,然后講舊數(shù)組的值復(fù)制到新數(shù)組中,擴(kuò)容過(guò)程非常耗時(shí),所以0.75時(shí)基于容量和性能之間平衡的結(jié)果。

如果加載因子過(guò)大,也就是擴(kuò)容閾值會(huì)變大,擴(kuò)容門(mén)檻高,這樣容量的占用率就會(huì)降低,但哈希碰撞的幾率就會(huì)增加,效率下降 如果加載因子過(guò)小,擴(kuò)容閾值變小,擴(kuò)容門(mén)檻低,容量占用變大但哈希碰撞幾率下降

此外用于存儲(chǔ)數(shù)據(jù)的table字段使用transient修飾,通過(guò)transient修飾的字段在序列化的時(shí)候?qū)⒈慌懦谕猓敲碒ashMap在序列化后進(jìn)行反序列化時(shí),是如何恢復(fù)數(shù)據(jù)的呢?HashMap通過(guò)自定義的readObject/writeObject方法自定義序列化和反序列化操作。這樣做主要是出于以下兩點(diǎn)考慮:

1.table一般不會(huì)存滿(mǎn),即容量大于實(shí)際鍵值對(duì)個(gè)數(shù),序列化table未使用的部分不僅浪費(fèi)時(shí)間也浪費(fèi)空間;

2.key對(duì)應(yīng)的類(lèi)型如果沒(méi)有重寫(xiě)hashCode方法,那么它將調(diào)用Object的hashCode方法,該方法為native方法,在不同JVM下實(shí)現(xiàn)可能不同;換句話(huà)說(shuō),同一個(gè)鍵值對(duì)在不同的JVM環(huán)境下,在table中存儲(chǔ)的位置可能不同,那么在反序列化table操作時(shí)可能會(huì)出錯(cuò)。

所以在HashXXX類(lèi)中(如HashTable,HashSet,LinkedHashMap等等),我們可以看到,這些類(lèi)用于存儲(chǔ)數(shù)據(jù)的字段都用transient修飾,并且都自定義了readObject/writeObject方法。readObject/writeObject方法

2.3 節(jié)點(diǎn)類(lèi)型Node內(nèi)部類(lèi)

static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) {this.hash = hash;this.key = key;this.value = value;this.next = next; } public final K getKey(){ return key; } public final V getValue() { return value; } public final String toString() { return key + '=' + value; } public final int hashCode() {return Objects.hashCode(key) ^ Objects.hashCode(value); } public final V setValue(V newValue) {V oldValue = value;value = newValue;return oldValue; } public final boolean equals(Object o) {if (o == this) return true;if (o instanceof Map.Entry) { Map.Entry<?,?> e = (Map.Entry<?,?>)o; if (Objects.equals(key, e.getKey()) &&Objects.equals(value, e.getValue()))return true;}return false; }}

Node包含四個(gè)字段

final int hash; final K key; V value; Node<K,V> next;//包含鏈表下一個(gè)節(jié)點(diǎn)

HashMap通過(guò)hash方法計(jì)算key的哈希值,然后通過(guò)(n-1)&hash得到key在數(shù)組中存放的下標(biāo),當(dāng)兩個(gè)key相同時(shí),會(huì)以鏈地址法處理哈希碰撞

在鏈表中查找數(shù)據(jù)必須從第一個(gè)元素開(kāi)始,時(shí)間復(fù)雜度為O n 所以當(dāng)鏈表長(zhǎng)度越來(lái)越長(zhǎng)時(shí)HashMap的查詢(xún)效率就會(huì)越來(lái)越低

所以為了解決這個(gè)問(wèn)題JDK1.8實(shí)現(xiàn)了數(shù)組+鏈表+紅黑樹(shù)來(lái)解決 當(dāng)鏈表長(zhǎng)度超過(guò)8個(gè)時(shí)并且數(shù)組長(zhǎng)度大于64時(shí)進(jìn)行樹(shù)化,轉(zhuǎn)化后查詢(xún)時(shí)間復(fù)雜度為O(logN).

2.4 紅黑樹(shù)的節(jié)點(diǎn)

static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> { TreeNode<K,V> parent; // red-black tree links TreeNode<K,V> left; TreeNode<K,V> right; TreeNode<K,V> prev; // needed to unlink next upon deletion boolean red; TreeNode(int hash, K key, V val, Node<K,V> next) {super(hash, key, val, next); }

包含左右孩子節(jié)點(diǎn)和雙親結(jié)點(diǎn),和前驅(qū)節(jié)點(diǎn),還有節(jié)點(diǎn)是否時(shí)紅或者黑

三、構(gòu)造方法3.1 構(gòu)造器1

public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted }

最常用的構(gòu)造器。默認(rèn)的填充因子 0.75f 這里的填充因子后面會(huì)講到。

3.2 構(gòu)造器2

public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR);}

給定容量構(gòu)造器

3.3 構(gòu)造器3

public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0)// 如果小于0,拋出異常throw new IllegalArgumentException('Illegal initial capacity: ' + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY)//大于最大值initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor))//若填充因子小于0或者判斷非法throw new IllegalArgumentException('Illegal load factor: ' + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity);} static final int tableSizeFor(int cap) {int n = cap - 1; 讓cap-1再賦值給n的目的是另找到的目標(biāo)值大于或等于原值n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }

給定容量和填充因子。

這里的tableSizeFor會(huì)將傳進(jìn)的容量值進(jìn)行**大于等于最近**二次冪處理。跟循環(huán)數(shù)組的處理方式差不多

3.4 構(gòu)造器4

public HashMap(Map<? extends K, ? extends V> m) { this.loadFactor = DEFAULT_LOAD_FACTOR; putMapEntries(m, false);}四、put

public V put(K key, V value) { //底層是調(diào)用putval return putVal(hash(key), key, value, false, true);} //這里調(diào)用了hashmap提供的hash方法,32為都參與了運(yùn)算所以降低了hash碰撞的幾率,這里還跟數(shù)組容量有關(guān)//下面再討論 static final int hash(Object key) {int h; //這里就可以看到hashmapreturn (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }

通過(guò)hash函數(shù)可以看到當(dāng)key為null時(shí),key為0,所以HashMap 是允許儲(chǔ)存空值的。而后面的公式通過(guò)hashcode的高16位異或低1位得到的hash值,主要從性能、哈希碰撞角度考慮,減少系統(tǒng)開(kāi)銷(xiāo),不會(huì)因?yàn)楦呶粵](méi)有參與下標(biāo)計(jì)算而引起的碰撞

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //請(qǐng)注意這里的hash是已經(jīng)算過(guò)的hash(key),然后計(jì)算數(shù)組下標(biāo)位置(n - 1) & hash Node<K,V>[] tab; Node<K,V> p; int n, i; //首先判斷數(shù)組哈希表是否為null或者長(zhǎng)度為0,是則進(jìn)行數(shù)組初始化操作 if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length; //這里tab指向table數(shù)組 n是數(shù)組長(zhǎng)度 //如果該數(shù)組下標(biāo)位置沒(méi)有數(shù)據(jù)直接插入 if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null); else {//該位置有元素 Node<K,V> e; K k;//首先判斷此位置的值的hash和key的地址和值是否相等//如果相等直接覆蓋//小問(wèn)題這里為什么先判斷hash值而不是判斷key值,因?yàn)閔ash值判斷最快,如果hash值不同就不用判斷下面的//hash不同則key一定不同,但key相同hash值是可能相同的,效率提高if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p;//否則就是該位置可以不存在,如果該節(jié)點(diǎn)是紅黑樹(shù)類(lèi)型,else if (p instanceof TreeNode) //則按照紅黑樹(shù)的插入 e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else { //否則就為鏈表結(jié)構(gòu),遍歷鏈表,尾插 for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); //如果鏈表長(zhǎng)度大于等于轉(zhuǎn)為紅黑樹(shù)閾值8,則轉(zhuǎn)為紅黑樹(shù) //這里為什么要-1,因?yàn)閿?shù)組下標(biāo)從0開(kāi)始 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st //轉(zhuǎn)為紅黑樹(shù)操作時(shí),內(nèi)部還會(huì)判斷數(shù)組長(zhǎng)度是否小于MIN_TREEIFY_CAPACITY 64,如果是的話(huà)不轉(zhuǎn)換treeifyBin(tab, hash); break;//退出}//如果鏈表中已經(jīng)存在該key,直接覆蓋if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break;//遍歷數(shù)組 e = p.nextp = e; }}//e代表被覆蓋的值if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null)e.value = value; // 如果onlyIfAbsent為false并且oldValue為null,我們便對(duì)我們的value進(jìn)行保存 afterNodeAccess(e); return oldValue;} } ++modCount; //如果鍵值對(duì)個(gè)數(shù)大于擴(kuò)容閾值,進(jìn)行擴(kuò)容操作 if (++size > threshold)resize(); afterNodeInsertion(evict); return null;}

流程圖

Java源碼解析之HashMap的put、resize方法詳解

五、get

public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value;}

final Node<K,V> getNode(int hash, Object key) { Node<K,V>[] tab; Node<K,V> first, e; int n; K k; //如果桶為空,size為0,目標(biāo)位置是否為空,是直接返回null if ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null) {//如果數(shù)組該下標(biāo)位置就是要找的值,直接返回if (first.hash == hash && // always check first node ((k = first.key) == key || (key != null && key.equals(k)))) return first;//否則如果頭節(jié)點(diǎn)的next有值if ((e = first.next) != null) { //如果該類(lèi)型為紅黑樹(shù),從紅黑樹(shù)中找 if (first instanceof TreeNode)return ((TreeNode<K,V>)first).getTreeNode(hash, key); do {//否則遍歷鏈表if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } while ((e = e.next) != null);} } return null;}六、resize

數(shù)組的擴(kuò)容和初始化都要靠resize完成

final Node<K,V>[] resize() { //擴(kuò)容前數(shù)組 Node<K,V>[] oldTab = table; //擴(kuò)容前數(shù)組大小 int oldCap = (oldTab == null) ? 0 : oldTab.length; //擴(kuò)容前擴(kuò)容閾值 int oldThr = threshold; //定義新數(shù)組和新閾值 int newCap, newThr = 0; //如果擴(kuò)容前數(shù)組 if (oldCap > 0) {//如果超過(guò)最大值就不用再擴(kuò)容if (oldCap >= MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return oldTab;}//2倍擴(kuò)容不能大于最大值else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) //擴(kuò)容閾值/2 newThr = oldThr << 1; // double threshold } //數(shù)組中沒(méi)有值,帶參初始化會(huì)進(jìn)入這里 //且擴(kuò)容因子大于0 else if (oldThr > 0) // initial capacity was placed in thresholdnewCap = oldThr; //不帶參默認(rèn)會(huì)到這里 else {//否則擴(kuò)充因子 <= 0//就是沒(méi)初始化過(guò),使用默認(rèn)的初始化容量,16 * 0.75newCap = DEFAULT_INITIAL_CAPACITY;newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); } //如果新容量為0,重新計(jì)算threshold擴(kuò)容閾值 if (newThr == 0) {float ft = (float)newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? (int)ft : Integer.MAX_VALUE); } threshold = newThr; @SuppressWarnings({'rawtypes','unchecked'}) //定義新數(shù)組進(jìn)行擴(kuò)容 Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap]; table = newTab; //這里采用高低映射的方式進(jìn)行對(duì)新數(shù)組的映射 if (oldTab != null) {//遍歷舊數(shù)組復(fù)制到新數(shù)組中//遍歷for (int j = 0; j < oldCap; ++j) { Node<K,V> e; if ((e = oldTab[j]) != null) {oldTab[j] = null;//如果當(dāng)前節(jié)點(diǎn)鏈表數(shù)據(jù)只有一個(gè),則直接賦值if (e.next == null) newTab[e.hash & (newCap - 1)] = e;else if (e instanceof TreeNode) //否則紅黑樹(shù)操作 ((TreeNode<K,V>)e).split(this, newTab, j, oldCap);else { // preserve order //鏈表賦值 高低映射 Node<K,V> loHead = null, loTail = null; Node<K,V> hiHead = null, hiTail = null; Node<K,V> next; do {next = e.next;//判斷原索引和擴(kuò)容后索引是否相同if ((e.hash & oldCap) == 0) { //相同則低位鏈表尾插 if (loTail == null)loHead = e; elseloTail.next = e; loTail = e;}else { //否則高位鏈表尾插 if (hiTail == null)hiHead = e; elsehiTail.next = e; hiTail = e;} } while ((e = next) != null); //如果低位映射不為空,斷低位尾部后的數(shù)據(jù),因?yàn)槲舶秃罂赡苓€會(huì)有數(shù)據(jù),因?yàn)槭莻€(gè)鏈表,所以采用頭尾引用來(lái)記錄有效值 //付給新數(shù)組 if (loTail != null) {loTail.next = null;newTab[j] = loHead; } //高位引用 直接講原索引+oldCap放到哈希桶中 //因?yàn)槭?倍擴(kuò)容,擴(kuò)容后位置是原位置+增長(zhǎng)的長(zhǎng)度 if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead; }} }} } return newTab;}七、基于JDK1.7的優(yōu)化7.1 底層實(shí)現(xiàn)

1.7基于數(shù)組+鏈表 而1.8基于鏈表+數(shù)組+紅黑樹(shù)

7.2 hash

final int hash(Object k) { int h = hashSeed; if (0 != h && k instanceof String) {return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load factor). h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4);}

效率基于1.8低

7.3 put

1.7使用的是數(shù)組加鏈表,解決哈希沖突采用的是鏈表,而且1.8采用的是尾插,而1.7采用頭插

7.4 擴(kuò)容

1.7在擴(kuò)容時(shí)會(huì)重新計(jì)算h每個(gè)元素的hash值,按舊鏈表的正序遍歷鏈表,然后在新鏈表的頭部插入,所以會(huì)出現(xiàn)逆序的情況,而1.8是通過(guò)高低位映射,不會(huì)出現(xiàn)逆序。

到此這篇關(guān)于Java源碼解析之HashMap的put、resize方法詳解的文章就介紹到這了,更多相關(guān)HashMap的put、resize方法內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产精品夜色一区二区三区 | 久久伊人精品视频 | 日韩成人高清视频 | 中文字幕在线观看精品视频 | 成人在线精品视频 | 成人免费一区二区三区视频网站 | 毛片链接 | 中文字幕一区二区三区不卡 | 欧美a√| 在线观看a视频 | 日韩成人影院 | 日韩影音| 欧美全黄 | 日本一区二区高清不卡 | 亚洲a视频 | 婷婷五月色综合香五月 | 欧美激情五月 | 欧美日韩在线一区二区 | 精品免费国产 | aaa在线观看 | 一级毛片在线 | 少妇久久久 | 欧美日韩免费在线 | 国产精品久久久久免费a∨ 欧洲精品一区 | 国产区91| 天天拍拍天天干 | 可以在线观看的av网站 | 91嫩草在线| 五月婷婷色 | 日韩在线小视频 | 性色av一区二区三区免费看开蚌 | 香蕉av777xxx色综合一区 | 中文字幕亚洲二区 | 国产在线小视频 | 国产一区二区三区视频在线观看 | 色婷婷亚洲| 国产精品久久久久久吹潮 | 久久国产精品免费一区二区三区 | 91av国产视频 | 国产精品久久久久久久久久免费看 | 69黄在线看片免费视频 | 国产一区二区三区久久久久久久久 | 国产成人精品免高潮在线观看 | 国产精品二区一区 | 久久久婷| 手机在线观看av | 亚洲日韩中文字幕一区 | 国产美女在线观看 | 亚洲国产精品一区二区三区 | 久久97视频 | 精品国产依人香蕉在线精品 | 欧美日韩亚洲另类 | 精品久久久久一区二区国产 | 欧美一区二区三区精品 | 久久久久久91亚洲精品中文字幕 | 成人久久久精品乱码一区二区三区 | 日韩av一区二区在线观看 | 国产偷自视频区视频 | 狠狠中文字幕 | 久久久蜜桃| 精品九九久久 | 国产精品成人国产乱一区 | 日韩字幕一区 | 免费一区二区 | 中国女人黄色大片 | 欧美日韩中文字幕 | 另类久久| 色性av | 在线观看欧美日韩 | www日本视频 | 欧美黄色a视频 | 国产一区91 | 久久久久久国产一级毛片高清版 | 国产日韩欧美一区二区 | 欧美天天 | 欧美日韩在线播放 | 久久精品国产99 | 欧美激情综合色综合啪啪五月 | 日韩欧美国产精品综合嫩v 久久久久久国产精品高清 国产目拍亚洲精品99久久精品 | 欧美在线免费 | 97av在线| 国产最新视频 | 国产精品视频播放 | 国产精品久久久久久久久费观看 | 成人免费视频网 | 国产三级黄色毛片 | 国产精品不卡视频 | 国产精品一区二区久久久久 | 国产欧美综合一区 | 国产精品一区二区三 | av日韩在线看| 99精品欧美一区二区三区 | 精品免费国产 | 成人激情视频在线观看 | 国产精品片aa在线观看 | 日本三级在线观看网站 | 国内精品视频一区国产 | 国产精品人人做人人爽人人添 | 影音先锋资源av | 国产视频第一页 | 国产精品欧美久久久久一区二区 | 91在线免费观看 | а√天堂资源中文最新版地址 | 国产一区二区av在线 | 人人艹人人爽 | 亚洲免费视频在线观看 | 午夜a v电影 | 一区二区三区免费 | 综合久久99 | 国产一区二区三区四区在线观看 | 91视频在线免费观看 | 亚州av在线 | 日韩一区欧美一区 | 色一色网站 | 亚洲综合首页 | 国产精品美女久久久久久久久久久 | 午夜噜噜噜 | 日本黄色大片免费 | 欧美精品一区二区三区四区五区 | 特大毛片 | 精品久久久久久国产 | 91精品国产自产精品男人的天堂 | 亚州中文字幕蜜桃视频 | 久久精品亚洲一区二区 | 91色爱| 欧美一区二区三区黄 | 午夜男人视频 | 成人精品视频 | 国产欧美精品一区二区三区 | 久久天堂 | 久久久中文 | 黄网站在线播放 | 欧美精品不卡 | 日韩免费在线观看视频 | 夜夜骑天天射 | 欧美黄 片免费观看 | 99伊人 | 在线视频 欧美日韩 | 久久小草| 国产精品成人一区二区三区夜夜夜 | 特黄一级 | 精品视频在线观看一区二区三区 | 亚洲国产成人精品女人久久久 | 高清国产午夜精品久久久久久 | 能免费看av的网站 | 国产精品免费av | 亚洲区在线 | 91精品久久久久久久久久入口 | 亚洲国产精品一区二区久久 | 成人在线小视频 | 欧美日韩一区二区三区免费视频 | 久久久精品视频免费观看 | 日韩av视屏| 欲色av | 成人午夜在线 | 久久视频一区 | 国产 在线 | 日韩 | 日韩成人在线网 | 国产在线一级视频 | 中文字幕成人av | 欧美日韩不卡 | 99re免费视频精品全部 | 福利视频1000 | 久久国产精品免费一区二区三区 | av网站免费 | 亚洲大尺度视频 | 亚洲欧美日韩精品久久亚洲区 | 九九色影院 | 国产中文视频 | 国产 亚洲 网红 主播 | 国产在线二区 | 国产免费一区 | 亚洲a级 | 成年免费a级毛片 | 午夜性电影| 国产视频二 | 人人看人人干 | 日本1区2区 | 欧美久久一区二区三区 | a欧美 | 久久精品美女 | 精品久久精品 | 日韩av免费在线播放 | 曰本人一级毛片免费完整视频 | 日本三级电影天堂 | 午夜三区| 日韩在线观看视频一区 | av日韩一区| a级黄色毛片免费观看 | 国产精品亚欧美一区二区 | 日韩欧美一区二区在线观看 | 欧美午夜精品久久久久免费视 | 久久三区| 在线小视频| 欧美精品一区二区三区中文字幕 | 免费成人在线网站 | 精品日韩一区二区三区 | 91在线成人 | 中文字幕第一页在线 | 亚洲精品成人网 | 国产视频亚洲 | 亚洲精品久久久久久国产精华液 | 中文在线资源 | 密室大逃脱第六季大神版在线观看 | 蜜臀精品 | 91色视频在线观看 | 一区二区精品 | 久久国产精品免费一区二区三区 | 免费一级毛片 | 色中色综合| 亚洲乱码国产乱码精品精的特点 | 国产精品久久久久久吹潮 | 国产精品久久国产精麻豆99网站 | 毛片一区二区 | 免费视频二区 | av中文网 | 亚洲精品3区 | 久久精品国产亚洲一区二区三区 | 国产婷婷精品av在线 | 欧美一级片在线观看 | 午夜免费看片 | 亚洲最大av网站 | 成人一级片视频 | 激情自拍偷拍 | 欧美日韩视频在线第一区 | 一区二区三区无码高清视频 | 成人午夜精品一区二区三区 | 婷婷久久综合 | 91久久| 九色影院 | 久久久激情视频 | 久久久精品一区二区 | 免费黄色特级片 | 欧美久久影视 | 操视频网站 | 亚洲视频在线播放 | 激情欧美日韩一区二区 | 麻豆视频国产 | 久久在线| 91xxx在线观看 | 日韩精品一区二区三区视频播放 | 免费在线h | 亚洲欧美在线观看 | 欧美一区视频 | 欧美第一页| 欧美精品在线一区二区三区 | 成人在线国产 | 久久成人在线视频 | 韩国三级午夜理伦三级三 | 人人干人人看 | 亚洲成人精品 | 成人免费视频一区二区 | 亚洲国产精品99久久久久久久久 | 久久精品免费视频观看 | 国产高清精品一区二区三区 | 91视频在线 | 久久99精品国产.久久久久 | 久久久久久久精 | 国产男人的天堂 | 在线视频第一页 | 日韩在线中文字幕视频 | 久久久久久91香蕉国产 | 久久99精品国产自在现线 | 国产精品无 | 欧美自拍网 | 日本精品二区 | 日韩高清在线 | 欧美视频在线免费 | 青青久久网 | 美女视频一区二区三区 | 久久久久黄色 | 日韩视频在线播放 | 91精品国产综合久久久久久 | www.国产.com| 欧美成人高清视频 | 免费观看毛片 | 欧美性网| 亚洲国产精品t66y | 亚洲国产1区 | 一区视频在线 | 欧美日韩国产一区二区三区在线观看 | 刘亦菲的毛片 | 91精品国产综合久久国产大片 | 色图综合 | 亚洲首页 | 国产精品成人网 | 久久亚洲高清 | 国产精品美女久久久久aⅴ国产馆 | 五月天在线婷婷 | 国产精品欧美一区二区三区 | xvideos视频 | 欧美精品在线观看 | 国产一区二区 | 黄色网址免费在线 | 国产精品久久久久无码av | 亚洲一区二区免费视频 | 成人精品高清 | 久在线视频 | 中文字幕在线观看 | 男女啪啪高清无遮挡 | 亚洲一区二区黄 | 91精品国产综合久久久久久 | 91视频免费网站 | 欧美在线观看禁18 | 国产一区二区精品丝袜 | 日韩成人在线观看 | av免费网站| 自拍偷拍小视频 | 国产精品第一国产精品 | 日韩欧美三区 | 九九亚洲| 一区二区三区在线看 | 成人区一区二区三区 | 中文 日韩 欧美 | 精品无码久久久久国产 | 曰韩毛片 | 亚洲综合欧美日韩 | 亚洲天堂中文字幕 | 国产精品久久久久久久久久久久久 | 成人免费视频一区二区 | av午夜 | 99视频在线播放 | 91福利电影在线观看 | 欧美成人免费视频 | 亚洲小视频网站 | 一级网站在线观看 | 国产精品一区二区三区四区 | 伊人伊人伊人 | 在线精品亚洲欧美日韩国产 | 久久综合九色综合欧美狠狠 | 精品一区二区三区在线视频 | 精品久久久久久久久久久院品网 | 精品二区 | 国产精品视频导航 | 午夜在线观看视频网站 | 欧美日韩一区二区三区在线观看 | 亚洲天堂电影网 | 亚洲欧美精品 | 欧美一区久久 | 欧美成人综合在线 | 亚洲一区二区三区在线视频 | 国产三级自拍 | 久久69精品久久久久久久电影好 | 欧美日韩一区二区在线观看 | 色必久久| 中文亚洲欧美 | 欧美一级特 | 国产日韩精品一区二区在线观看播放 | 亚洲不卡在线 | 亚洲成人av在线 | 日韩五月 | 男女视频一区二区 | 国产日韩一区二区 | 二区视频| 在线视频a| 精品一区二区三区免费 | 国产在线一区二区 | 在线国产91 | 欧美极品欧美精品欧美视频 | 久久久91| 欧美黑人xx | 91伊人 | 精品亚洲视频在线观看 | 欧美成人一区二区三区片免费 | 日韩中出 | 色在线看 | 欧美日韩一区二区三区 | 99爱爱视频 | 国产精品91av | 久久久久国产一区二区三区 | 亚洲精品在线免费播放 | 91视频久久 | 日韩精品在线一区 | 天天综合视频 | 中文字幕乱码一区二区三区 | 日韩午夜 | 2020国产在线 | 久久久久久国产精品 | 国产精品美女久久久久久久网站 | 91久久久久久久久久久久久 | 激情一区二区三区 | 91午夜视频| 欧美激情国产日韩精品一区18 | 成人亚洲 | 成人爽a毛片一区二区免费 美女高潮久久久 | 在线观看av网站永久 | 国产在线观看一区二区三区 | 欧美精品一区二区三区四区 | 国产在线精品一区 | www.国产.com | 亚洲a在线观看 | 亚洲国产一区二区三区, | 久久不射网| 亚洲精品视频在线播放 | 亚洲人成人一区二区在线观看 | 欧美高清视频在线观看 | 69热在线观看 | 欧美一级二级三级 | 中文字幕日韩一区二区不卡 | 国产精品极品美女在线观看免费 | 精品久久久久久国产 | 骚黄视频 | 国产精品夜夜春夜夜爽久久电影 | 海外中文字幕在线观看 | 国产日韩欧美综合 | 视频二区| 欧美国产精品一区二区 | 中文字幕在线看第二 | 免费成人在线观看视频 | 国产一区二区三区四区三区 | 久久99国产精品免费网站 | 日韩欧美在线一区二区 | 国产精品久久九九 | 成人黄色电影小说 | 午夜精品久久久久久99热软件 | 激情小视频在线观看 | 亚洲精品国产setv | 亚洲欧美日韩国产 | 久久久免费电影 | 国产成人免费视频网站高清观看视频 | 亚洲视频 欧美视频 | 亚洲美女网站 | 黄色精品 | 欧美日韩在线精品 | www日韩 | 天天艹逼 | 一区二区中文 | 在线观看免费视频a | 91不卡| 成av人片在线观看www | 亚洲国产精品久久久久 | 日韩成人影院 | av一区二区三区四区 | 成人在线 | 日韩精品免费在线视频 | 一区二区三区免费 | 久久久99国产精品免费 | 色综合一区 | 欧美日韩视频一区二区 | 久久青 | 亚洲午夜视频 | 一级一片免费视频 | a在线看 | 91久久久久久久久久久久久久久久 | 不卡一二 | 欧美伦理一区二区三区 | 成人av电影网址 | 欧美综合在线一区 | 久久一级| 国产欧美在线视频 | 国产精品三级久久久久久电影 | 国产成人综合一区二区三区 | 欧美日韩国产一区二区在线观看 | 国产精品一区二区三区在线播放 | 婷婷色5月| 欧美激情一区二区三区在线观看 | 黄色电影在线免费观看 | 亚洲欧美中文日韩在线v日本 | 国内精品视频一区二区三区 | 亚洲在线播放 | 国产免费一区二区三区四区五区 | 欧美一级片免费在线观看 | 成人国产| 天天天天爽 | 欧美一区久久 | 欧美国产在线观看 | 国产伦精品一区二区三区四区视频 | 欧美啊v | 国产精品久久久久久久久小说 | 五月婷婷导航 | 中文字幕一区二区在线观看 | 精品日韩欧美一区二区三区在线播放 | 玖玖精品 | 久草成人 | 五月激情综合 | 久久不射电影网 | 激情五月综合网 | 97视频在线 | 亚洲精品在线免费播放 | 一区二区在线免费观看 | 国产高清在线看 | 国产精品久久久久久久久久久久久久 | 一区二区三区四区精品 | 国产精品久久久久国产a级 日韩在线二区 | 国产免费一区二区三区 | 精品人成 | 久久99爱视频 | va在线 | 高清国产一区二区三区 | 亚洲一区二区三区免费视频 | 国产97久久 | 中文字幕欧美日韩 | 久久久久久网站 | 91精品国产91久久久久久最新 | 欧美激情在线精品一区二区三区 | 密室大逃脱第六季大神版在线观看 | 激情欧美日韩一区二区 | 亚洲欧美网址 | 国产精品久久久久久久久久10秀 | 精品日韩一区二区 | 中文精品一区二区三区 | 久久作爱视频 | 精一区二区 | 久久一精品 | 午夜视频福利 | 日韩在线欧美 | 日本欧美久久久久免费播放网 | 香蕉久久av一区二区三区 | 韩国三级中文字幕hd久久精品 | 欧美在线视频网 | 国产欧美精品 | 国产区视频在线观看 | a毛片毛片av永久免费 | 一区二区免费在线视频 | 久久免费小视频 | 搡女人真爽免费午夜网站 | 国产伊人久 | 一区二区三区视频在线播放 | 日本一区高清 | 在线观看亚洲 | 青青99 | 欧美一级二级三级视频 | 色婷婷在线视频 | 一级毛片电影 | 亚洲久草| 自拍偷拍精品 | 亚洲精品乱码久久久久久久 | 国产三级在线 | 日本久久精品一区 | а天堂中文最新一区二区三区 | 婷婷激情五月 | 亚洲一区二区三区久久久 | 久久久久国产一区二区三区四区 | 欧美乱码久久久久久蜜桃 | 国产女爽爽视频精品免费 | 欧美亚洲国产一区二区三区 | 久久久久一区二区 | 日韩视频网站在线观看 | 亚洲视频在线免费观看 | 国产免费亚洲 | 国产成人片 | 久久久久久久久一区二区三区 | 日韩欧美专区 | 三级视频网站 | 国产aⅴ一区二区 | 国产成人精品免费视频大全 | 国产成人在线播放 | 在线观看av国产一区二区 | 国产午夜精品一区二区 | 不卡中文一区 | 谁有毛片| 自拍偷拍一区二区三区 | 九九精品视频在线 | av片在线观看 | 亚洲一区二区三区在线视频 | 亚洲成人看片 | a视频在线 | 伊人av超碰久久久麻豆 | 宅男lu666噜噜噜在线观看 | 欧美一区二区久久 | 国产精品美女在线观看 | 欧美一级免费大片 | 国产一级免费在线 | av网站在线免费观看 | 国产成人99 | 99国产视频| 国产精品毛片久久久久久 | 日韩成人免费av | 午夜免费 | 精品乱子伦一区二区三区 | 在线播放亚洲 | 91麻豆精品国产91久久久久久久久 | 亚洲成人自拍 | 国内精品视频一区国产 | 久久视频免费 | 一区二区三区高清 | 国产精品三级久久久久久电影 | 国产精品不卡视频 | 日本精品在线观看 | 国产福利视频在线观看 | 国产精品一区二区在线观看 | 五月激情综合网 | 999在线观看精品免费不卡网站 | 久久精品久久久 | 欧美日韩啪啪 | 国产乱淫av片 | 犬夜叉在线观看 | 久久久久一区二区三区 | 国产一区在线不卡 | 久久久夜夜夜 | 国产一区二区三区四 | 国产视频一区二区 | 久久全国免费视频 | 亚洲精品美女久久久 | 99精品全国免费观看视频软件 | 国产在线高清 | 亚洲欧美日韩精品久久亚洲区 | 国产精品久久久一区二区 | 日本中文字幕在线视频 | 狠狠综合久久av一区二区老牛 | 狠狠色丁香婷婷综合 | 中字幕视频在线永久在线观看免费 | 欧美精品乱码久久久久久按摩 | 日韩精品www | 美女毛片免费看 | 中文字幕在线观看www | 人人艹人人爽 | 中文字幕亚洲一区二区三区 | 精品亚洲一区二区 | 国产精品高清在线 | 国产高清一区二区 | 四虎影院在线看 | 亚洲一区二区 | av在线一区二区 | 欧美国产激情 |