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

阿里面試官:你說一下Java的TreeMap底層實現(xiàn)原理?

開發(fā) 前端
具有一些以鍵的順序進行范圍查詢的方法,比如firstEntry()、lastEntry()、higherEntry(K key)、 lowerEntry(K key) 等。 可以自定義排序方式,初始化的時候,可以指定是正序、倒序或者自定義排序。

阿里這段時間忙著制定下半年的OKR,其實在制定OKR的時候就能看出團隊里誰是領(lǐng)導(dǎo)的嫡系,誰是團隊的邊角料。嫡系的OKR都是從領(lǐng)導(dǎo)的核心項目分出來的,而其他人的OKR不會體現(xiàn)在領(lǐng)導(dǎo)的OKR里面,只配給嫡系做打下手的工作。

“員工的績效,在制定OKR的時候,已經(jīng)確定了”。

職場失意,摸魚得意。我還是安心的更新《解讀Java源碼專欄》,在這個系列中,我將手把手帶著大家剖析Java核心組件的源碼,內(nèi)容包含集合、線程、線程池、并發(fā)、隊列等,深入了解其背后的設(shè)計思想和實現(xiàn)細(xì)節(jié),輕松應(yīng)對工作面試。 這是解讀Java源碼系列的第六篇,將跟大家一起學(xué)習(xí)Java中比較特殊的數(shù)據(jù)結(jié)構(gòu) - TreeMap。

引言

上篇文章講到LinkedHashMap可以保證元素的插入順序或者訪問順序,而TreeMap也能保證元素順序,不過按照鍵的順序進行排序。插入到TreeMap中的鍵值對,會自動按照鍵的順序進行排序。

簡介

HashMap底層結(jié)構(gòu)是基于數(shù)組實現(xiàn)的,而TreeMap底層結(jié)構(gòu)是基于紅黑樹實現(xiàn)的。TreeMap利用紅黑樹的特性實現(xiàn)對鍵的排序。 額外介紹一下紅黑樹的特性:

  1. 節(jié)點是紅色或者黑色
  2. 根節(jié)點是黑色
  3. 所有葉子節(jié)點是黑色
  4. 每個紅色結(jié)點的兩個子結(jié)點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續(xù)的紅色結(jié)點)
  5. 從任一結(jié)點到其每個葉子的所有路徑都包含相同數(shù)目的黑色結(jié)點。

紅黑樹是基于平衡二叉樹的改進,而平衡二叉樹是為了解決二叉搜索樹在特殊情況下,退化成鏈表,查找、插入效率退化成 O(n),規(guī)定左右子樹高度差不超過1,但是插入、刪除節(jié)點的時候,所做的平衡操作比較復(fù)雜。 而紅黑樹的特性,保證了平衡操作實現(xiàn)相對簡單,樹的高度僅比平衡二叉樹高了一倍,查找、插入、刪除的時間復(fù)雜度是 O(log n)。

圖片圖片

使用示例

利用TreeMap可以自動對鍵進行排序的特性,比較適用一些需要排序的場景,比如排行榜、商品列表等。

Map<Integer, String> map = new TreeMap<>();
map.put(1, "One");
map.put(3, "Three");
map.put(2, "Two");
System.out.println(map); // 輸出:{1=One, 2=Two, 3=Three}

實現(xiàn)一個簡單的熱詞排行榜功能:

/**
 * @author 一燈架構(gòu)
 * @apiNote 熱詞
 **/
public class HotWord {

    /**
     * 熱詞內(nèi)容
     */
    String word;
    /**
     * 熱度
     */
    Integer count;

    public HotWord(String word, Integer count) {
        this.word = word;
        this.count = count;
    }

}
import java.util.Comparator;
import java.util.TreeMap;

/**
 * @author 一燈架構(gòu)
 * @apiNote 熱詞排行榜
 **/
public class Leaderboard {

