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

阿里面試官:LinkedHashMap是怎么保證元素有序的?

開發(fā) 前端
這其實跟HashMap的底層設(shè)計有關(guān),HashMap并不是像ArrayList那樣,按照元素的插入順序存儲。而是先計算key的哈希值,再用哈希值對數(shù)組長度求余,算出數(shù)組下標(biāo),存儲到下標(biāo)所在的位置,如果該位置上存在鏈表或者紅黑樹,再把這個元素插入到鏈表或者紅黑樹上面。

阿里的上下班時間是1095,這么忙也不能耽誤更新《解讀Java源碼專欄》,在這個系列中,我將手把手帶著大家剖析Java核心組件的源碼,內(nèi)容包含集合、線程、線程池、并發(fā)、隊列等,深入了解其背后的設(shè)計思想和實現(xiàn)細(xì)節(jié),輕松應(yīng)對工作面試。

這是解讀Java源碼系列的第五篇,將跟大家一起學(xué)習(xí)Java中比較神秘的數(shù)據(jù)結(jié)構(gòu) - LinkedHashMap。

引言

新手程序員在使用HashMap的時候,會有個疑問,為什么存到HashMap中的數(shù)據(jù)不是有序的?

這其實跟HashMap的底層設(shè)計有關(guān),HashMap并不是像ArrayList那樣,按照元素的插入順序存儲。而是先計算key的哈希值,再用哈希值對數(shù)組長度求余,算出數(shù)組下標(biāo),存儲到下標(biāo)所在的位置,如果該位置上存在鏈表或者紅黑樹,再把這個元素插入到鏈表或者紅黑樹上面。

這樣設(shè)計,可以實現(xiàn)快速查詢,也就犧牲了存儲順序。因為不同key的哈希值差別很大,所以在數(shù)組中存儲是無序的。

然而,有時候我們在遍歷HashMap的時候,又希望按照元素插入順序迭代,有沒有什么方式能實現(xiàn)這個需求?

有的,就是今天的主角LinkedHashMap,不但保證了HashMap的性能,還實現(xiàn)了按照元素插入順序或者訪問順序進(jìn)行迭代。

在這篇文章中,你將學(xué)到以下內(nèi)容:

  1. LinkedHashMap與HashMap區(qū)別?
  2. LinkedHashMap特點有哪些?
  3. LinkedHashMap底層實現(xiàn)原理?
  4. 怎么使用``LinkedHashMap實現(xiàn) LRU 緩存?

簡介

LinkedHashMap繼承自HashMap,是HashMap的子類,內(nèi)部額外維護(hù)了一個雙鏈表,來保證元素的插入順序或訪問順序,用空間換時間。 與HashMap相比,LinkedHashMap有三個優(yōu)點:

  1. 維護(hù)了元素插入順序,支持以元素插入順序進(jìn)行迭代。
  2. 維護(hù)了元素的訪問順序,支持以元素訪問順序進(jìn)行迭代。最近訪問或者更新的元素,會被移動到鏈表末尾,類似于LRU(Least Recently Used,最近最少使用)。當(dāng)面試的時候,手寫LRU緩存,需要用到或者參考LinkedHashMap。
  3. 迭代效率更高,迭代LinkedHashMap的時候,不需要遍歷整個數(shù)組,只需遍歷雙鏈表即可,效率更高。

圖片圖片

類屬性

public class LinkedHashMap<K, V> extends HashMap<K, V> implements Map<K, V> {

    /**
     * 頭節(jié)點
     */
    transient Entry<K, V> head;

    /**
     * 尾節(jié)點
     */
    transient Entry<K, V> tail;

    /**
     * 迭代排序方式,true表示按照訪問順序,false表示按照插入順序
     */
    final boolean accessOrder;

    /**
     * 雙鏈表的節(jié)點類
     */
    static class Entry<K, V> extends HashMap.Node<K, V> {
        /**
         * 雙鏈表的前驅(qū)節(jié)點和后繼節(jié)點
         */
        Entry<K, V> before, after;

        /**
         * 構(gòu)造雙鏈表的節(jié)點
         *
         * @param hash 哈希值
         * @param key  鍵
         * @param value 值
         * @param next 后繼節(jié)點
         */
        Entry(int hash, K key, V value, Node<K, V> next) {
            super(hash, key, value, next);
        }
    }

}

