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

国产黄色大片在线观看| 国产精品系列视频| 亚洲97av| 欧美精品乱人伦久久久久久| 肉大捧一出免费观看网站在线播放| 亚洲第一香蕉网| 成人黄色毛片| 亚洲一区二区av电影| 欧美激情第六页| 精品国产一级片| 亚洲欧美网站| 久久99久久99精品中文字幕| 精品人妻一区二区三区视频| 国产日韩在线观看视频| 欧美视频在线观看免费| 国产又爽又黄ai换脸| 免费国产在线观看| 成人午夜视频福利| 国产一区二区丝袜| 日本午夜视频在线观看| 女主播福利一区| 尤物yw午夜国产精品视频明星| 777精品久无码人妻蜜桃| av在线电影播放| 91玉足脚交白嫩脚丫在线播放| 欧美激情va永久在线播放| 国产成人av一区二区三区不卡| 91超碰在线免费| 综合av第一页| 任我爽在线视频精品一| 日本毛片在线观看| 国产精品羞羞答答xxdd| 国产精品一区二区三区久久久| 国产又粗又猛又爽又黄的视频小说| 成人看片网页| 欧美午夜女人视频在线| cao在线观看| 4438x成人网全国最大| 中文字幕精品三区| 欧美一区观看| 日本电影一区二区在线观看| 国产91精品一区二区麻豆网站| 欧美国产第一页| 永久免费看mv网站入口| 国产中文字幕一区二区三区 | 亚洲精品成人网| 国产美女视频免费看| 韩日精品一区| 欧美在线播放高清精品| 久久久精品三级| 成人开心激情| 欧美性猛交xxxx黑人交| www欧美激情| 黑人一区二区三区| 欧美日韩亚洲高清一区二区| 特级丰满少妇一级| 亚洲综合资源| 日韩女优av电影| 深田咏美中文字幕| 国产 日韩 欧美 综合 一区| 精品国产乱码久久久久久影片| 国产1区2区在线| 欧美韩国亚洲| 欧美猛男超大videosgay| 久久成年人网站| 涩爱av色老久久精品偷偷鲁| 欧美成人一区二区三区在线观看 | 亚洲国产精久久久久久| 性欧美18—19sex性高清| 久久久久观看| 日韩精品日韩在线观看| 亚洲色成人网站www永久四虎| 精品国模一区二区三区欧美| 日韩亚洲欧美中文三级| 精品无码人妻少妇久久久久久| 成人美女大片| 欧美日韩一区在线| 国产一级免费大片| 国产精品99久久免费观看| 日韩成人在线免费观看| 大胸美女被爆操| 婷婷另类小说| 性色av香蕉一区二区| 亚洲黄色激情视频| 卡一卡二国产精品| 国产精品大全| 国产资源在线播放| 亚洲三级理论片| 国产中文字幕二区| 国产精品久久乐| 精品国产一区二区三区四区四| 成人一级片网站| 日韩在线激情| 精品1区2区在线观看| 亚洲区自拍偷拍| 欧美成人tv| 日韩免费精品视频| av中文字幕播放| 久久亚洲精品国产精品紫薇| aaa免费在线观看| 午夜影院在线播放| 欧美日韩一卡二卡三卡| 97精品人妻一区二区三区蜜桃| 亚洲日本在线观看视频| 91精品国产手机| 欧美成人午夜精品免费| 欧美99久久| 日本韩国在线不卡| 久久中文字幕免费| 国产一区二区精品久久| 区一区二区三区中文字幕| 色爱综合区网| 欧美日韩mp4| 欧美一区二区三区成人精品| 欧美在线资源| 国产精品视频网| 亚洲av成人精品一区二区三区在线播放 | www.亚洲天堂网| 一区二区精彩视频| 深夜福利亚洲导航| 国产一级淫片a视频免费观看| 亚洲高清自拍| 91精品国产综合久久香蕉| 青青九九免费视频在线| 亚洲国产中文字幕在线视频综合 | 欧美大波大乳巨大乳| 亚洲啊v在线观看| 国产精品精品久久久| 色播色播色播色播色播在线| 亚洲一区二区综合| 性生活在线视频| 欧美丰满日韩| 国产精品女主播| 国产永久av在线| 日韩欧美在线免费| 中文字幕在线免费看线人 | 99精品黄色片免费大全| 国产激情片在线观看| 日韩欧乱色一区二区三区在线| 在线播放欧美女士性生活| 亚洲图片另类小说| 亚洲专区免费| 久久久久久艹| 亚洲黄色免费av| 亚洲精品日韩欧美| 中文人妻av久久人妻18| 久久精品欧美日韩精品| 91精品91久久久中77777老牛| 成人精品电影在线| 亚洲一区二区久久久| 黑人精品无码一区二区三区AV| 激情成人综合网| 亚洲一区二区在线看| 久久99久久久精品欧美| 日日摸夜夜添一区| 国产乱淫a∨片免费视频| 亚洲免费电影在线| 2018国产精品| av成人黄色| 欧美综合77777色婷婷| 久久sese| 日韩中文字幕网址| 国产色片在线观看| 亚洲一区二区三区免费视频| 特大黑人巨人吊xxxx| 久久一二三区| 在线一区亚洲| 国产精品zjzjzj在线观看| 91久久中文| 国产拍精品一二三| av在线播放观看| 日韩精品中文字幕在线不卡尤物| 91在线无精精品白丝| 美女一区二区三区在线观看| 自拍亚洲欧美老师丝袜| www.国产精品一区| 日本精品免费一区二区三区| 国产高清美女一级毛片久久| 欧美男人的天堂一二区| 国产在线免费视频| 久久久电影一区二区三区| 在线免费视频一区| 欧美日韩网址| 欧美日韩大片一区二区三区| 日韩福利影视| 久久久亚洲国产| 北岛玲日韩精品一区二区三区| 欧美日韩亚洲视频一区| 亚洲女优在线观看| 国产精品一区在线| 成年网站在线免费观看| 久久精品一区二区不卡| 精品日本一区二区| 欧美jizz18| 欧美国产日本高清在线| 国产一级片在线播放| 欧美xxxxxxxx| 中文字幕精品无码亚| 亚洲综合色丁香婷婷六月图片| 五月天开心婷婷| 一本久道久久综合狠狠爱| 亚洲欧美影院| 亚洲免费专区| av一区二区三区四区电影| 手机在线观看av| 久久精品视频一| 蜜桃视频在线观看网站| 精品国产髙清在线看国产毛片| 黄色在线观看免费| 国产欧美日韩精品一区| 四虎精品一区二区| 国内外成人在线| 亚洲熟妇av一区二区三区| 欧美日韩一卡| 成年人免费观看的视频| 九九精品久久| 国产呦系列欧美呦日韩呦| 韩国一区二区三区视频| 国产精品久久久久久久午夜| av在线最新| 色综合久久天天综线观看| 在线看的av网站| 亚洲男人天堂网| 天堂av中文字幕| 精品国产电影一区二区| 精品人妻无码一区二区| 4438亚洲最大| 一级久久久久久久| 欧美日韩一卡二卡三卡| 五月激情丁香网| 日本丰满少妇一区二区三区| 亚洲精品男人天堂| 婷婷中文字幕综合| 日本亚洲色大成网站www久久| 久久综合国产精品| 国产艳妇疯狂做爰视频| 国产精品一区二区在线看| 亚洲综合日韩欧美| 美女爽到高潮91| 日本黄大片一区二区三区| 日本中文在线一区| 国产又大又黄又粗的视频| 日韩精品电影一区亚洲| 无限资源日本好片| 蜜臀久久99精品久久久画质超高清 | 国产综合色产| a级片一区二区| 伊人色**天天综合婷婷| 亚洲黄色网址在线观看| 欧美日本免费| 可以看毛片的网址| 一区二区三区成人精品| 欧美日韩在线视频一区二区三区| 久久久人成影片免费观看| 欧美少妇一级片| 在线免费观看日本欧美爱情大片| 久久资源av| 国产欧美日韩精品一区二区三区 | 欧美69xxxxx| 亚洲美女免费精品视频在线观看| 国产一区二区三区中文字幕| 91精品国产品国语在线不卡| 午夜精品久久久久久久爽| 精品精品欲导航| 水莓100在线视频| 在线观看亚洲视频| 在线网址91| 国产91对白在线播放| abab456成人免费网址| 亚洲一区二区三区xxx视频| 亚洲不卡视频| 久久人人九九| 欧美成人milf| 国产在线视频在线| 校园激情久久| 加勒比av中文字幕| 成人一区二区三区| b站大片免费直播| 1024精品合集| 国产成人愉拍精品久久| 91久久精品网| 国产高潮流白浆喷水视频| 日韩电影免费观看中文字幕| melody高清在线观看| 欧美大片欧美激情性色a∨久久| 免费在线看a| 欧美国产日本高清在线 | 91超碰国产精品| 久久99久久99精品| 天堂va蜜桃一区二区三区 | 免费成人小视频| 亚洲av午夜精品一区二区三区| 国内精品写真在线观看| 影音先锋资源av| 国产精品免费观看视频| 日本一级黄色大片| 91精品在线一区二区| 偷拍自拍在线| 精品中文字幕在线观看| 怡红院成人在线| 成人羞羞视频免费| 久久精品不卡| 丰满人妻中伦妇伦精品app| 国产精品一区二区你懂的| 国产美女免费无遮挡| 亚洲自拍偷拍麻豆| 一级片在线观看视频| 亚洲久久久久久久久久久| 26uuu亚洲电影在线观看| 国产精品高清在线观看| 亚洲精品国产精品粉嫩| a级黄色小视频| 国产九色精品成人porny | 国产午夜精品一区二区三区视频| 久久久精品人妻无码专区| 亚洲免费伊人电影| 香蕉污视频在线观看| 亚洲大胆美女视频| 伊人在我在线看导航| 成人黄色免费看| 日韩激情图片| 又色又爽又高潮免费视频国产| 美女视频一区在线观看| 三上悠亚ssⅰn939无码播放 | 国产一级在线视频| 欧美精品色一区二区三区| 成人18在线| 国产精品美女www爽爽爽视频| 欧美精品三级在线| 一区二区三区四区| 老司机久久99久久精品播放免费 | 99精品欧美一区| 欧美人妻精品一区二区三区| 欧美一区欧美二区| 黄色av网站在线播放| 91精品国产综合久久香蕉| 久久美女视频| 在线观看免费视频高清游戏推荐| 国产91精品欧美| 午夜免费激情视频| 欧美一区二区三区白人| 国产黄色小视频在线| 91美女片黄在线观看游戏| 99久久.com| 在线观看一区二区三区视频| 一区二区三区日韩在线观看| 国产黄色片网站| 欧美激情精品久久久久久久变态 | 91官网在线观看| 色在线免费视频| 欧美高清视频在线播放| 亚洲一区二区三区在线免费| 日b视频免费观看| 99久久伊人久久99| 99精品在线播放| 亚洲欧洲日本专区| 日韩pacopacomama| 亚洲v欧美v另类v综合v日韩v| 欧美女人交a| 亚洲天堂2024| 欧美日韩精品国产| 中国日本在线视频中文字幕| 成人黄色在线播放| 欧美69视频| 亚洲午夜福利在线观看| 欧美影院一区二区| av毛片在线免费看| 精品日韩美女| 青草国产精品久久久久久| www.毛片com| 日韩精品视频免费在线观看| 免费看av不卡| 伊人久久大香线蕉午夜av| 大桥未久av一区二区三区中文| 精品少妇一区二区三区密爱| 日韩一区二区三区视频| 免费在线国产视频| 欧洲一区二区在线| 国内外成人在线| av网站中文字幕| 久久精品成人一区二区三区| 国产精品高潮呻吟久久久久| 国产精品无码专区av在线播放| 91亚洲国产成人精品一区二三 | 午夜伊人狠狠久久| 国外av在线| 91影视免费在线观看| 亚洲欧美久久久| 日本福利片在线观看| 日韩精品中文字幕视频在线| 激情欧美一区二区三区黑长吊| 日本一区二区三区视频免费看| 国产免费成人| 午夜剧场免费在线观看| 亚洲精品在线视频| 激情不卡一区二区三区视频在线 | 免费日韩av片| 开心激情五月网| 亚洲欧美制服另类日韩| 欧美午夜在线播放|