    /**
     * 自定義排序方式,按照熱度降序排列
     */
    private static final Comparator<HotWord> HOT_WORD_COMPARATOR = new Comparator<HotWord>() {
        @Override
        public int compare(HotWord o1, HotWord o2) {
            return Integer.compare(o2.count, o1.count); // 降序排列
        }
    };

    // 使用TreeMap存儲排行榜數(shù)據(jù),key是熱詞對象,value是熱詞標(biāo)題
    private TreeMap<HotWord, String> rankMap = new TreeMap<>(HOT_WORD_COMPARATOR);

    // 添加成績
    public void addHotWord(String name, int score) {
        rankMap.put(new HotWord(name, score), name);
    }

    /**
     * 打印排行榜
     */
    public void printLeaderboard() {
        System.out.println("熱詞排行榜:");
        int rank = 1;
        for (HotWord hotWord : rankMap.keySet()) {
            System.out.println("#" + rank + " " + hotWord);
            rank++;
        }
    }

    public static void main(String[] args) {
        Leaderboard leaderboard = new Leaderboard();
        leaderboard.addHotWord("閑魚崩了", 90);
        leaderboard.addHotWord("淘寶崩了", 95);
        leaderboard.addHotWord("閑魚崩了", 85);
        leaderboard.addHotWord("釘釘崩了", 80);
        leaderboard.printLeaderboard();
    }

}

輸出結(jié)果:

熱詞排行榜:
#1 HotWord(word=淘寶崩了, count=95)
#2 HotWord(word=閑魚崩了, count=90)
#3 HotWord(word=閑魚崩了, count=85)
#4 HotWord(word=釘釘崩了, count=80)

類屬性

看一下TreeMap的類屬性,包含哪些字段?

public class TreeMap<K, V>
        extends AbstractMap<K, V>
        implements NavigableMap<K, V>, Cloneable, java.io.Serializable {
    /**
     * 排序方式
     */
    private final Comparator<? super K> comparator;

    /**
     * 紅黑樹根節(jié)點
     */
    private transient Entry<K, V> root;

    /**
     * 紅黑樹節(jié)點數(shù)
     */
    private transient int size = 0;

    /**
     * 紅黑樹的紅黑節(jié)點表示
     */
    private static final boolean RED = false;
    private static final boolean BLACK = true;

    /**
     * 紅黑樹節(jié)點對象
     */
    static final class Entry<K, V> implements Map.Entry<K, V> {
        K key;
        V value;
        Entry<K, V> left;
        Entry<K, V> right;
        Entry<K, V> parent;
        boolean color = BLACK;

        /**
         * 構(gòu)造方法
         */
        Entry(K key, V value, Entry<K, V> parent) {
            this.key = key;
            this.value = value;
            this.parent = parent;
        }
    }

}

TreeMap類屬性比較簡單,包含排序方式comparator、紅黑樹根節(jié)點root、節(jié)點個數(shù)size等。自定義了一個紅黑樹節(jié)點類Entry,內(nèi)部屬性包括鍵值對、左右子樹、父節(jié)點、紅黑標(biāo)記值等。

初始化

TreeMap常用的初始化方式有下面三個:

  1. 無參初始化,使用默認(rèn)的排序方式。
  2. 指定排序方式的初始化
  3. 將普通Map轉(zhuǎn)換為TreeMap,使用默認(rèn)的排序方式。
/**
 * 無參初始化
 */
Map<Integer, Integer> map1 = new TreeMap<>();

/**
 * 指定排序方式初始化
 */
Map<Integer, Integer> map2 = new TreeMap<>(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
});

/**
 * 將普通Map轉(zhuǎn)換為TreeMap
 */
Map<Integer, Integer> map3 = new TreeMap<>(new HashMap<>());

再看一下對應(yīng)的源碼實現(xiàn):

/**
 * 無參初始化
 */
public TreeMap() {
    comparator = null;
}

/**
 * 指定排序方式初始化
 */
public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
}