可以看出LinkedHashMap繼承自HashMap,在HashMap的單鏈表Node節(jié)點的基礎(chǔ)上,增加了前驅(qū)節(jié)點before、后繼節(jié)點after、頭節(jié)點head、尾節(jié)點tail,擴(kuò)展成了雙鏈表節(jié)點Entry,并記錄了迭代排序方式accessOrder。

初始化

LinkedHashMap常見的初始化方法有四個方法:

  1. 無參初始化
  2. 指定容量大小的初始化
  3. 指定容量大小、負(fù)載系數(shù)的初始化
  4. 指定容量大小、負(fù)載系數(shù)、迭代順序的初始化
/**
 * 無參初始化
 */
Map<Integer, Integer> map1 = new LinkedHashMap<>();

/**
 * 指定容量大小的初始化
 */
Map<Integer, Integer> map2 = new LinkedHashMap<>(16);

/**
 * 指定容量大小、負(fù)載系數(shù)的初始化
 */
Map<Integer, Integer> map3 = new LinkedHashMap<>(16, 0.75f);

/**
 * 指定容量大小、負(fù)載系數(shù)、迭代順序的初始化
 */
Map<Integer, Integer> map4 = new LinkedHashMap<>(16, 0.75f, true);

再看一下構(gòu)造方法的底層實現(xiàn):

/**
 * 無參初始化
 */
public LinkedHashMap() {
    super();
    accessOrder = false;
}

/**
 * 指定容量大小的初始化
 */
public LinkedHashMap(int initialCapacity) {
    super(initialCapacity);
    accessOrder = false;
}

/**
 * 指定容量大小、負(fù)載系數(shù)的初始化
 *
 * @param initialCapacity 初始容量
 * @param loadFactor      負(fù)載系數(shù)
 */
public LinkedHashMap(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor);
    accessOrder = false;
}

/**
 * 指定容量大小、負(fù)載系數(shù)、迭代順序的初始化
 *
 * @param initialCapacity 初始容量
 * @param loadFactor      負(fù)載系數(shù)
 * @param accessOrder     迭代順序,true表示按照訪問順序,false表示按照插入順序
 */
public LinkedHashMap(int initialCapacity,
                     float loadFactor,
                     boolean accessOrder) {
    super(initialCapacity, loadFactor);
    this.accessOrder = accessOrder;
}

LinkedHashMap的構(gòu)造方法底層都是調(diào)用的HashMap的構(gòu)造方法,迭代順序accessOrder默認(rèn)是false,表示按照元素插入順序迭代,可以在初始化LinkedHashMap的時候指定為 true,表示按照訪問順序迭代。

put源碼

LinkedHashMap的put方法完全使用的是HashMap的put方法,并沒有重新實現(xiàn)。不過HashMap中定義了一些空方法,留給子類LinkedHashMap去實現(xiàn)。 有以下三個方法:

public class HashMap<K, V> {
    
    /**
     * 在訪問節(jié)點后執(zhí)行的操作
     */
    void afterNodeAccess(Node<K, V> p) {
    }

    /**
     * 在插入節(jié)點后執(zhí)行的操作
     */
    void afterNodeInsertion(boolean evict) {
    }

    /**
     * 在刪除節(jié)點后執(zhí)行的操作
     */
    void afterNodeRemoval(Node<K, V> p) {
    }
    
}

在HashMap的put源碼中就調(diào)用前兩個方法:

圖片圖片

看一下afterNodeInsertion()方法的源碼,看一下再插入節(jié)點后要執(zhí)行哪些操作? 在插入節(jié)點后,只執(zhí)行了一個操作,就是判斷是否刪除最舊的節(jié)點。removeEldestEntry()方法默認(rèn)返回false,表示不需要刪除節(jié)點。我們也可以重寫removeEldestEntry()方法,當(dāng)元素數(shù)量超過閾值時,返回true,表示刪除最舊的節(jié)點。

/**
 * 在插入節(jié)點后執(zhí)行的操作(刪除最舊的節(jié)點)
 */
void afterNodeInsertion(boolean evict) {
    Entry<K, V> first;
    // 判斷是否需要刪除當(dāng)前節(jié)點
    if (evict && (first = head) != null && removeEldestEntry(first)) {
        K key = first.key;
        // 調(diào)用HashMap的刪除節(jié)點的方法
        removeNode(hash(key), key, null, false, true);
    }
}