/**
 * 將普通Map轉(zhuǎn)換為TreeMap
 */
public TreeMap(Map<? extends K, ? extends V> m) {
    comparator = null;
    putAll(m);
}

方法列表

由于TreeMap存儲是按照鍵的順序排列的,所以還可以進行范圍查詢,下面舉一些示例。

import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author 一燈架構(gòu)
 * @apiNote TreeMap方法測試
 */
public class TreeMapTest {

    public static void main(String[] args) {
        // 1. 創(chuàng)建一個熱詞排行榜(按熱度倒序),key是熱度,value是熱詞內(nèi)容
        TreeMap<Integer, String> rankMap = new TreeMap<>(Collections.reverseOrder());
        rankMap.put(80, "阿里云崩了");
        rankMap.put(100, "淘寶崩了");
        rankMap.put(90, "釘釘崩了");
        rankMap.put(60, "閑魚崩了");
        rankMap.put(70, "支付寶崩了");

        System.out.println("熱詞排行榜:");
        for (Map.Entry<Integer, String> entry : rankMap.entrySet()) {
            System.out.println("#" + entry.getKey() + " " + entry.getValue());
        }
        System.out.println("-----------");

        // 2. 獲取排行榜的第一個元素
        Map.Entry<Integer, String> firstEntry = rankMap.firstEntry();
        System.out.println("firstEntry: " + firstEntry);

        // 3. 獲取排行榜的最后一個元素
        Map.Entry<Integer, String> lastEntry = rankMap.lastEntry();
        System.out.println("lastEntry: " + lastEntry);

        // 4. 獲取排行榜的大于指定鍵的最小元素(由于是倒序排列,所以結(jié)果是反的)
        Map.Entry<Integer, String> higherEntry = rankMap.higherEntry(70);
        System.out.println("higherEntry: " + higherEntry);

        // 5. 獲取排行榜的小于指定鍵的最大元素
        Map.Entry<Integer, String> lowerEntry = rankMap.lowerEntry(70);
        System.out.println("lowerEntry: " + lowerEntry);

        // 6. 獲取排行榜的大于等于指定鍵的最小元素
        Map.Entry<Integer, String> ceilingEntry = rankMap.ceilingEntry(70);
        System.out.println("ceilingEntry: " + ceilingEntry);

        // 7. 獲取排行榜的小于等于指定鍵的最大元素
        Map.Entry<Integer, String> floorEntry = rankMap.floorEntry(70);
        System.out.println("floorEntry: " + floorEntry);
    }

}

輸出結(jié)果:

熱詞排行榜:
#100 淘寶崩了
#90 釘釘崩了
#80 阿里云崩了
#70 支付寶崩了
#60 閑魚崩了
-----------
firstEntry: 100=淘寶崩了
lastEntry: 60=閑魚崩了
higherEntry: 60=閑魚崩了
lowerEntry: 80=阿里云崩了
ceilingEntry: 70=支付寶崩了
floorEntry: 70=支付寶崩了

其他方法的還包括:

作用

方法簽名

獲取第一個鍵

K firstKey()

獲取最后一個鍵

K lastKey()

獲取大于指定鍵的最小鍵

K higherKey(K key)

獲取小于指定鍵的最大鍵

K lowerKey(K key)

獲取大于等于指定鍵的最小鍵

K ceilingKey(K key)

獲取小于等于指定鍵的最大鍵

K floorKey(K key)

獲取第一個鍵值對

Map.Entry<K,V> firstEntry()

獲取最后一個鍵值對

Map.Entry<K,V> lastEntry()

獲取并刪除第一個鍵值對

Map.Entry<K,V> pollFirstEntry()

獲取并刪除最后一個鍵值對

Map.Entry<K,V> pollLastEntry()

獲取大于指定鍵的最小鍵值對

Map.Entry<K,V> higherEntry(K key)

獲取小于指定鍵的最大鍵值對

Map.Entry<K,V> lowerEntry(K key)

獲取大于等于指定鍵的最小鍵值對

Map.Entry<K,V> ceilingEntry(K key)

獲取小于等于指定鍵的最大鍵值對

Map.Entry<K,V> floorEntry(K key)

獲取子map,左閉右開

SortedMap<K,V> subMap(K fromKey, K toKey)

獲取前幾個子map,不包含指定鍵

SortedMap<K,V> headMap(K toKey)

獲取前幾個子map

NavigableMap<K,V> headMap(K toKey, boolean inclusive)

獲取后幾個子map,不包含指定鍵

SortedMap<K,V> tailMap(K fromKey)

獲取后幾個子map

NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)

獲取其中一段子map

NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey,   boolean toInclusive)

put源碼

再看一下TreeMap的put源碼:

/**
 * put源碼入口
 */
public V put(K key, V value) {
    Entry<K,V> t = root;
    // 1. 如果根節(jié)點為空,則創(chuàng)建根節(jié)點
    if (t == null) {
        compare(key, key);
        root = new Entry<>(key, value, null);
        size = 1;
        modCount++;
        return null;
    }
    int cmp;
    Entry<K,V> parent;
    // 2. 判斷是否傳入了排序方式,如果沒有則使用默認(rèn)
    Comparator<? super K> cpr = comparator;
    if (cpr != null) {
        // 3. 如果傳入了排序方式,使用do-while循環(huán),找到目標(biāo)值所在位置,并賦值
        do {
            parent = t;
            cmp = cpr.compare(key, t.key);
            // 4. 利用紅黑樹節(jié)點左小右大的特性,進行查找
            if (cmp < 0) {
                t = t.left;
            } else if (cmp > 0) {
                t = t.right;
            } else {
                return t.setValue(value);
            }
        } while (t != null);
    } else {
        // 5. TreeMap不允許key為null
        if (key == null) {
            throw new NullPointerException();
        }
        // 6. 如果沒有傳入排序方式,則使用Comparable進行比較
        Comparable<? super K> k = (Comparable<? super K>) key;
        // 7. 跟上面一致,使用do-while循環(huán),利用紅黑樹節(jié)點左小右大的特性,查找目標(biāo)值所在位置,并賦值
        do {
            parent = t;
            cmp = k.compareTo(t.key);
            if (cmp < 0) {
                t = t.left;
            } else if (cmp > 0) {
                t = t.right;
            } else {
                return t.setValue(value);
            }
        } while (t != null);
    }
    // 8. 如果沒有找到,則創(chuàng)建新節(jié)點
    Entry<K,V> e = new Entry<>(key, value, parent);
    if (cmp < 0) {
        parent.left = e;
    } else {
        parent.right = e;
    }
    // 9. 插入新節(jié)點后,需要調(diào)整紅黑樹節(jié)點位置,保持紅黑樹的特性
    fixAfterInsertion(e);
    size++;
    modCount++;
    return null;
}

put源碼邏輯比較簡單:

  1. 判斷紅黑樹根節(jié)點是否為空,如果為空,則創(chuàng)建根節(jié)點。
  2. 判斷是否傳入了排序方式,如果沒有則使用默認(rèn),否則使用自定義排序。
  3. 循環(huán)遍歷紅黑樹,利用紅黑樹節(jié)點左小右大的特性,進行查找。
  4. 如果找到,就覆蓋。如果沒找到,就插入新節(jié)點。
  5. 插入新節(jié)點后,調(diào)整紅黑樹節(jié)點位置,保持紅黑樹的特性。

get源碼

再看一下get源碼:

/**
 * get源碼入口
 */
public V get(Object key) {
    // 調(diào)用查找節(jié)點的方法
    Entry<K, V> p = getEntry(key);
    return (p == null ? null : p.value);
}

/**
 * 查找節(jié)點方法
 */