/**
 * 是否刪除最舊的節(jié)點,默認(rèn)是false,表示不刪除
 */
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    return false;
}

創(chuàng)建節(jié)點

由于afterNodeInsertion()方法并沒有把新節(jié)點插入到雙鏈表中,所以LinkedHashMap又重寫創(chuàng)建節(jié)點的newNode()方法,在newNode()方法中把新節(jié)點插入到雙鏈表。

public class LinkedHashMap<K, V> extends HashMap<K, V> implements Map<K, V> {

    /**
     * 創(chuàng)建鏈表節(jié)點
     */
    @Override
    Node<K, V> newNode(int hash, K key, V value, Node<K, V> e) {
        // 1. 創(chuàng)建雙鏈表節(jié)點
        LinkedHashMap.Entry<K, V> p = new LinkedHashMap.Entry<K, V>(hash, key, value, e);
        // 2. 追加到鏈表末尾
        linkNodeLast(p);
        return p;
    }

    /**
     * 創(chuàng)建紅黑樹節(jié)點
     */
    @Override
    TreeNode<K, V> newTreeNode(int hash, K key, V value, Node<K, V> next) {
        // 1. 創(chuàng)建紅黑樹節(jié)點
        TreeNode<K, V> p = new TreeNode<K, V>(hash, key, value, next);
        // 2. 追加到鏈表末尾
        linkNodeLast(p);
        return p;
    }

    /**
     * 追加到鏈表末尾
     */
    private void linkNodeLast(LinkedHashMap.Entry<K, V> p) {
        LinkedHashMap.Entry<K, V> last = tail;
        tail = p;
        if (last == null) {
            head = p;
        } else {
            p.before = last;
            last.after = p;
        }
    }
}

get源碼

再看一下 get 方法源碼,LinkedHashMap的 get 方法是直接調(diào)用的HashMap的get方法邏輯,在獲取到value 后,判斷 value 不為空,就執(zhí)行afterNodeAccess()方法邏輯,把該節(jié)點移動到鏈表末尾,afterNodeAccess()方法邏輯在前面已經(jīng)講過。

/**
 * get方法入口
 */
public V get(Object key) {
    Node<K,V> e;
    // 直接調(diào)用HashMap的get方法源碼
    if ((e = getNode(hash(key), key)) == null) {
        return null;
    }
    // 如果value不為空,并且設(shè)置了accessOrder為true(表示迭代順序為訪問順序),就執(zhí)行訪問節(jié)點后的操作
    if (accessOrder) {
        afterNodeAccess(e);
    }
    return e.value;
}

看一下afterNodeAccess()方法的源碼實現(xiàn),看一下在訪問節(jié)點要做哪些操作?afterNodeAccess()方法的邏輯也很簡單,核心邏輯就是把當(dāng)前節(jié)點移動到鏈表末尾,分為三步:

  1. 斷開當(dāng)前節(jié)點與后繼節(jié)點的連接
  2. 斷開當(dāng)前節(jié)點與前驅(qū)節(jié)點的連接
  3. 把當(dāng)前節(jié)點插入到鏈表末尾
/**
 * 在訪問節(jié)點后執(zhí)行的操作(把節(jié)點移動到鏈表末尾)
 */
void afterNodeAccess(Node<K, V> e) {
    Entry<K, V> last;
    // 當(dāng)accessOrder為true時,表示按照訪問順序,這時候才需要更新鏈表
    // 并且判斷當(dāng)前節(jié)點不是尾節(jié)點
    if (accessOrder && (last = tail) != e) {
        Entry<K, V> p = (Entry<K, V>) e, b = p.before, a = p.after;
        // 1. 斷開當(dāng)前節(jié)點與后繼節(jié)點的連接
        p.after = null;
        if (b == null) {
            head = a;
        } else {
            b.after = a;
        }
        // 2. 斷開當(dāng)前節(jié)點與前驅(qū)節(jié)點的連接
        if (a != null) {
            a.before = b;
        } else {
            last = b;
        }
        // 3. 把當(dāng)前節(jié)點插入到鏈表末尾
        if (last == null) {
            head = p;
        } else {
            p.before = last;
            last.after = p;
        }
        tail = p;
        ++modCount;
    }
}

remove源碼

LinkedHashMap的 remove 方法完全使用的是 HashMap 的 remove 方法,并沒有重新實現(xiàn)。不過 HashMap的 remove 中調(diào)用了afterNodeRemoval?(),執(zhí)行刪除節(jié)點后邏輯,LinkedHashMap重寫了該方法的邏輯。

圖片圖片

/**
 * 在刪除節(jié)點后執(zhí)行的操作(從雙鏈表中刪除該節(jié)點)
 */
void afterNodeRemoval(Node<K, V> e) {
    LinkedHashMap.Entry<K, V> p =
            (LinkedHashMap.Entry<K, V>) e, b = p.before, a = p.after;
    p.before = p.after = null;
    // 1. 斷開當(dāng)前節(jié)點與前驅(qū)節(jié)點的連接
    if (b == null) {
        head = a;
    } else {
        b.after = a;
    }
    // 2. 斷開當(dāng)前節(jié)點與后繼節(jié)點的連接
    if (a == null) {
        tail = b;
    } else {
        a.before = b;
    }
}

總結(jié)

現(xiàn)在可以回答文章開頭提出的問題:

  1. LinkedHashMap與HashMap區(qū)別?

答案:LinkedHashMap繼承自HashMap,是HashMap的子類。

  1. LinkedHashMap特點有哪些?

答案:除了保證了與HashMap一樣高效的查詢和插入性能外,還支持以插入順序或者訪問順序進(jìn)行迭代訪問。

  1. LinkedHashMap底層實現(xiàn)原理?

答案:LinkedHashMap底層源碼都是使用了HashMap的邏輯實現(xiàn),使用雙鏈表維護(hù)元素的順序,并重寫了以下三個方法:

  1. afterNodeAccess(),在訪問節(jié)點后執(zhí)行的操作
  2. afterNodeInsertion(),在插入節(jié)點后執(zhí)行的操作。
  3. afterNodeRemoval(),在刪除節(jié)點后執(zhí)行的操作。
  4. 怎么使用``LinkedHashMap實現(xiàn) LRU 緩存?