final Entry<K, V> getEntry(Object key) {
    // 1. 判斷如果傳入了排序方式,則使用排序方式查找節(jié)點
    if (comparator != null) {
        return getEntryUsingComparator(key);
    }
    if (key == null) {
        throw new NullPointerException();
    }
    // 2. 否則使用默認(rèn)方式查找
    Comparable<? super K> k = (Comparable<? super K>) key;
    Entry<K, V> p = root;
    // 3. 利用紅黑樹節(jié)點左小右大的特性,循環(huán)查找
    while (p != null) {
        int cmp = k.compareTo(p.key);
        if (cmp < 0) {
            p = p.left;
        } else if (cmp > 0) {
            p = p.right;
        } else {
            return p;
        }
    }
    return null;
}

/**
 * 使用傳入的排序方式,查找節(jié)點方法
 */
final Entry<K, V> getEntryUsingComparator(Object key) {
    K k = (K) key;
    Comparator<? super K> cpr = comparator;
    if (cpr != null) {
        Entry<K, V> p = root;
        // 3. 跟上面類似,利用紅黑樹節(jié)點左小右大的特性,循環(huán)查找
        while (p != null) {
            int cmp = cpr.compare(k, p.key);
            if (cmp < 0) {
                p = p.left;
            } else if (cmp > 0) {
                p = p.right;
            } else {
                return p;
            }
        }
    }
    return null;
}

get方法源碼與put方法邏輯類似,都是利用紅黑樹的特性遍歷紅黑樹。

總結(jié)

TreeMap是一種有序Map集合,具有以下特性:

  1. 保證以鍵的順序進行排列
  2. 具有一些以鍵的順序進行范圍查詢的方法,比如firstEntry()、lastEntry()、higherEntry(K key)、 lowerEntry(K key) 等。
  3. 可以自定義排序方式,初始化的時候,可以指定是正序、倒序或者自定義排序。
  4. 不允許key為null,因為null值無法比較大小。
  5. 底層基于紅黑樹實現(xiàn),查找、插入、刪除的時間復(fù)雜度是O(log n),而HashMap的時間復(fù)雜度是O(1)。

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

2024-01-29 10:08:11

零拷貝Zero-copyCPU 拷貝

2024-02-27 15:23:48

RedLock算法Redis

2023-12-29 13:45:00

2024-02-21 16:42:00

2020-07-30 07:58:36

加密算法

2022-06-07 12:03:33

Java內(nèi)存模型

2023-09-12 14:56:13

MyBatis緩存機制

2021-07-28 10:08:19

類加載代碼塊面試

2021-06-02 11:25:18

線程池Java代碼

2022-06-06 15:33:20

線程Java釋放鎖

2023-02-18 13:34:14

Nacos健康檢查機制

2025-03-10 07:05:07

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-08-29 16:30:27

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫連接

2023-02-08 08:32:41

輪詢鎖

2023-01-30 15:39:40

GETHTTP

2021-09-27 07:11:18

MySQLACID特性

2021-11-27 08:13:13

Final 面試

2025-04-08 00:00:00

@AsyncSpring異步
點贊
收藏

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