答案:由于LinkedHashMap內(nèi)部已經(jīng)實現(xiàn)按照訪問元素的迭代順序,所以只需復(fù)用LinkedHashMap的邏輯,繼承LinkedHashMap,重寫removeEldestEntry()方法。

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author 一燈架構(gòu)
 * @apiNote 使用LinkedHashMap實現(xiàn)LRU緩存
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {

    /**
     * 緩存容量大小
     */
    private final int capacity;

    /**
     * 構(gòu)造方法
     *
     * @param capacity 緩存容量大小
     */
    public LRUCache(int capacity) {
        // 底層使用LinkedHashMap的構(gòu)造方法
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }

    /**
     * 當(dāng)緩存容量達(dá)到上限時,移除最久未使用的節(jié)點
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > capacity;
    }

    public static void main(String[] args) {
        LRUCache<Integer, String> cache = new LRUCache<>(3);
        cache.put(1, "One");
        cache.put(2, "Two");
        cache.put(3, "Three");
        System.out.println(cache); // 輸出: {1=One, 2=Two, 3=Three}

        cache.get(2);
        System.out.println(cache); // 輸出: {1=One, 3=Three, 2=Two}

        cache.put(4, "Four");
        System.out.println(cache); // 輸出: {3=Three, 2=Two, 4=Four}
    }
}

責(zé)任編輯:武曉燕 來源: 一燈架構(gòu)
相關(guān)推薦

2023-11-06 17:39:35

JavaArrayList線程

2021-09-27 07:11:18

MySQLACID特性

2021-01-20 07:16:07

冪等性接口token

2022-07-15 08:22:42

對象符串鍵Symbol

2021-12-21 07:07:43

HashSet元素數(shù)量

2024-11-26 17:43:51

2025-03-10 11:48:22

項目服務(wù)設(shè)計

2021-11-05 10:07:13

Redis哈希表存儲

2019-11-21 08:40:44

面試官優(yōu)化性能

2024-02-28 10:14:47

Redis數(shù)據(jù)硬盤

2023-09-01 15:27:31

2025-04-14 11:41:12

RocketMQ長輪詢配置

2023-02-08 07:04:20

死鎖面試官單元

2025-10-28 02:00:00

2021-10-22 08:37:13

消息不丟失rocketmq消息隊列

2021-09-07 10:44:33

Java 注解開發(fā)

2022-11-25 17:29:27

分布式事務(wù)

2025-10-17 09:49:07

2020-02-25 16:56:02

面試官有話想說

2025-10-09 01:22:00

點贊
收藏

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

国产精品国产三级国产aⅴ9色| 欧美大片在线观看一区二区| 欧洲亚洲一区| 一级做a爱片性色毛片| 久久精品一区二区不卡| 亚洲成人国产精品| 久久久久国产一区| 少女频道在线观看免费播放电视剧| 大白屁股一区二区视频| 青青久久av北条麻妃黑人| 国产大屁股喷水视频在线观看| 免费观看在线一区二区三区| 欧美香蕉大胸在线视频观看| 亚洲自拍偷拍一区二区三区| 三级视频在线播放| 国产一区二区三区四区五区入口| 91av在线精品| 手机在线免费看毛片| 天天做夜夜做人人爱精品 | 亚洲欧美日韩精品久久奇米色影视| 色悠悠久久综合网| 僵尸再翻生在线观看免费国语| 国产精品美女久久久久aⅴ| av一区二区三区四区电影| 中文字幕xxxx| 国产一区二区你懂的| 久久婷婷国产麻豆91天堂| 蜜桃av免费看| 久9re热视频这里只有精品| 欧美裸体一区二区三区| 欧洲av无码放荡人妇网站| 日本中文字幕中出在线| 中文字幕一区二区在线播放| 欧美人与性禽动交精品| 手机在线观看毛片| 国产高清久久久| 成人精品一区二区三区电影免费| 樱花视频在线免费观看| 国产一区二区三区成人欧美日韩在线观看 | 国产又粗又猛大又黄又爽| 88xx成人网| 在线亚洲一区观看| 国产乱子夫妻xx黑人xyx真爽| 羞羞网站在线免费观看| 最新国产成人在线观看| 一区二区三区av| av在线电影播放| 中文字幕二三区不卡| 欧美污视频久久久| 男人天堂亚洲二区| 久久这里只精品最新地址| 国产一区二区高清不卡| 欧美一区,二区| 成人黄色a**站在线观看| yy111111少妇影院日韩夜片| 超碰福利在线观看| 成人黄色在线网站| 精品伦精品一区二区三区视频| 欧美一区二区公司| 成人av资源在线观看| 国产一区二区高清视频| 香蕉视频黄在线观看| 91视频com| 日韩av一区二区三区在线| 国产一区精品| 国产精品久久久久影院老司| 色中文字幕在线观看| 成人免费视屏| 亚洲国产精品人人做人人爽| 日韩欧美视频网站| 免费成人美女女| 欧美色网站导航| 午夜免费福利网站| 风间由美一区二区av101| 亚洲国产高潮在线观看| 自拍偷拍中文字幕| 日韩免费av| 欧美成人在线网站| 国产福利拍拍拍| 视频在线观看一区| 成人免费视频网址| 手机看片国产1024| 国产日韩综合av| 亚洲成人av动漫| av毛片在线播放| 精品久久久视频| 婷婷免费在线观看| 日韩精品一区二区三区免费视频| 日韩成人在线电影网| 成熟人妻av无码专区| 欧美黄色精品| 欧洲亚洲免费在线| 国产精品国产三级国产普通话对白| 国产一区二区在线看| 精品视频一区二区三区四区| 波多野结衣在线影院| 一区二区三区在线观看欧美| 777久久久精品一区二区三区| 久久69成人| 亚洲黄色免费三级| 黄色一级片一级片| 亚洲国产清纯| 国产精品久久久久9999| www.热久久| 中文字幕欧美激情| 欧美精品一区二区三区三州| 久久不卡日韩美女| 亚洲国产三级网| www青青草原| 日韩国产在线一| 激情小说综合区| www.在线视频| 欧美性大战久久久久久久蜜臀| 性高潮久久久久久| 成人一级毛片| 欧美在线免费视频| 乱精品一区字幕二区| 国产精品人妖ts系列视频| 野外做受又硬又粗又大视频√| 日本美女久久| 精品五月天久久| 久久久久久久久久久久国产| 久久99精品久久久久久| 欧美精品在线一区| 日本在线啊啊| 亚洲国产精品久久久久| 91porn在线视频| 老司机免费视频一区二区三区| 蜜桃欧美视频| 成人免费网站观看| 亚洲成人激情图| 久久久久久福利| 国产毛片精品一区| 综合国产精品久久久| 欧美视频在线视频精品| 一区二区欧美激情| 成人午夜精品视频| 国产三级一区二区| 无码日韩人妻精品久久蜜桃| 天天躁日日躁狠狠躁欧美巨大小说| 久久久久中文字幕2018| 亚洲毛片在线播放| 亚洲综合色噜噜狠狠| 亚洲v日本v欧美v久久精品| 欧美黄色直播| 日韩性xxx| 亚洲欧洲美洲在线综合| 亚洲欧美偷拍视频| 26uuu久久综合| 国内外成人免费激情视频| 图片婷婷一区| 国产精品96久久久久久| 国产小视频在线| 一本大道av一区二区在线播放| 亚洲专区区免费| 日韩在线a电影| 亚洲精品日韩精品| 亚洲精品大全| 欧美国产日韩二区| 人妻va精品va欧美va| 偷偷要91色婷婷| 精品人妻一区二区三区视频| 噜噜噜在线观看免费视频日韩| 欧美一卡2卡3卡4卡无卡免费观看水多多| 不卡福利视频| 色播久久人人爽人人爽人人片视av| 亚洲特级黄色片| 亚洲久本草在线中文字幕| 成人啪啪18免费游戏链接| 亚洲激情社区| 日本在线观看一区二区三区| 欧洲亚洲精品| 色与欲影视天天看综合网| 少妇高潮一区二区三区69| 天天av综合网| 亚洲视频在线一区| 中文字幕99页| 久久都是精品| 潘金莲一级淫片aaaaa免费看| 亚洲天堂中文字幕在线观看| 97视频com| av网页在线| 欧美一级高清片在线观看| 国产精品18p| 日本一区二区三区视频视频| 国产传媒免费观看| 在线日韩中文| 亚洲激情啪啪| a看欧美黄色女同性恋| 欧美一级大片在线免费观看| 日本中文字幕在线看| 日韩欧美国产一区二区三区| 99精品视频99| 中文字幕在线观看一区二区| 国产精品久久久久久亚洲色| 日韩国产欧美在线视频| 精品日韩在线播放| 天天躁日日躁狠狠躁欧美| 成人精品久久一区二区三区| 国产欧洲在线| 麻豆国产精品va在线观看不卡| 日韩毛片在线一区二区毛片| 在线综合+亚洲+欧美中文字幕| 亚洲 欧美 视频| 日韩美女久久久| 亚洲一区视频在线播放| 国产成a人无v码亚洲福利| 国产高清视频网站| 香蕉av777xxx色综合一区| 国产一级片91| 日韩免费特黄一二三区| 久久久水蜜桃| 综合激情久久| 91免费综合在线| 久久久成人av毛片免费观看| 91精品国产高清自在线| 国产激情小视频在线| 国产亚洲精品久久久久久777 | 久久99国内精品| 69堂免费视频| 伊人成年综合电影网| 国产一区一区三区| 日韩在线高清| 日本成人三级电影网站| 激情小说亚洲色图| 成人在线视频网址| 国产精品久久久久久久久久久久久久久 | 日韩精彩视频| 亚洲va久久久噜噜噜久久| 99九九视频| 免费观看性欧美大片无片| 国产日韩在线免费| www.成人在线视频| 国产成+人+综合+亚洲欧洲 | 人妻无码中文久久久久专区| 国产精品一二三区在线| 污污的视频免费观看| 全国精品久久少妇| 亚洲精品高清无码视频| 欧美中文日韩| 97在线播放视频| 国产精品老牛| 熟女性饥渴一区二区三区| 亚洲日本黄色| 日韩avxxx| 久久久xxx| 97公开免费视频| 蜜臀av一级做a爰片久久| www.超碰com| 另类成人小视频在线| wwwwwxxxx日本| 激情综合网av| 中文字幕一二三| 丁香婷婷综合网| 欧美大片免费播放器| 91看片淫黄大片一级在线观看| 国产白嫩美女无套久久| 91碰在线视频| 男人舔女人下部高潮全视频| 国产嫩草影院久久久久| 后入内射无码人妻一区| 中文字幕在线观看不卡视频| 国产探花在线播放| 亚洲影视在线观看| www.av麻豆| 欧洲国内综合视频| 国产精品无码AV| 精品久久久久久久久久久久包黑料| 国内爆初菊对白视频| 亚洲精品第一页| 国产51人人成人人人人爽色哟哟| 丝袜美腿精品国产二区| 69xxx在线| 91精品91久久久久久| 婷婷午夜社区一区| 成人欧美在线视频| 91成人福利| 欧美精品成人一区二区在线观看| 日韩一区电影| 久久精品xxx| 日韩成人精品在线| 国产一级二级av| 91污在线观看| 手机在线免费看片| 欧美日韩激情美女| 91麻豆国产视频| 亚洲精品一区二区三区精华液| 国产一级在线| 欧美国产第一页| 成人黄色视屏网站| 高清视频在线观看一区| 国产欧美日韩一区二区三区四区| 熟女视频一区二区三区| 亚洲在线免费| 国产人妻精品久久久久野外| 91婷婷韩国欧美一区二区| 人人澡人人澡人人看| 欧美性xxxx在线播放| 999免费视频| 亚洲天堂网在线观看| 影院在线观看全集免费观看| 国产成人短视频| 99国产精品久久一区二区三区| 四虎永久在线精品免费一区二区| 黄色亚洲在线| 五月婷婷六月丁香激情| 91亚洲资源网| 极品颜值美女露脸啪啪| 欧美综合久久久| 天天操天天干天天爱| 欧美成人高清视频| 欧美色片在线观看| 久久99精品国产99久久| 亚洲色图欧美| 天天爽天天爽夜夜爽| av中文字幕不卡| 欧美黑人性猛交xxx| 欧美在线视频全部完| 日韩资源在线| 97婷婷涩涩精品一区| 亚洲成av人片在线观看www| 亚洲精品乱码视频| 久久综合影视| 手机av免费看| 亚洲1区2区3区视频| 国产成人精品免费看视频| 最近的2019中文字幕免费一页| 国产精品av一区二区三区 | 国产成人涩涩涩视频在线观看| 一区二区在线免费播放| 日本女人高潮视频| 捆绑紧缚一区二区三区视频| 欧美 日韩 成人| 色网综合在线观看| 色播色播色播色播色播在线| 国模精品系列视频| 永久免费精品视频| 亚洲黄色网址在线观看| 国模大尺度一区二区三区| 一本在线免费视频| 欧美三级视频在线| av在线第一页| 国产综合香蕉五月婷在线| 久久高清精品| 久久黄色片网站| 1024成人网| 99国产精品久久久久久久成人 | 国产一区二区女| 亚洲xxxx3d动漫| 欧美一二三区精品| 日本h片在线| 国产精品18毛片一区二区| 欧美日韩国产高清| 大尺度做爰床戏呻吟舒畅| 黑人极品videos精品欧美裸| 深夜福利在线看| 国产成人精品免高潮在线观看| 国产99久久久国产精品成人免费| 国产又黄又猛视频| 国产精品国产a| 国产黄色片网站| 欧美精品精品精品精品免费| 欧美三级自拍| 免费看一级大黄情大片| 久久精品一区二区三区不卡牛牛| japanese国产在线观看| 日韩最新免费不卡| 日韩区一区二| 免费无遮挡无码永久视频| 国产亚洲精品bt天堂精选| 在线亚洲欧美日韩| 欧美成人第一页| 午夜a一级毛片亚洲欧洲| 五月婷婷狠狠操| 亚洲人成小说网站色在线| 黄色一级大片在线免费看国产| 青青草成人在线| 亚洲高清影视| 中文字幕 亚洲一区| 欧美日韩成人激情| 91黄页在线观看| 亚洲电影免费| 成人午夜激情在线| 波多野结衣在线电影| 久久久精品在线观看| 欧美a级网站| 日韩在线一区视频| 天天亚洲美女在线视频| 天堂аⅴ在线地址8| 国产在线资源一区| 蜜桃一区二区三区在线| 国产一级大片在线观看| 亚洲偷欧美偷国内偷| 日韩精品免费视频一区二区三区| 男人亚洲天堂网| 亚洲综合一二三区| av播放在线| 久久精品美女| 国产91精品一区二区麻豆网站| 欧美一级做a爰片免费视频|