成人免费淫片视频软件| www日韩欧美| 欧美亚洲另类色图| 91精品大全| 国产精品一区二区三区乱码| 97视频免费在线观看| 亚洲精品一区二区三区影院忠贞| 激情久久一区二区| 亚洲一区二区三区四区五区黄| 久久精品中文字幕一区二区三区| 中文字幕精品在线观看| 亚洲视频福利| 色婷婷综合成人| 手机在线成人av| 成人一区视频| 亚洲国产精品久久久久秋霞影院 | 无码人妻丰满熟妇区96| 1区2区3区在线观看| 成人a免费在线看| 国产欧美久久一区二区| 伊人365影院| 围产精品久久久久久久| 亚洲精品国产精品久久清纯直播 | 911精品国产| 欧美视频一区在线| 国产特级淫片高清视频| 在线观看三级视频| 中文字幕av在线一区二区三区| 国产一区二区不卡视频| 国产高潮流白浆喷水视频| 模特精品在线| 97精品久久久| 免费在线一级片| 国产精品99在线观看| 一区二区三欧美| 中文字幕5566| 欧美影院天天5g天天爽| 精品国产自在久精品国产| 最新天堂在线视频| 欧美日韩在线精品一区二区三区激情综合| 午夜婷婷国产麻豆精品| 成人短视频在线观看免费| 麻豆传媒在线观看| 国产精品久久久一本精品| 欧美一区二区三区电影在线观看| 深夜福利视频一区| 99精品视频中文字幕| 国产伦精品一区二区三区高清版| 成人黄色在线观看视频| 国产精品影音先锋| 97se视频在线观看| 精品久久久久中文慕人妻| 狠狠色丁香久久婷婷综合丁香| 国产精品自拍小视频| 欧美日韩a v| 青青草精品视频| 日本精品久久久久久久| 无码人妻精品一区二区三区不卡| 久久不射2019中文字幕| 国产999在线| 午夜视频网站在线观看| 欧美aaa在线| 91九色视频在线| www.四虎在线观看| 豆国产96在线|亚洲| 国产日韩精品推荐| 青青视频在线观| 欧美—级在线免费片| 日韩成人av网站| 永久免费av在线| 亚洲美女精品一区| 国内精品视频一区二区三区| 亚洲优女在线| 在线观看欧美日本| 免费在线观看污网站| 一区二区三区四区视频免费观看| 精品国产三级a在线观看| 一区二区三区免费在线观看视频| 深爱激情综合| 久久久精品在线| 日本一二三区视频| 久久精品午夜| 成人女保姆的销魂服务| 狠狠综合久久av一区二区| 91麻豆精东视频| 亚洲国产一区二区精品视频 | 美国黄色一级视频| 日韩中出av| 色偷偷噜噜噜亚洲男人的天堂| 天天看天天摸天天操| 日韩视频一区二区三区在线播放免费观看| 51久久精品夜色国产麻豆| 69亚洲精品久久久蜜桃小说| 国产一区二区三区国产| 久久久婷婷一区二区三区不卡| 成人在线观看黄色| 亚洲黄一区二区三区| 日韩av资源在线| 美女精品久久| 亚洲欧美国产一区二区三区| 看免费黄色录像| 羞羞答答国产精品www一本| 成人女保姆的销魂服务| 欧美在线观看在线观看| 亚洲最新视频在线播放| 国产视频一区二区三区在线播放| 亚洲五码在线| 在线观看欧美日韩| 日韩污视频在线观看| 免费的国产精品| 精品国产乱码久久久久久郑州公司 | 一本色道久久综合狠狠躁篇的优点 | 中国1级黄色片| 99精品国产在热久久婷婷| 成人午夜激情免费视频| 丁香婷婷在线| 第一福利永久视频精品| 欧美xxxx日本和非洲| 日本一本不卡| 国产成人福利网站| 欧美在线 | 亚洲| 亚洲伦理在线精品| 粉色视频免费看| 奇米狠狠一区二区三区| 午夜精品久久17c| av综合在线观看| 国产精品视频一二三区| 欧美精品色婷婷五月综合| 国产精品18hdxxxⅹ在线| 美女av一区二区三区 | 欧美xx视频| 亚洲国语精品自产拍在线观看| 日本妇女毛茸茸| 国产一区二区三区香蕉| 亚洲乱码一区二区三区三上悠亚| 国产成人精品亚洲日本在线观看| 国产手机视频精品| 久久不卡免费视频| 成人免费视频一区二区| 日韩精品一区二区免费| 日韩在线视频一区二区三区 | 免费高潮视频95在线观看网站| 欧美大胆人体bbbb| 免费看一级一片| 国产精品996| 国产精品三级一区二区| 一区二区三区四区精品视频| 欧美国产亚洲精品久久久8v| а√中文在线资源库| 一个色在线综合| 日本少妇xxxx软件| 极品尤物久久久av免费看| 国产精品久久九九| 国产免费拔擦拔擦8x在线播放| 亚洲国产精品久久久久| 欧美一级视频免费观看| 久久综合999| 亚洲不卡视频在线| 91亚洲人成网污www| 91精品免费视频| 丁香花视频在线观看| 亚洲国产日韩欧美在线图片| 久久久免费高清视频| 久久精品人人做人人爽人人| 久草福利视频在线| 欧美精品一区二区三区精品| 成人淫片在线看| 日本性爱视频在线观看| 亚洲精品久久久久| 国产免费a视频| 日韩美女视频一区二区 | 欧美激情在线观看| 天堂中文资源在线观看| 色欧美片视频在线观看在线视频| 美国精品一区二区| 国产不卡免费视频| 久久久一本二本三本| 欧美三级伦理在线| 5g影院天天爽成人免费下载| 末成年女av片一区二区下载| 中文字幕日韩av电影| 国产露脸91国语对白| 亚洲h动漫在线| 亚洲第一综合网| 国产福利91精品一区二区三区| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 久久婷婷国产综合国色天香| 污版视频在线观看| 亚洲天堂偷拍| 亚洲精品中文字幕在线| 精品综合久久88少妇激情| 国产精品日韩在线| gogo久久| 伊人av综合网| 欧美性猛交 xxxx| 欧美无人高清视频在线观看| 国产福利久久久| 欧美激情在线一区二区三区| av电影中文字幕| 欧美一级专区| 国产爆乳无码一区二区麻豆| 精品久久网站| 精品国产综合久久| 国产精品一区三区在线观看| 热久久这里只有| 色婷婷av在线| 日韩一二三在线视频播| 日本又骚又刺激的视频在线观看| 在线播放一区二区三区| 亚洲熟妇无码乱子av电影| 亚洲一区二区视频在线| 四虎影视一区二区| 91蝌蚪porny成人天涯| 精品伦一区二区三区| 精品亚洲国产成人av制服丝袜| 亚洲色欲综合一区二区三区| 国产尤物精品| 中文字幕第50页| 成人激情在线| 欧美一区二区三区成人久久片| 美女av一区| 国产精品.com| 日韩中文字幕一区二区高清99| 国产精品丝袜一区二区三区| 成人av免费电影网站| 97国产精品人人爽人人做| 免费网站在线观看人| 久久久www成人免费精品| 91在线观看| 亚洲欧美在线看| 青青国产在线| 日韩精品小视频| 日本韩国在线观看| 精品成人佐山爱一区二区| 精品国产无码一区二区三区| 欧美一区二区三级| 国产精品热久久| 欧美伦理视频网站| 一区二区视频网| 欧美三级电影网| 国产精品午夜一区二区| 91福利精品视频| 国产乱码77777777| 欧美亚洲一区二区在线观看| 波多野结衣av无码| 欧美自拍丝袜亚洲| 中文字幕一二三四| 欧美日韩在线播放一区| 夜夜狠狠擅视频| 欧美二区在线观看| 精品人妻伦一二三区久久| 日韩欧美电影一区| 殴美一级特黄aaaaaa| 日韩成人在线网站| 日韩二区三区| 一区二区三区精品99久久| 国产乱子伦三级在线播放| 国产亚洲xxx| 欧美成人精品一区二区男人看| 久久久999成人| 免费网站在线观看人| 91爱视频在线| 日本精品另类| 亚洲综合在线中文字幕| 国产精品一区二区三区美女| 久久99精品久久久久子伦| 亚洲动漫精品| 亚洲永久激情精品| 欧美日韩第一区| 日韩欧美一区二| 免费黄网站欧美| 91精产国品一二三| 99精品偷自拍| 男女男精品视频网站| 一二三四区精品视频| 精品美女久久久久| 欧美日韩高清在线| 亚洲老妇色熟女老太| 亚洲欧美激情在线视频| 拍真实国产伦偷精品| 久久久视频精品| 免费成人美女女| 亚洲一区二区三区香蕉| 日本三级久久| 国产美女视频免费| 亚洲在线黄色| 国产高清999| 91老师片黄在线观看| 日韩福利小视频| 欧美视频一二三| 国产www免费观看| 亚洲天堂av电影| 久久亚洲资源| 国产精品无av码在线观看| 东京久久高清| 亚洲制服欧美久久| 国产欧美日韩综合一区在线播放 | 欧美人成在线观看ccc36| 亚洲欧美电影在线观看| 99精品国产在热久久下载| 拔插拔插华人永久免费| 26uuu亚洲| 久久久久亚洲av片无码下载蜜桃| 91国产免费看| 先锋av资源站| 久久99精品久久久久久青青91| 成人做爰视频www| 国内一区在线| 欧美日韩国产精品一区二区亚洲| 99视频精品免费| 成人成人成人在线视频| 日本中文在线视频| 欧美性xxxxxx少妇| 香港一级纯黄大片| 久久免费精品视频| 久久伊人精品| 中文字幕中文字幕在线中心一区 | 黄色录像a级片| 伊人婷婷欧美激情| 在线免费a视频| 国产一区二区三区视频免费| 大菠萝精品导航| 国产成人成网站在线播放青青| 国产精品久久久久久| 久热精品在线播放| 国产婷婷色一区二区三区四区| 男人的天堂一区二区| 精品欧美一区二区三区精品久久| 国产精品剧情| 91免费国产网站| 午夜影院欧美| 污污网站在线观看视频| 国产精品―色哟哟| 久久这里只有精品9| 亚洲香蕉成视频在线观看| 麻豆蜜桃在线观看| 国产一区二区视频在线免费观看| 国产精品sm| 国产精品无码自拍| 亚洲午夜精品17c| 亚洲毛片欧洲毛片国产一品色| 久国内精品在线| jizz久久精品永久免费| 拔插拔插海外华人免费| 成人精品亚洲人成在线| 国产午夜久久久| 亚洲国产精品久久久| 午夜伦理福利在线| 欧美日韩在线不卡一区| 久久午夜视频| 国产欧美一区二区三区在线观看视频| 欧美午夜精品久久久| 香蕉视频网站在线观看| 成人免费自拍视频| 欧美日韩福利| 亚洲欧美色图视频| 91成人网在线| 日韩伦理在线观看| 亚洲自拍高清视频网站| 国内在线观看一区二区三区| 亚洲天堂美女视频| 色婷婷综合久久久久中文| 成人免费在线电影| 91在线色戒在线| 亚洲经典视频在线观看| 国内精品久久99人妻无码| 欧洲精品一区二区| www在线免费观看视频| 国产精品12| 日韩高清在线不卡| 秋霞欧美一区二区三区视频免费| 欧美sm极限捆绑bd| 亚洲精品一区| 一区二区三区不卡在线| 懂色av一区二区夜夜嗨| 中文字幕av影院| 久久精品国产综合| 久草精品视频| 国产福利在线免费| 亚洲一区二区美女| av中文在线| 成人资源视频网站免费| 日韩1区2区日韩1区2区| 国产精品99久久久久久成人| 欧美精品一区二区三区视频| 亚洲a∨精品一区二区三区导航| 中文字幕免费高| 91在线免费播放| 国产精品久久久午夜夜伦鲁鲁| 97人人做人人爱| 天天操夜夜操国产精品| 久久国产精品无码一级毛片| 欧美日韩一区二区电影| 成人影院在线视频| 四虎免费在线观看视频| 久久久久久久久久久黄色| 成人黄色在线观看视频| 国产精品久久久久999| 亚洲视频日本| 国产喷水在线观看|