日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA进阶教学之(集合)

發(fā)布時間:2024/7/23 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA进阶教学之(集合) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1、集合概述

2、集合存儲的數據類型

3、不同的集合,底層都會對應不同的數據結構

4、集合繼承結構圖(部分接口和類)

5、Collection接口中常用的方法

6、Collection 集合迭代(遍歷)

7、Collection的contains( )方法理解

8、集合中元素的刪除

9、List接口特有的方法

10、ArrayList集合初始化容量及擴容

11、LinkedList雙向列表源碼分析

12、Vector安全數組

13、HashSet集合特點

14、TreeSet集合特點

15、Map接口常用方法

16、HashMap集合

17、HashMap和HashTable的區(qū)別

18、屬性類Properties

19、TreeSet可排序集合


?

1、集合概述

什么是集合,有什么用?

數組其實就是一個集合,集合實際上就是一個容器,集合可以容納引用類型的數據

?

為什么集合在開發(fā)中使用較多?

集合是一個容器,一次可以容納多個對象(集合的大小和機器的性能有關,理論無限大)

在實際開發(fā)中,假設網頁內容連接的是數據庫,數據庫中有10條記錄

假設需要把這10條記錄查詢出來,在java程序中會將這10條數據封裝

成10個java對象,然后將10個java對象放到一個集合中,將集合傳遞

給前端,然后遍歷集合,將一個數據一個數據展現出來

?

?

2、集合存儲的數據類型

集合中存儲的都是java對象的內存地址,或者說集合中存儲的是引用,不能直接存儲java對象

?

疑問?為什么list.add(100); 這個集合里面的100是什么數據類型

答案:100,是自動裝箱的100,將int型自動裝箱成為Integer型的包裝型

底層原理:Integer x = new Integer(100);? 然后 list.add(x);? x 表示的是內存地址

?

集合之間通過內存地址的存儲可以嵌套

?

?

3、不同的集合,底層都會對應不同的數據結構

什么是數據結構:

數據結構就是數據進行存儲時,存儲的方式,例如:數組、二叉樹、鏈表、哈希表

使用不同的集合等同于使用了不同的數據結構

java已經將數據結構實現了,已經寫好了這些常用的集合類,只需要掌握怎么使用集合,什么情況用哪種類型的集合

new ArrayList(); 創(chuàng)建一個集合,底層是數組

new LinkedList(); 創(chuàng)建一個集合,底層是鏈表

new TreeSet();創(chuàng)建一個集合對象,底層是二叉樹

?

集合在哪個包下:

java.util.*

?

?

4、集合繼承結構圖(部分接口和類)

在java中集合分成兩大類

第一種類型:單個方式存儲元素(超級父接口:java.util.Collection)

?

?

集合的接口之間的繼承結構圖:

Collection接口調用父類接口Iterable的iterator()方法,拿到集合依賴的迭代器對象

Itertor itertor = "Collection 對象".iterator();? ? ? ?itertor 是迭代器對象

?

?

總結:

  • ArrayList:底層是數組
  • LinkedList:底層是雙向鏈表
  • Vector:底層是線程安全的數組,效率低
  • HashSet:底層是HashMap,放到HashSet集合中的元素等同于放到HashMap集合中的key部分
  • TreeSet:底層是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap集合中的Key部分

可以多次看加強記憶

?

?

補充:

?

?

?

?

?

第二種類型:鍵值對方式存儲元素(超級父接口:java.util.Map)

?

總結:

  • HashMap:底層是哈希表
  • Hashtable:底層是線程安全的哈希表,效率低
  • Properties:線程安全的屬性類,并且key和value只能存儲字符串String
  • TreeMap:底層是二叉樹,TreeMap 集合的Key 可以按照大小順序排序

?

?

總結:

  • List集合存儲元素的特點:

元素有序可重復:存進去和取出來的順序相同,元素有下標,存進去1,還可以存1

  • Set(對應的是Map)集合存儲元素的特點:

元素無序不可重復:存進去和取出來的順序不一定相同,元素無下標,存進去1,不可繼續(xù)存1

  • SortSet(對應的是SortedMap)集合存儲元素的特點:

元素無序不可重復可排序:01同上,可排序是指可以按照大小進行排序

?

?

關鍵點:

Map集合的key,就是一個Set集合

往Set集合中放數據,實際上放到了Map集合的Key部分

?

理解點:

怎么往集合這個容器里面放東西,怎么取出來的這個過程需要理解

?

?

?

5、Collection接口中常用的方法

?

提問:Collection中能存放什么元素

  • 在沒有使用“泛型”之前,Collection中可以存儲Object的所有子類型
  • 使用了“泛型”之后,Collection中只能存儲某個具體的類型
  • 集合后期我們會學習“泛型”,目前先不用管,我們只需要知道Collection中什么都能存,只要是Object的子類型就行

?

注意:集合中不能直接存儲基本數據類型,也不能存儲java對象,只能存儲java對象的內存地址

?

Collection中常用的方法

? ? 1、boolean add(Object e) 向集合尾部中添加元素,把元素的內存地址添加進集合

代碼演示:
?

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection;public class CollectionTest01 {public static void main(String[] args) {//創(chuàng)建一個集合對象,由于接口是抽象的,無法實例化//多態(tài) 父類對象的引用指向子類對象Collection collection=new ArrayList();//測試集合中可以放置的是不是內存地址//自動裝箱,Integer x = new Integer(100); collection.add(x),x是內存地址collection.add(100);collection.add(3.14);collection.add(new Object());collection.add(new Student());} } class Student{}

?

?

? 2、int size(?)? ?獲取集合中元素的個數,!注意,并不是獲取集合中的容量

代碼演示:

?

?

?

? ?3、void? clear( ) 清空集合中的元素

代碼演示:

?

?

?

? ?4、boolean remove(Object o) 刪除集合中指定元素

代碼演示:

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection;public class CollectionTest01 {public static void main(String[] args) {//創(chuàng)建一個集合對象,由于接口是抽象的,無法實例化//多態(tài) 父類對象的引用指向子類對象Collection collection=new ArrayList();//測試集合中可以放置的是不是內存地址//自動裝箱,Integer x = new Integer(100); collection.add(x),x是內存地址collection.add(100);collection.add(3.14);collection.add(new Object());collection.add(new Student());collection.remove(100);System.out.println(collection.size());//3} } class Student{}

?

? ?5、boolean contains(Object o)? 判斷集合中是否包含元素o

代碼演示:

?

?

?

? ?6、boolean isEmpty( ) 判斷該集合中元素個數是否為0

代碼演示:

?

?

? ?7、Object[ ] toArray( )? ?調用這個方法可以把集合轉換成數組

?代碼演示:

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection;public class CollectionTest01 {public static void main(String[] args) {//創(chuàng)建一個集合對象,由于接口是抽象的,無法實例化//多態(tài) 父類對象的引用指向子類對象Collection collection=new ArrayList();//測試集合中可以放置的是不是內存地址//自動裝箱,Integer x = new Integer(100); collection.add(x),x是內存地址collection.add(100);collection.add(3.14);collection.add(new Object());collection.add(new Student());Object[] objects=collection.toArray();//遍歷數組for (int i = 0; i <objects.length; i++) {System.out.println(objects[i]);} //結果: //100 //3.14 //java.lang.Object@1540e19d //com.lbj.javase.collection.Student@677327b6} } class Student{}

?

?

6、Collection 集合迭代(遍歷)

迭代:就是遍歷,不要將迭代兩個字想的太難,因為集合不是數組,沒有固定長度,無法通過For循環(huán)遍歷集合

底層:需要用到Collection繼承父類Iterable接口的 iterator( ) 方法,然后再在Collection中調用?iterator( ) 方法返回一個Iterator迭代器對象。

此迭代器對象可以使用其中的兩個方法

一個方法是boolean hasNext() ,表示如果下一個元素存在,則返回true,有點類似指針;

一方法是Object next( ) 返回迭代的下一個元素,且取出來的元素類型都是Object類。?

代碼演示:

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.collection* @date 2021/3/28 18:40* @Copyright 公司*/ public class CollectionTest02 {public static void main(String[] args) {//創(chuàng)建集合對象Collection collection=new ArrayList();//添加集合元素collection.add("abc");collection.add(100);collection.add(new Object());//集合遍歷//第一步:獲取集合對象的迭代器對象Iterator iterator=collection.iterator();//第二步:開始遍歷while(iterator.hasNext()){//不管存進去的是什么,拿出來的時候一律都是Object類Object o=iterator.next();System.out.println(o);}}}//結果: //abc //100 //java.lang.Object@1540e19d

圖示:

圖示2:

注意:以上的遍歷方式,是所有Collection通用的一種方式(除了Map集合不可以用!!!

?

?

代碼演示2:

ArrayList集合,有序可重復

HashSet集合,無序不可重復

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.collection* @date 2021/3/28 19:51* @Copyright 公司*/ public class CollectionTest03 {public static void main(String[] args) {//創(chuàng)建ArrayList集合空間:有序可重復Collection collection = new ArrayList();//集合中添加元素collection.add(1);collection.add(2);collection.add(1);collection.add(3);//調用迭代器Iterator iterator=collection.iterator();//測試ArrayList集合元素中是否有序可重復while (iterator.hasNext()){Object o=iterator.next();if(o instanceof Integer){System.out.println("o是屬于整數類型");}//輸出的時候都會轉換成字符串,因為這里println默認調用toString方法System.out.println(o.toString());}System.out.println("分割線---------------------------------------------");//創(chuàng)建HashSet集合空間Collection collection1=new HashSet();//添加元素入集合collection1.add(1);collection1.add(1);collection1.add(3);collection1.add(3);collection1.add(2);collection1.add(5);collection1.add(5);//調用迭代器Iterator iterator1=collection1.iterator();//測試HashSet是否無序不可重復while(iterator1.hasNext()){Object o=iterator1.next();System.out.println(o);}} }

測試結果:

o是屬于整數類型
1
o是屬于整數類型
2
o是屬于整數類型
1
o是屬于整數類型
3
分割線---------------------------------------------
1
2
3
5

?

?

迭代器容易犯的錯誤:

代碼演示3(迭代器不能自動刷新):

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class CollectionTest06 {public static void main(String[] args) {//創(chuàng)建集合對象Collection collection=new ArrayList();//集合中添加元素collection.add("100");collection.add(100);collection.add(new Object());//創(chuàng)建迭代器Iterator iterator=collection.iterator();//遍歷集合元素while (iterator.hasNext()){Object o=iterator.next();System.out.println(o);}}}

?

代碼演示4(改變迭代器的位置后):

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class CollectionTest06 {public static void main(String[] args) {//創(chuàng)建集合對象Collection collection=new ArrayList();//創(chuàng)建迭代器//此時獲取的迭代器,指向的是那集合中沒有元素狀態(tài)下的迭代器//一定要注意:集合結構一旦發(fā)生改變,迭代器必須重新獲取Iterator iterator=collection.iterator();//集合中添加元素collection.add("100");collection.add(100);collection.add(new Object());//遍歷集合元素while (iterator.hasNext()){Object o=iterator.next();System.out.println(o);}}}

結果:
Exception in thread "main" java.util.ConcurrentModificationException
?? ?at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
?? ?at java.util.ArrayList$Itr.next(ArrayList.java:859)
?? ?at com.lbj.javase.collection.CollectionTest06.main(CollectionTest06.java:30)

?

7、Collection的contains( )方法理解

語法:bollean contains(Object o) 判斷集合中是否存在某個元素,底層調用了equals方法比較

結論:存放一個集合中的類型,一定要重寫equals方法

代碼演示:

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection;public class CollectionTest04 {public static void main(String[] args) {//創(chuàng)建集合對象Collection collection=new ArrayList();//向集合中添加元素String s=new String("abc");collection.add(s);String s1=new String("def");collection.add(s1);System.out.println("集合中元素個數為"+collection.size());//2//新建的對象StringString x=new String("abc");//判斷:集合內有沒有元素x的內容的存在System.out.println(collection.contains(x));//true//底層System.out.println(s.equals(x));//true} }

JVM示意圖:

?

代碼演示2(當類中沒有重寫equals方法時):

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection;/*** @author LBJ* @version V1.0* @Package com.lbj.javase.collection* @date 2021/3/31 20:46* @Copyright 公司*/ public class CollectionTest05 {public static void main(String[] args) {//創(chuàng)建集合對象Collection collection=new ArrayList();//創(chuàng)建用戶對象User user=new User("aaa");User user1=new User("aaa");//加入集合collection.add(user);//問:此時集合中有沒有包含user1的內容//原因:User類中沒有重寫equals方法,因此contains調用的是Object中的equals方法System.out.println(collection.contains(user1));//false//底層System.out.println(user.equals(user1));//false} } class User{public String name;public User() {}public User(String name) {this.name = name;} }

同理可得:

boolean remove(Object o) 從集合中移除某個元素的內容,底層調用equals方法

?

?

?

8、集合中元素的刪除

引言:

集合中的元素直接刪除意味著集合的結構發(fā)生改變

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class CollectionTest07 {public static void main(String[] args) {//創(chuàng)建集合對象Collection collection=new ArrayList();//添加元素進入集合collection.add("aaa");collection.add(100);collection.add(new Object());//獲取迭代器Iterator iterator=collection.iterator();//遍歷輸出集合while(iterator.hasNext()){Object o=iterator.next();//刪除元素//刪除元素后,集合的結構發(fā)生變化,應該重新去獲取迭代器//但是,循環(huán)下一次的時候并沒有重新獲取迭代器,所以會出現異常:Exception in thread "main" java.util.ConcurrentModificationExceptioncollection.remove(o);//輸出System.out.println(o);}} }

?

?

規(guī)律:

Iterator it=c.iterator(); 獲取迭代器對象,迭代器用來遍歷集合,此時相當于對當前集合的狀態(tài)拍了一個快照,迭代器迭代的時候會不斷比對快照和原來集合是否相等,如果不相等,則報異常

?

迭代器的remove()方法(用迭代器的快照進行元素的刪除,則不會出現異常):

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class CollectionTest07 {public static void main(String[] args) {//創(chuàng)建集合對象Collection collection=new ArrayList();//添加元素進入集合collection.add("aaa");collection.add(100);collection.add(new Object());//獲取迭代器Iterator iterator=collection.iterator();//遍歷輸出集合while(iterator.hasNext()){Object o=iterator.next();//迭代器的快照刪除iterator.remove();//輸出System.out.println(o);}System.out.println(collection.size());} }aaa 100 java.lang.Object@1540e19d 0

?

JVM示意圖:

?

結論:

一:用“集合對象.remove(obj)”直接刪除元素的時候,沒有通知迭代器(導致迭代器的快照和原集合狀態(tài)不同),系統報異常

二:用“迭代器對象.remove()”迭代器刪除元素的時候,告訴迭代器從快照刪除元素,會自動更新迭代器,自動更新集合,系統不報錯

三:集合狀態(tài)發(fā)生改變時,要重新獲取迭代器

四:在迭代元素的過程中,一定要使用迭代器Iterator的remove方法,刪除元素

?

?

?

9、List接口特有的方法

引言:List集合存儲元素的特點:

有序(List集合元素有下標)

可重復(可以重復存儲相同數據)

?

1、void?add(int index,Object element)??在列表的指定位置插入指定元素,使用不多,效率低

代碼演示:

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Iterator; import java.util.List;public class ListTest01 {public static void main(String[] args) {//創(chuàng)建集合對象List list=new ArrayList();//添加元素list.add("a");//默認都是向集合的末尾添加元素list.add("b");list.add("c");//添加元素:List接口獨有的//發(fā)現添加的元素在下標為1的位置上,且原來的元素需要向后list.add(1,"e");//引入迭代器iIterator iterator=list.iterator();//遍歷while (iterator.hasNext()){Object o =iterator.next();System.out.println(o);}} } 結果:a e b c

?

?

2、Object set(int index,Object element) 修改指定下標的元素

代碼演示:

?

?

3、Object get(int index)? 根據下標獲取元素,因此有特有的遍歷方式

代碼演示:
?

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Iterator; import java.util.List;public class ListTest01 {public static void main(String[] args) {//創(chuàng)建集合對象List list=new ArrayList();//添加元素list.add("a");//默認都是向集合的末尾添加元素list.add("b");list.add("c");//根據下標獲取元素Object o1=list.get(0);System.out.println(o1);//根據list集合的特性//可以用數組進行遍歷for (int i = 0; i <list.size(); i++) {Object o2 =list.get(i);System.out.println(o2);}} } a a b c

?

?

4、int indexOf(Object o)? 獲取元素的下標? int lastIndexOf(Object o) 獲取最后出現此元素的下標【因為List集合中的元素可以重復】

代碼演示:

?

?

5、Object remove(int index)? 刪除指定下標的元素

代碼演示:

?

?

?

10、ArrayList集合初始化容量及擴容

引言:

1、ArrayList集合初始化容量是10【底層先創(chuàng)建了一個長度為0的數組,當添加第一個元素的時候,初始化容量10】

2、ArrayList集合底層是Object類型的數組 Object[ ]

3、構造方法 new ArrayList();? ?new ArrayList(初始化集合容量大小的數);

4、ArrayList集合的擴容,是原容量的1.5倍,即1*(1+1/2)。底層是數組,應該盡可能少擴容,使用ArrayList集合先預估一個初始化容量

5、面試:ArrayList集合用的是最多的集合,因為它是數組結構,每個元素占用空間大小相同,內存地址連續(xù),可以知道首元素內存地址,檢索效率高,隨機增刪效率低,末尾插入元素效率高,線程不安全

代碼演示:

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.List;public class ArrayListTest01 {public static void main(String[] args) {//創(chuàng)建集合對象List list=new ArrayList();//集合size() 方法是獲取當前集合中“元素”的個數,不是獲取集合的容量//System.out.println(list.size());//0//創(chuàng)建的集合容量為20List list1=new ArrayList<>(20);} }

?構造方法?new ArrayList(初始化集合容量大小的數),參數里面還可以把另外一個數組傳遞進去

package com.lbj.javase.collection;import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List;public class ArrayListTest02 {public static void main(String[] args) {//創(chuàng)建HashSet集合Collection collection=new HashSet();//添加元素collection.add(100);collection.add(200);collection.add(300);//將HashSet集合傳入ArrayListList list=new ArrayList(collection);for (int i = 0; i <list.size(); i++) {Object o =list.get(i);System.out.println(o);}} }

?

ArrayList:把檢索發(fā)揮到極致(一般加元素都是末尾添加,且末尾添加元素效率很高)

LinkedList :把隨機增刪發(fā)揮到極致

?

?

11、LinkedList雙向列表源碼分析

引言:不懂什么是單鏈表數據結構的可以先看以下文章

JAVA進階教學之(單鏈表數據結構)

?

?LinkedList雙向列表的JVM示意圖:

?

提問:LinkedList集合有初始容量嗎?

無,初始化容量是null

?

提問:寫代碼時需要關心是哪個集合嗎?

不需要,因為我們要面向接口編程,調用的方法都是接口中的方法,不管是LinkedList還是ArrayList,以后寫代碼的時候都不需要關心具體是哪個集合

public class LinkedListTest01 {public static void main(String[] args) {List list=new LinkedList();//可以改為new ArrayList();,效果一樣 list.add("a");list.add("b");list.add("c");for (int i = 0; i <list.size(); i++) {Object o=list.get(i);System.out.println(o);}} }

?

?

總結:

  • LinkedList集合是雙向鏈表
  • 對于鏈表數據結構來說,隨機增刪效率較高,檢索效率較低
  • 鏈表中的元素在空間內存上,內存地址并不連續(xù)
  • ?

    ?

    ?

    12、Vector安全數組

    引言:

    底層:也是數組(線程安全數組)

    初始化容量:10

    ?

    Vector數組擴容:擴容后是原容量的2倍(10--》20--》30--》40)

    ArrayList數組擴容:擴容后是原容量的1.5倍(10--》15--》22.5--》33.75)

    ?

    Vector中所有的方法都是線程同步的,都帶有synchronized關鍵字,是線程安全的

    ?

    提問:

    怎么將一個線程不安全的ArrayList集合轉換成線程安全的呢?

    ?

    回答:

    java.util.Collections;??使用集合工具類

    ?

    注意:

    java.util.Collection 是集合接口

    java.util.Collections 是集合工具類(方便集合的操作)

    ?

    代碼演示:
    ?

    package com.lbj.javase.collection;import java.util.*;public class VectorTest01 {public static void main(String[] args) {List list=new Vector();//默認元素10個list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);list.add(8);list.add(9);list.add(10);//超過10個夠擴容為原來的兩倍(20)list.add(11);Iterator iterator=list.iterator();while(iterator.hasNext()){Object o=iterator.next();System.out.println(o);}//非線程安全這個可能要改為線程安全List list1=new ArrayList<>();//使用工具類Collections,變成線程安全,這里沒辦法看效果,因為多線程還沒接觸Collections.synchronizedList(list1);list1.add("aaa");list1.add("bbb");list1.add("ccc");} }

    ?

    ?

    ?

    13、HashSet集合特點

    引言:

  • 存儲時順序和取出時順序不同
  • 無序(不可排序)不可重復
  • 放到HashSet集合中的元素實際上放到HashMap集合的key部分
  • 初始化容量建議是2的倍數
  • 擴容之后,是原容量的2倍
  • 代碼演示:

    package com.lbj.javase.collection;import java.util.HashSet; import java.util.Set;public class HashSetTest01 {public static void main(String[] args) {Set<String> set=new HashSet<>();set.add("6");set.add("2");set.add("3");set.add("7");for (String a:set) {System.out.println(a);}} } 2 3 6 7

    ?

    14、TreeSet集合特點

    引言:

  • 無序(可排序)不可重復
  • 但是存儲的元素可以自動按照大小順序排序
  • 這里的無序值得是存進去的順序和取出來的順序不同
  • ?

    代碼演示:

    package com.lbj.javase.collection;import java.util.Set; import java.util.TreeSet;public class TreeSetTest01 {public static void main(String[] args) {Set<String> set=new TreeSet();set.add("1");set.add("3");set.add("2");set.add("8");set.add("5");for (String s:set) {System.out.println(s);}} } 1 2 3 5 8

    ?

    ?

    ?

    15、Map接口常用方法

    引言:

  • Map接口和Collection接口沒有繼承關系
  • Map接口以 key 和 value 的方式存儲數據(key,value)【鍵值對】
  • (key,value)都是引用數據類型
  • (key,value)都是存儲對象的內存地址
  • (key,value)key起主導地位,value起附屬地位
  • ?

    部分Map接口方法(代碼演示):

    package com.lbj.javase.collection;import java.util.Collection; import java.util.HashMap; import java.util.Map;public class MapTest01 {public static void main(String[] args) {//創(chuàng)建一個 Map 集合Map<Integer,String> map=new HashMap<>();//向Map集合中添加鍵值對map.put(10,"小明");//10在這里進行了自動裝箱map.put(20,"小紅");map.put(30,"小剛");//通過key 獲取 valueString s= map.get(10);System.out.println(s);//獲取 鍵值對 的 數量Integer integer=map.size();System.out.println(integer);//通過 key 刪除 key-valueString s1=map.remove(10);System.out.println(s1);//判斷是否包含某個keyBoolean b=map.containsKey(10);System.out.println(b);//判斷是否包含某個valueBoolean b1=map.containsValue("小明");System.out.println(b1);//清空集合//map.clear();//判斷 集合 是否為空Boolean b2=map.isEmpty();System.out.println(b2);//獲取所有的 valueCollection<String> collection=map.values();for (String s2: map.values()) {System.out.println(s2);}} }小明 3 小明 false false false 小紅 小剛

    ?

    ?

    Map集合的遍歷(!!!非常重要):

    ?

    方法一(直接獲取key,遍歷Set):

    缺點:效率相對較低,?String value=map.get(key);會再次調用哈希表,會影響性能

    package com.lbj.javase.collection;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class MapTest02 {public static void main(String[] args) {//第一種方式:獲取所有的key,通過遍歷key,來遍歷valueMap<Integer,String> map=new HashMap<>();//添加元素map.put(1,"zhangsan");map.put(2,"wanwu");map.put(3,"zhaosi");map.put(4,"xiaohong");//遍歷Map集合//獲取所有的keys,所有的keys是一個Set集合Set<Integer> keys=map.keySet();//遍歷key,通過key,獲取valueIterator<Integer> iterable=keys.iterator();while (iterable.hasNext()){//取出其中的一個keyInteger key=iterable.next();//通過key獲取valueString value=map.get(key);System.out.println(key+"="+value);}} }1=zhangsan 2=wanwu 3=zhaosi 4=xiaohong

    ?

    ?

    (同等方法的foreach遍歷):

    package com.lbj.javase.collection;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class MapTest02 {public static void main(String[] args) {//第一種方式:獲取所有的key,通過遍歷key,來遍歷valueMap<Integer,String> map=new HashMap<>();//添加元素map.put(1,"zhangsan");map.put(2,"wanwu");map.put(3,"zhaosi");map.put(4,"xiaohong");//遍歷Map集合//獲取所有的keys,所有的keys是一個Set集合Set<Integer> keys=map.keySet();for (Integer key:keys) {System.out.println(key+"="+map.get(key));}} }

    ?

    ?

    方法二(Map轉Set,遍歷Set):

    Set<Map.Entry<K,V>> entrySet()? ?把Map集合直接全部轉換成Set集合

    Set集合中元素的類型是 :Map.Entry<K,V>

    優(yōu)點:效率高(原因:Set集合存儲的Map集合中的數據,實際上存儲在node節(jié)點中,通過node節(jié)點直接獲取Map集合中的數據,不需要再次經過哈希表,性能提高,底層是Node單向鏈表,下面會繼續(xù)說說這個Node)

    package com.lbj.javase.collection;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class MapTest02 {public static void main(String[] args) {//第一種方式:獲取所有的key,通過遍歷key,來遍歷valueMap<Integer,String> map=new HashMap<>();//添加元素map.put(1,"zhangsan");map.put(2,"wanwu");map.put(3,"zhaosi");map.put(4,"xiaohong");//第二種方式:Map轉換成Set集合Set<Map.Entry<Integer,String>> set=map.entrySet();//迭代set集合Iterator<Map.Entry<Integer,String>> iterator=set.iterator();while (iterator.hasNext()){Map.Entry<Integer,String> node=iterator.next();Integer i=node.getKey();String s=node.getValue();System.out.println(i+"="+s);}} }1=zhangsan 2=wanwu 3=zhaosi 4=xiaohong

    JVM示意圖(為了方便理解):

    ?

    ?

    ?

    (同等方法的foreach遍歷):

    package com.lbj.javase.collection;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class MapTest02 {public static void main(String[] args) {//第一種方式:獲取所有的key,通過遍歷key,來遍歷valueMap<Integer,String> map=new HashMap<>();//添加元素map.put(1,"zhangsan");map.put(2,"wanwu");map.put(3,"zhaosi");map.put(4,"xiaohong");for (Map.Entry<Integer,String> node:set) {System.out.println(node);//直接獲取node結果一樣,但是實際開發(fā)中,一般需要獲取key或者是value,所以拆開使用更好System.out.println(node.getKey()+"="+node.getValue());}} }1=zhangsan 1=zhangsan 2=wanwu 2=wanwu 3=zhaosi 3=zhaosi 4=xiaohong 4=xiaohong


    ?

    ?

    16、HashMap集合

    引言:

    HashMap集合底層是 “哈希表/散列表” 的數據結構

    ?

    哈希表:

    哈希表是一個數組和單向鏈表的結合體,充分發(fā)揮各自優(yōu)點

    數組:在查詢方面效率很高,隨機增刪方面效率很低

    單向鏈表:在查詢方面效率很低,隨機增刪方面效率很高

    理解:哈希表是一維數組,這個數組中的每一個元素都是一個單項鏈表,相當于一個中間體,查詢效率相對于純數組是略低,隨機增刪改查效率相對于純單向鏈表是略低,但是綜合起來,哈希表是一個優(yōu)選擇,查詢不需要都掃描,只需要部分掃描,隨機增刪改查是在部分鏈表上完成

    ?

    ?

    HashMap底層源代碼分析:

    ?

    1、由于HashMap的底層和哈希表的關系非常大,因此我們從哈希值開始入手學習

    哈希值:哈希值是key的hashCode()方法的執(zhí)行結果,hash值通過哈希算法(哈希算法不是一種具體的算法,而是一種思想,將不定長的字符串變成定長的字符串),可以轉換存儲為數組的下標

    偽代碼演示:(HashMap的底層是一個數組,數組中的每個下標上存儲的是單鏈表,單鏈表中的節(jié)點有4個屬性,分別如下):?

    public class HashMap{//HashMap底層實際上就是一個數組Node<K,V>[ ] table;//靜態(tài)內部HashMap.Nodestatic class Node<K,V> implements Map.Entry<K,V> {final int hash; //存儲哈希值final K key; //存儲到Map集合中的那個keyV value; //存儲到Map集合中的那個valueNode<K,V> next; //存儲下一個節(jié)點的內存地址 }

    ?

    ?

    哈希表數據結構(配合示意圖食用效果會更好):

    2、需要了解哈希表,可以從 map.put(k,v)? 的實現原理入手

    • 第一步:先將k,v封裝到Node對象中
    • 第二步:底層會調用k的hashCode()方法得出hash值
    • 第三步:通過哈希算法,將hash值轉換成數組的下標,判斷當前下標位置上如果沒有任何元素,就把Node添加到當前位置上
    • 第四步:判斷當前下標位置上如果有鏈表,此時會將k的值和鏈表中的每一個節(jié)點的k值進行equals比較,如果返回false,則表示沒有重復,新節(jié)點將被添加到鏈表尾端;如果其中有一個equals返回true,則表示有重復,新節(jié)點的value會被覆蓋

    ?

    3、從map.get(k) 的實現原理入手

    • 第一步:先調用k的hashCode()方法的出hash值
    • 第二步:通過哈希算法,將hash值轉換成數組的下標,判斷當前下標位置上如果沒有任何元素,返回null
    • 第三步:判斷當前下標位置上如果有鏈表,此時會將k的值和鏈表中的每一個節(jié)點的k值進行equals比較,如果返回false,那么get方法返回null,只要其中有一個節(jié)點的k值和參數k值的equals比較的時候返回true,那么此時這個節(jié)點的value就是我們需要的value,get方法最終返回這個要找的value

    ?

    示意圖:

    ??

    哈希表補充:

    如果k1和k2的hash值相同,一定是放到同一個單項鏈表上

    如果k1和k2的hash值不相同,但是由于哈希算法執(zhí)行結束后轉換的數組下標可能相同(7%3=1,4%3=1),此時會發(fā)生“哈希碰撞”

    ?

    4、了解哈希表后,就可以分析HashMap集合的key部分特點

    • 無序:因為不一定掛載到哪一個單向鏈表上
    • 不可重復:equals()方法保證HashMap集合中的key不可重復,如果key重復了,新value會覆蓋舊value的值
    • 放在HashMao集合的key部分的元素其實就是放到HashSet集合中了
    • 所以HashSet集合中的元素也需要同時重寫hashCode()+equals()方法

    ?

    5、重點:

    • 通過示意圖可以得出HashMap集合的key,會先后調用兩個方法,一個方法是hashCode(),一個方法是equals(),那么這兩個方法都需要進行重寫

    ?

    ?

    6、哈希表HashMap使用不當時會無法發(fā)揮出哈希表的性能

    • 原因:假設將所有的hashCode() 的方法返回值固定為某個值,那么會導致底層哈希表變成純的單向鏈表,這種情況稱為:散列分布不均勻
    • 什么是散列分布均勻?
    • 假設有100個元素,10個單向鏈表,那么每個單向鏈表上有10個節(jié)點的時候,是最好的結果,屬于散列分布均勻
    • 假設將所有的hashCode() 的方法返回值都設定為不一樣的值,可以嗎?
    • 不行,因為這樣的話會導致底層哈希表稱為一個純一維數組,沒有鏈表的概念,屬于散列分布不均勻
    • 結論:因此,散列分布均勻需要重寫hashCode() 的方法時有一定的技巧

    ?

    ?

    ?

    7、關于HashMap集合的擴容

    默認初始化容量是16,默認加載因子是0.75

    默認加載因子:是當HashMap集合底層數組的容量達到75%的時候,數組開始擴容

    ?

    重點,記住:HashMap集合初始化容量最好是2的倍數,這是官方推薦的

    這是因為達到散列均勻,為了提高HashMap集合的存取效率,所以必須的

    1<<4? 是二進制位移,位移效率比運算效率高很多

    ?

    擴容:擴容之后的容量是原容量的2倍

    ?

    8、hashCode()方法和equals()方法不用研究了,直接使用IDEA工具生成,但是這兩個方法需要同時生成

    ?

    9、JDK 8 的HashMap有新特性

    如果哈希表單向鏈表中元素超過8個,單向鏈表這種數據結構會變成紅黑樹數據結構

    如果紅黑樹上的節(jié)點數量小于6個時,會重新把紅黑樹變成單向鏈表數據結構,提高檢索效率

    ?

    終極結論:

    放在HashMap集合key部分的,以及放在HashSet集合中的元素,需要同時重寫hashCode()+equals()且hashCode()會先被調用

    ?

    ?

    ?

    ?

    17、HashMap和HashTable的區(qū)別

    提問:HashMap集合key部分可以存儲null嗎?

    答案:允許,但是需要注意 key的null值只能有一個,再多也只能被覆蓋而已

    代碼演示:

    package com.lbj.javase.collection;import java.util.HashMap; import java.util.Map;public class MapTest03 {public static void main(String[] args) {Map map=new HashMap<>();//HashMap集合允許key為nullmap.put(null,null);//key重復的時候,value進行覆蓋map.put(null,100);System.out.println(map.size());//1//通過key獲取valueSystem.out.println(map.get(null));//100} }

    ?

    ?

    • HashTable的方法都是帶有synchronized,屬于線程安全的,效率低的
    • 因此Hashtable的key和value都是不能為null的,但是HashMap的key和value都可以為null
    • HashTable的初始化容量是11,默認加載因子是0.75f,HashTable的擴容是原容量*2+1

    代碼演示:

    package com.lbj.javase.collection;import java.util.Hashtable; import java.util.Map;public class MapTest04 {public static void main(String[] args) {Map map=new Hashtable<>();//Exception in thread "main" java.lang.NullPointerException// at java.util.Hashtable.put(Hashtable.java:460)// at com.lbj.javase.collection.MapTest04.main(MapTest04.java:18)map.put(null,null);//空指針異常//同理map.put(1,null);map.put(null,1);} }

    ?

    ?

    ?

    ?

    18、屬性類Properties

    目前只需要掌握Properties屬性類對象的相關方法即可

    Properties是一個Map集合,繼承HashTable

    Properties的key和value都是String類型

    Properties被稱為屬性類對象

    Properties是線程安全的

    代碼演示:

    package com.lbj.javase.collection;import java.util.Properties;public class PropertiesTest01 {public static void main(String[] args) {//創(chuàng)建一個Properties對象Properties properties=new Properties();//需要掌握兩個方法,一個存,一個取//存properties.setProperty("url","jdbc:mysql://localhost:3306/aaa");properties.setProperty("driver","com.mysql.jdbc.Driver");properties.setProperty("username","root");properties.setProperty("password","123");//取String s=properties.getProperty("url");String s1=properties.getProperty("password");System.out.println(s+s1);//jdbc:mysql://localhost:3306/aaa123} }

    ?

    ?

    19、TreeSet可排序集合

    TreeSet集合底層實際上是一個TreeMap,TreeMap集合底層是二叉樹

    放到TreeSet集合中的元素,等同于放到TreeMap集合中的key部分

    TreeSet集合中的元素:無序不可重復,但是取出時可以按照元素類型的大小順序自動排序

    代碼演示(按照字典順序,默認升序):

    package com.lbj.javase.collection;import java.util.TreeSet;public class TreeSetTest02 {public static void main(String[] args) {TreeSet<String> treeSet=new TreeSet<>();treeSet.add("d");treeSet.add("d");treeSet.add("b");treeSet.add("b");treeSet.add("a"); //.add()底層其實就是treeMap中的.put()方法for (String s:treeSet) {System.out.println(s);}//a b dTreeSet<Integer> treeSet1=new TreeSet<>();treeSet1.add(6);treeSet1.add(3);treeSet1.add(1);treeSet1.add(2);for (Integer i:treeSet1) {System.out.println(i);}//1 2 3 6} }

    ?

    TreeSet無法對自定義類型排序:

    提問:對于自定義類型來說,TreeSet可以排序嗎?

    以下程序中對于Worker類型來說,無法排序,因為Worker類中沒有指定Worker對象之間的比較規(guī)則

    (誰大誰小無法說明)

    代碼演示:

    package com.lbj.javase.collection;import java.util.TreeSet;public class TreeSetTest03 {public static void main(String[] args) {TreeSet<Worker> treeSet=new TreeSet<>();Worker worker=new Worker(19);Worker worker1=new Worker(34);Worker worker2=new Worker(21);Worker worker3=new Worker(35);//添加一個自定義類的對象進去treeSet中,這一步就是錯誤的treeSet.add(worker);treeSet.add(worker1);treeSet.add(worker2);treeSet.add(worker3);//遍歷for (Worker w:treeSet) {System.out.println(w);}} } class Worker{private int age;public Worker(int age) {this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} }

    ?

    出現異常:

    com.lbj.javase.collection.TreeSetTest03
    Exception in thread "main" java.lang.ClassCastException: com.lbj.javase.collection.Worker cannot be cast to java.lang.Comparable
    ?? ?at java.util.TreeMap.compare(TreeMap.java:1294)
    ?? ?at java.util.TreeMap.put(TreeMap.java:538)
    ?? ?at java.util.TreeSet.add(TreeSet.java:255)
    ?? ?at com.lbj.javase.collection.TreeSetTest03.main(TreeSetTest03.java:22)
    ?

    異常分析:
    Worker類沒有實現java.lang.Comparable接口,導致類型的強制轉換不成功,無法進行比較,而再上一例中的String和Integer源碼中都實現了Comparable接口,可以進行類型轉換,進行比較無非就是<0、=0、>0 因此就可以進行排序

    ?

    自定義類型重寫CompareTo方法:


    代碼演示:

    package com.lbj.javase.collection;import java.util.TreeSet;public class TreeSetTest03 {public static void main(String[] args) {TreeSet<Worker> treeSet=new TreeSet<>();Worker worker=new Worker(19);Worker worker1=new Worker(34);Worker worker2=new Worker(21);Worker worker3=new Worker(35);//添加一個自定義類的對象進去treeSet中,這一步就是錯誤的treeSet.add(worker);treeSet.add(worker1);treeSet.add(worker2);treeSet.add(worker3);//遍歷for (Worker w:treeSet) {System.out.println(w);}} }//放在TreeSet集合中的元素需要實現java.lang.Comparable接口 //并且實現compareTo方法,equals可以不寫 class Worker implements Comparable<Worker>{private int age;public Worker(int age) {this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//需要在這個方法里面編寫 比較的邏輯//k.compareTo(t.key)//原理:拿著參數k和集合中的每一個k進行比較,返回值可能是 >0 =0 <0@Overridepublic int compareTo(Worker o) {//假設o1.compareTo(o2)//this就是 o1//o 就是 o2//o1和o2進行比較的時候,實際上就是this和o進行比較int age1=this.age;int age2=o.age;/*//邏輯判斷if(age1==age2){return 0;}else if(age1>age2){return 1;}else if(age1<age2){return -1;}*///升序//return age1-age2 ;//有可能是<0 =0 >0//降序return age2-age1 ;}//重寫toString方法@Overridepublic String toString() {return "Worker{" +"age=" + age +'}';} }

    問題:為什么在CompareTo方法里面寫了一個return age2-age1 就可以對年齡進行比較?

    解答:請看下面的比較規(guī)則

    ?

    compareTo() 方法的返回值很重要:

    ?

    • 返回0,表示相同,value會覆蓋
    • 返回>0,表示會在右子樹上尋找
    • 返回<0,表示會在左子樹上尋找

    代碼演示(比較規(guī)則應該怎么寫):

    package com.lbj.javase.collection;import java.util.TreeSet;public class TreeSetTest04 {public static void main(String[] args) {//創(chuàng)建一個treeSet集合TreeSet<Vip> treeSet=new TreeSet<>();Vip vip=new Vip("zhangsan",23);Vip vip1=new Vip("lisi",23);Vip vip2=new Vip("wanwu",32);Vip vip3=new Vip("zhaosi",38);//將創(chuàng)建的對象添加進treeSet集合中treeSet.add(vip);treeSet.add(vip1);treeSet.add(vip2);treeSet.add(vip3);//遍歷集合,查看排序for (Vip v:treeSet) {System.out.println(v);}} }class Vip implements Comparable<Vip>{private String name;private int age;public Vip(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(Vip o) {//寫排序規(guī)則,按照哪一個屬性進行比較if(this.age==o.age){//年齡相相等的時候,比較姓名,因為姓名是String類型,已經實現了CompareToreturn this.name.compareTo(o.name);}else {//年齡不相等的時候,只比較年齡return this.age-o.age;}}@Overridepublic String toString() {return "Vip{" +"name='" + name + '\'' +", age=" + age +'}';} }Vip{name='lisi', age=23} Vip{name='zhangsan', age=23} Vip{name='wanwu', age=32} Vip{name='zhaosi', age=38}

    ?

    ?

    ?自平衡二叉樹的概念(存放的過程就是排序的過程):

    圖示:

    ?

    ?

    結論:

    放到TreeSet或者TreeMap集合key部分的元素想要做到排序,包括兩種方式(P714):

    第一種:放在集合中的元素實現java.lang.Compareable接口

    第二種:在構造TreeSet或者TreeMap集合的時候傳入一個比較器對象

    Comparable和Comparator怎么選擇呢?

    當比較規(guī)則不會發(fā)生改變的時候,或者說當比較規(guī)則只有一個的時候,建議實現Comparable接口

    當比較規(guī)則出現多個,并且需要多個比較規(guī)則之間頻繁切換,建議使用Comparator接口

    代碼演示:

    package com.lbj.javase.collection;import java.util.Comparator; import java.util.TreeSet;/** 比較器方法*/ public class TreeSetTest05 {public static void main(String[] args) {//創(chuàng)建TreeSet集合的時候,需要用到比較器的方式//通過構造方法傳遞一個比較器進去TreeSet集合中TreeSet<WuGui> treeSet=new TreeSet<>(new WuGuiComparator());WuGui wuGui=new WuGui(10);WuGui wuGui1=new WuGui(6);WuGui wuGui2=new WuGui(15);WuGui wuGui3=new WuGui(11);treeSet.add(wuGui);treeSet.add(wuGui1);treeSet.add(wuGui2);treeSet.add(wuGui3);//遍歷for (WuGui w:treeSet) {System.out.println(w);}} }class WuGui{private int age;public WuGui(int age) {this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "烏龜{" +"age=" + age +'}';} }//需要單獨寫一個比較器 //比較器實現java.util.Compatator接口(Comparable是java.lang包下的,Comparator是java.util包下的) class WuGuiComparator implements Comparator<WuGui>{@Overridepublic int compare(WuGui o1, WuGui o2) {//指定比較規(guī)則//按照年齡排序return o1.getAge()-o2.getAge();} }烏龜{age=6} 烏龜{age=10} 烏龜{age=11} 烏龜{age=15}

    ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的JAVA进阶教学之(集合)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    在线视频电影 | 96视频在线| 久久视频免费在线 | 亚洲精品一区二区精华 | 国产日韩视频在线观看 | 国产精品久久久久久久久久免费 | 国产精品 日韩 欧美 | 黄色大片视频网站 | 中文字幕资源在线观看 | 狠狠88综合久久久久综合网 | 一区二区三区在线观看中文字幕 | 欧美日韩一区二区免费在线观看 | 欧美日韩高清免费 | 就操操久久 | 中文字幕乱码日本亚洲一区二区 | 欧美日韩不卡在线视频 | 国产精品视频永久免费播放 | 国产成人三级三级三级97 | 午夜国产成人 | 首页中文字幕 | 91av电影网 | 色婷婷亚洲综合 | 国语精品免费视频 | 国产高清免费av | 欧美二区在线播放 | 国产精品久久9 | 国产在线日韩 | 91亚洲国产成人久久精品网站 | 在线观看视频一区二区三区 | 精品v亚洲v欧美v高清v | 黄色影院在线免费观看 | 99亚洲精品在线 | 国产在线第三页 | 国产精品美女久久久久久网站 | 国产老熟 | 最近免费中文视频 | 国产成人一区二区三区免费看 | 欧美日韩在线观看一区二区 | 亚洲成人资源 | 日韩av福利在线 | 国产高清免费av | 亚洲视频在线视频 | 欧美日韩精品在线一区二区 | 日日弄天天弄美女bbbb | 日韩a级黄色 | 免费在线一区二区三区 | 特级aaa毛片 | 久久国产午夜精品理论片最新版本 | 夜夜操天天干, | 蜜桃av综合网 | 97精品国产91久久久久久久 | 激情文学综合丁香 | 欧美日韩一区二区免费在线观看 | 9992tv成人免费看片 | 碰超在线观看 | 国产黄色片一级 | 青青草国产精品 | av黄色免费看 | 青青河边草免费直播 | www.黄色网.com| 日韩欧美一级二级 | 日韩一区二区三区在线观看 | 三级午夜片 | 国产精品久久久久影院日本 | 日韩综合一区二区三区 | 伊人久久av| 亚洲精品美女久久17c | 欧美一区二视频在线免费观看 | 国产精选在线 | 国产无套精品久久久久久 | 精品一区二区在线免费观看 | 国产成人精品av在线 | 免费欧美| 激情 一区二区 | 97色资源 | 成人一区影院 | 免费视频久久久 | 国产一区麻豆 | 亚洲资源视频 | av丝袜制服 | 国产 视频 高清 免费 | 美女天天操 | 久久看视频 | 国产精品毛片一区二区 | 成人h动漫精品一区二 | 亚洲japanese制服美女 | 国产黄免费在线观看 | 精品国产一区二区三区在线 | 精品一区二区在线免费观看 | 色综合久| 日韩免| 一区二区三区在线播放 | 国产日韩欧美在线一区 | 日韩欧美成 | 国产理伦在线 | 欧美在线a视频 | 免费日韩| 91人人视频在线观看 | 色综合天天狠天天透天天伊人 | 中文字幕 二区 | 久久国产日韩 | 高潮久久久久久 | 91久久国产自产拍夜夜嗨 | 亚洲天堂网在线观看视频 | 国产三级精品三级在线观看 | 天天射色综合 | 亚洲精品国产麻豆 | 成 人 黄 色 视频 免费观看 | 一区二区高清在线 | 精品免费久久 | 不卡的av中文字幕 | 天天插日日插 | 欧美日韩免费网站 | 九九热免费在线视频 | 中文字幕国产在线 | 国产99精品 | 国产精品免费小视频 | 久久精品成人热国产成 | 久久久穴 | 99久久网站| 波多野结衣视频一区二区三区 | 日日夜夜天天综合 | 人人爱爱| 一区二区三区韩国免费中文网站 | 久久久免费看片 | 最近2019年日本中文免费字幕 | 国产传媒中文字幕 | 日韩1级片 | 国产精品欧美久久久久久 | 国产精品手机看片 | www成人av| 亚洲精品视频免费在线观看 | 国产九九精品视频 | 成人免费观看a | 国产精品久久久久久久久久久久午夜 | 日韩欧美在线国产 | 视频在线91 | 手机在线永久免费观看av片 | 成人影片在线播放 | 一区二区三区中文字幕在线观看 | 久久久久欠精品国产毛片国产毛生 | 国产在线色站 | 国产精品欧美久久久久天天影视 | 国产中文字幕视频 | 久久精品79国产精品 | 久久一区国产 | 五月激情婷婷丁香 | 亚洲精品美女免费 | 久久深夜福利免费观看 | 亚洲精品videossex少妇 | 亚洲国产精品影院 | 在线草| 成人性生交大片免费观看网站 | 视频二区在线 | 亚洲影院天堂 | 日韩一区二区三区免费视频 | 国产视频久久 | 国产精品18videosex性欧美 | 日韩黄色中文字幕 | 一区二区三区在线看 | 婷婷精品| 色综合天天狠天天透天天伊人 | 日韩一区二区久久 | 国产精品18久久久久白浆 | 色综合久久88色综合天天免费 | 99超碰在线观看 | 国产精品欧美日韩在线观看 | 9i看片成人免费看片 | 午夜久久精品 | 久久久久视| 国内精品视频久久 | 91精品免费| 成人网页在线免费观看 | 中文字幕一区二区三区在线观看 | 国产精品一区二区无线 | 91精品一区二区三区蜜臀 | 久久精品中文字幕一区二区三区 | 亚洲欧美视频在线播放 | 综合在线亚洲 | 中文字幕久久精品一区 | 亚洲天天在线日亚洲洲精 | 日本乱码在线 | 91久久在线观看 | 二区三区毛片 | 国内久久精品视频 | 丁香六月激情婷婷 | 偷拍福利视频一区二区三区 | 国产一级片免费观看 | 人人澡超碰碰 | 97人人网 | 国产视频不卡 | 99re久久资源最新地址 | 在线观看国产一区 | 日韩中文字幕免费视频 | 丁香婷婷综合激情五月色 | 久久99电影 | 亚洲欧美精品一区二区 | 夜夜狠狠 | 亚洲黄色高清 | 成人午夜免费剧场 | 国产98色在线 | 日韩 | 在线久热 | 中文国产在线观看 | 欧洲在线免费视频 | 狠狠狠色丁香综合久久天下网 | 欧美综合干 | 天天av在线播放 | 久久综合导航 | 国产资源网 | 久久精品aaa | 亚洲日本成人网 | 国产a级精品 | 亚洲精品国产精品久久99 | 麻豆国产精品永久免费视频 | 日本激情动作片免费看 | 欧美日韩aa | 黄色av网站在线观看免费 | 婷婷色站 | 中文字幕乱偷在线 | 欧美十八 | 久久久久亚洲精品男人的天堂 | 日韩高清在线一区二区三区 | 69av免费视频 | 日韩精品在线免费观看 | 亚洲精品啊啊啊 | 亚洲 综合 专区 | 亚洲欧美日韩不卡 | 亚洲电影av在线 | www夜夜操com | 狂野欧美激情性xxxx | 在线观看亚洲国产精品 | 超碰免费成人 | 91九色视频在线播放 | 91黄色免费看 | 欧美日韩p片 | 中文字幕中文中文字幕 | 国产精品毛片一区视频播 | 久久夜色网| 亚洲一区动漫 | 欧美日韩国产精品一区二区三区 | 国产福利久久 | 日本中文字幕电影在线免费观看 | 久久综合9988久久爱 | 色婷婷免费视频 | 狠狠狠操 | 国产伦理久久精品久久久久_ | 国产中文字幕在线看 | 成人久久18免费网站图片 | 去干成人网 | 免费看一级片 | 日韩区在线观看 | 国产午夜精品一区二区三区四区 | 永久免费精品视频网站 | 99av在线视频 | 日日夜夜天天 | 成人一区二区三区中文字幕 | 日韩日韩日韩日韩 | 中文国产在线观看 | 天天干,天天操,天天射 | 最新av电影网址 | 国产在线最新 | 91九色国产 | 亚洲精品国产视频 | 久久久久久97三级 | 九九久久精品 | 天天操操 | 日本久久成人 | 81国产精品久久久久久久久久 | 日本成人黄色片 | 色综合天天爱 | 日韩美av在线 | 在线观看亚洲a | 美女av免费看 | 国产精品永久 | 狠狠干免费 | 国产中文字幕三区 | 一级免费黄色 | 亚洲视频网站在线观看 | 99中文字幕视频 | 91视频在线播放视频 | 欧美伦理一区二区三区 | 亚洲精色| 欧美a级在线免费观看 | 国产乱码精品一区二区三区介绍 | 日本xxxx.com | 国产91精品久久久久久 | a级国产乱理伦片在线观看 亚洲3级 | 四虎永久免费在线观看 | www黄| 五月婷婷一级片 | 91在线视频观看免费 | 欧美日韩亚洲国产一区 | 国产原创中文在线 | 探花视频在线观看+在线播放 | 国产特级毛片aaaaaaa高清 | av福利网址导航大全 | 欧美精品首页 | 蜜臀久久99静品久久久久久 | 永久精品视频 | 超碰av在线免费观看 | 亚洲精品在线视频观看 | 欧美日韩亚洲在线观看 | 九草视频在线 | 狠狠狠色丁香婷婷综合激情 | 亚洲精品乱码久久久久久蜜桃动漫 | 成人毛片在线视频 | 国产精品 美女 | 国产中文字幕国产 | 天天在线视频色 | 国产专区在线播放 | 国产一区二区免费 | 在线观看免费一区 | 2021国产精品 | 久久成人视屏 | 91成人精品观看 | 亚州日韩中文字幕 | 日韩精品一区二区三区在线视频 | 国产精品久久久久久久久久免费看 | 干天天 | 国产精品不卡视频 | 国产亚洲人| 美女一级毛片视频 | 91视频在线免费 | 国产成人精品亚洲日本在线观看 | 亚洲成人精品久久久 | 狠日日| 操高跟美女 | 国产免费黄色 | ,午夜性刺激免费看视频 | 日本久久久影视 | 色视频网址 | 国产专区在线视频 | 天堂av在线免费观看 | 亚洲精品久久久久久中文传媒 | 亚洲精品美女久久17c | 99热999 | 欧美精品免费视频 | 国产精品日韩在线 | 精品主播网红福利资源观看 | 操操操天天操 | 中文字幕日韩在线播放 | 西西44人体做爰大胆视频 | 久草在线免 | 狠狠操欧美 | 天天射天天搞 | 免费看v片| 有码一区二区三区 | 香蕉手机在线 | 99精品乱码国产在线观看 | 久久精品女人毛片国产 | 久久亚洲成人网 | 亚洲最新在线 | 成年免费在线视频 | 六月丁香激情综合色啪小说 | 国产一区在线免费观看视频 | 天天干天天插 | 成人国产精品免费观看 | 视频在线观看入口黄最新永久免费国产 | 午夜精品一区二区三区视频免费看 | 色视频在线观看免费 | 国产麻豆精品一区 | 国产一区二区高清不卡 | 久久亚洲国产精品 | 五月婷婷综合久久 | 久久在线免费观看视频 | 欧美伦理一区二区三区 | 亚洲成年人在线播放 | bbw av| 在线看日韩| 九九九九免费视频 | 狠狠狠色丁香综合久久天下网 | 摸阴视频 | 久久91久久久久麻豆精品 | 黄色片视频免费 | 欧美成人在线免费观看 | 精品视频久久久久久 | 日日夜夜操操 | 日日插日日干 | av电影免费在线看 | 日韩两性视频 | 亚洲精品在线电影 | 久久激情婷婷 | 色先锋av资源中文字幕 | 狠狠躁夜夜躁人人爽超碰91 | 久久艹精品 | 99久久爱 | 黄色国产高清 | 国产一级黄色免费看 | 国产午夜精品一区二区三区嫩草 | 久久经典国产视频 | 热久久国产精品 | 99操视频 | 日韩字幕在线 | 久久久www成人免费毛片麻豆 | 午夜精品久久久久久99热明星 | 国产精品久久久久久超碰 | 最近2019年日本中文免费字幕 | 国产99视频在线观看 | 天天色天天干天天 | 久久国内精品视频 | 欧美久久久久久久久久久久久 | av大全在线观看 | 亚洲激情 | 国产天天综合 | 日韩中文字幕免费看 | 最新久久久 | 人人插人人玩 | 久久精品4 | 精品你懂的 | 99在线观看视频 | 国产精品第一视频 | 精品在线不卡 | 激情 一区二区 | 少妇av片| 日韩激情av在线 | 丰满少妇麻豆av | 天堂在线一区二区 | 国产精品第一视频 | 精品国产成人av | 日本特黄一级片 | av免费在线观看网站 | 最新久久久 | 国内精品在线一区 | 中文字幕av最新更新 | 黄p网站在线观看 | 国产一区二区在线播放视频 | 久久影院精品 | 国产激情电影综合在线看 | 91在线porny国产在线看 | 精品一二 | 在线看国产日韩 | 国产成人一二片 | 婷婷久久一区 | 国产不卡在线观看 | 久久久久国产精品免费 | 91高清一区 | 欧美日韩在线电影 | 国产精品一区二区免费在线观看 | 欧美一级在线观看视频 | 精品久久久久久电影 | 中文视频在线看 | 成人午夜黄色 | 一级一片免费看 | 日韩综合一区二区三区 | 亚洲在线日韩 | 精品主播网红福利资源观看 | 999久久久久久久久6666 | 嫩嫩影院理论片 | 国产二区精品 | 亚洲 中文字幕av | 久久精品久久综合 | 91最新中文字幕 | 亚洲婷久久 | 日本三级大片 | 丝袜美腿亚洲综合 | 欧美伊人网| 亚洲精品国产精品国自产观看浪潮 | 精品一区二三区 | 成人视屏免费看 | 日韩在线观看的 | 色综合天天爱 | 精品中文字幕视频 | 久久兔费看a级 | 色视频网站在线观看一=区 a视频免费在线观看 | 成人app在线免费观看 | 精品国产激情 | 国产99一区 | 日日夜av| 一区免费观看 | 国内精品在线看 | 中文字幕免费成人 | 在线观看色视频 | 久草在线电影网 | 久久手机视频 | 国产一级片免费播放 | 人人干,人人爽 | av成年人电影 | 狠狠色丁香九九婷婷综合五月 | 91九色在线观看视频 | 国产精品久久久久久久久久久免费看 | 国产精品九九九 | 国产黄色片久久 | 国精产品999国精产品岳 | 国产精品爽爽爽 | 国产亚洲一区二区三区 | 久久精品一 | 精品99999 | 国产成人精品免高潮在线观看 | 99久热在线精品视频观看 | 国产丝袜美腿在线 | 91九色免费视频 | 特级毛片网站 | 中文字幕资源在线 | 亚洲另类在线视频 | 深爱激情站 | 婷婷综合亚洲 | 超碰在线观看av | 免费视频91蜜桃 | av大全免费在线观看 | 国产精品免费久久久久 | 午夜久久久精品 | 91福利视频在线 | 精品久久国产 | 色婷婷综合久久久中文字幕 | 韩日视频在线 | 欧美国产日韩一区二区 | 免费久久99精品国产婷婷六月 | 激情五月五月婷婷 | 不卡的av中文字幕 | 五月开心六月婷婷 | 黄色av电影一级片 | 久久久久免费精品视频 | 黄色一级免费电影 | 天堂在线视频免费观看 | 欧美午夜精品久久久久久孕妇 | 中文字幕一区二区三区久久 | 毛片1000部免费看 | 四虎在线视频免费观看 | 一区二区三区四区不卡 | 一区二区激情 | 亚洲视屏一区 | 奇米网网址 | 国产精品美女久久久久久久网站 | 中国一级片视频 | 成人午夜电影久久影院 | 亚洲一区二区视频 | 国产一区在线看 | 天天久久夜夜 | 色久综合 | 操操综合网 | 国内小视频在线观看 | 国产超碰在线观看 | 成人亚洲免费 | 精品久久久久久亚洲 | 亚洲劲爆av| 国产在线自 | 国产一区在线视频播放 | 国产高清精品在线观看 | 久草视频在线资源 | 91精品国产乱码久久桃 | 成人a视频在线观看 | 欧美日韩高清国产 | 国产高清网站 | 婷婷激情欧美 | 超碰人在线 | 国产视频91在线 | 三级在线视频观看 | 婷婷丁香激情网 | 99精品国自产在线 | 久久免费视频播放 | 亚洲aaa级 | 女人18精品一区二区三区 | 99久久久久免费精品国产 | 手机成人av| 欧美日韩高清一区二区 | www色av| 国产精品9999 | 精品视频123区在线观看 | 色偷偷网站视频 | 日韩av在线不卡 | 国产精品一二三 | 免费午夜av | 婷婷伊人综合亚洲综合网 | 国产婷婷久久 | 中文字幕高清 | 99久久婷婷国产精品综合 | 国产精品一区免费在线观看 | 日韩在线高清视频 | 欧美成天堂网地址 | 色婷婷综合久久久 | 国产综合小视频 | 黄色在线网站噜噜噜 | 精品一区二区三区久久久 | 亚洲资源视频 | 色丁香久久 | 国产成人性色生活片 | 色综合欧洲| 中文字幕二区在线观看 | 国产黄网在线 | 国产一区二区电影在线观看 | 9i看片成人免费看片 | 国产精品系列在线 | 久久国内免费视频 | 91一区二区三区久久久久国产乱 | 久久永久免费 | av一级久久 | 国产偷国产偷亚洲清高 | 婷婷久久丁香 | 狠狠色丁香婷婷综合 | 日韩一区二区久久 | 成年人在线免费看片 | 在线观看黄色的网站 | 国产资源在线观看 | 国产亲近乱来精品 | 最近中文国产在线视频 | 91免费观看国产 | 国产自制av | 日韩精品中文字幕在线观看 | 国产精品亚洲片在线播放 | 久久综合免费视频 | 欧美日韩亚洲一 | 亚洲精品在线免费播放 | 国产色在线,com | 国产免费观看高清完整版 | av电影不卡 | 日本午夜免费福利视频 | 天天操操操操操 | 国产成人精品a | 成人av免费在线观看 | 久久久久欠精品国产毛片国产毛生 | 久久视频这里只有精品 | 亚洲三级黄 | 狠狠色噜噜狠狠 | 国产精品18videosex性欧美 | 99热国内精品 | 五月天久久综合 | 国产精品高潮呻吟久久久久 | 欧美伦理电影一区二区 | 国产高清中文字幕 | 欧美日本啪啪无遮挡网站 | 三级a毛片 | 亚洲激情 在线 | 黄色av大片| 天天透天天插 | 国产理论片在线观看 | 最新日韩在线观看 | 色综合在| 国产精品精品国产婷婷这里av | 91精品国产99久久久久 | 九九热1 | 天天插天天爽 | 国内久久精品视频 | 在线国产一区二区三区 | 国产在线观看av | 亚洲精品免费在线观看视频 | 91传媒激情理伦片 | 国产精品久久久久久电影 | 国产在线精品视频 | 欧美精品亚洲精品 | 中文字幕中文字幕中文字幕 | 伊人网av| 狠狠色伊人亚洲综合网站色 | 日韩精品一区二区三区水蜜桃 | 国产人免费人成免费视频 | 日韩综合视频在线观看 | 91精品久久久久久久久久入口 | 国产日韩欧美自拍 | 激情综合五月婷婷 | www.com在线观看 | 91在线视频播放 | 日韩黄色免费电影 | 操操日 | 国产久草在线观看 | 国产精品视频免费在线观看 | 在线视频成人 | 色综合久久中文字幕综合网 | 国产成人777777| 四虎在线视频免费观看 | 婷婷六月天丁香 | 亚洲精品在线电影 | 欧美va天堂va视频va在线 | 成人av免费在线观看 | 99人久久精品视频最新地址 | 激情五月婷婷激情 | 一区二区三区在线观看免费 | 精品国产免费一区二区三区五区 | 欧美日韩国产精品一区二区三区 | 日韩免费一级a毛片在线播放一级 | 日韩在线免费视频观看 | 亚洲成av人片在线观看www | 午夜在线免费视频 | 手机在线看永久av片免费 | 婷婷成人综合 | 国内精品久久影院 | 久久调教视频 | 在线精品视频免费播放 | 夜又临在线观看 | 天天干天天做天天爱 | 中国一级片在线观看 | 麻豆传媒精品 | 激情综合站 | 欧美日韩中文字幕综合视频 | 黄色一级片视频 | 精品久久久久久久久久久久久久久久久久 | 日日躁天天躁 | 国产网红在线观看 | 日本二区三区在线 | 亚洲乱码国产乱码精品天美传媒 | 日韩av一区二区在线影视 | 夜夜躁日日躁狠狠躁 | 精品在线视频一区二区三区 | 国产精品欧美久久久久天天影视 | 国产在线观看地址 | av中文字幕在线免费观看 | 福利视频区 | 成人cosplay福利网站 | 精品国产乱码久久久久久浪潮 | 免费观看www小视频的软件 | 一区二区中文字幕在线 | 夜夜夜影院 | 三级黄色在线观看 | 亚洲高清在线视频 | 性色xxxxhd | 日韩免费精品 | 久久夜色精品国产欧美乱极品 | 久久久久久久久久久免费 | 免费看三级黄色片 | 欧美aa在线观看 | 天天干天天操天天入 | 亚洲精品一区二区18漫画 | 中文资源在线播放 | 国产一级淫片免费看 | 日韩精品网址 | 91亚洲免费 | 一区二区三区在线观看中文字幕 | 天天干天天操天天射 | 色欧美88888久久久久久影院 | 麻豆影视网站 | 免费在线91 | 久久综合狠狠综合久久综合88 | 日本精品视频在线观看 | 日韩欧美一区二区三区在线 | 国产精品18p| 久久精品亚洲一区二区三区观看模式 | 亚洲高清91 | 国产精品久久久久久一区二区 | 99久久视频| 国产999在线观看 | 久久国产精品免费视频 | www.成人精品 | 久久理论影院 | 欧洲精品视频一区二区 | 色综合婷婷 | 在线观看www91 | 免费观看第二部31集 | 国产福利一区二区三区视频 | 92精品国产成人观看免费 | 欧洲精品视频一区 | 国产最新视频在线观看 | 国产一区二区精品 | 久久久久女人精品毛片九一 | av免费电影在线观看 | 国产黄色在线网站 | 伊人久久精品久久亚洲一区 | www久久99| 日韩理论在线播放 | 亚洲在线视频免费观看 | 有码中文字幕在线观看 | www久久久久 | 女人18片| 日日夜夜操操操操 | 国产天天爽 | 国产做aⅴ在线视频播放 | 国产成人一区二区精品非洲 | 国产毛片久久 | 国产91勾搭技师精品 | 天天天综合 | 精品av网站 | 亚洲日本一区二区在线 | 狠狠干综合网 | 国产在线观看二区 | 黄色的视频网站 | 91精品国自产在线 | 99视频| 日韩欧美精品一区二区三区经典 | 在线99热 | 国产黄色精品视频 | 国产精品视频app | www欧美色 | 国语自产偷拍精品视频偷 | 精品视频一区在线 | 国产亚洲精品久久久网站好莱 | 色多视频在线观看 | 久久精品3 | 国产精品黄色 | 月丁香婷婷 | 黄色毛片网站在线观看 | 涩涩色亚洲一区 | 国产成人福利在线 | 青青草国产在线 | av免费观看高清 | 天天操天天能 | 久久久国产高清 | 欧洲精品二区 | 国内精品视频在线播放 | 国产成人精品一区二区在线 | 成人av免费电影 | 亚洲欧洲一区二区在线观看 | 中文字幕亚洲高清 | 国产精品九九久久久久久久 | 麻豆精品传媒视频 | 中文字幕第 | 日韩精品欧美专区 | 西西www444| 国产精品乱码久久久久久1区2区 | 国产欧美在线一区二区三区 | 麻豆精品传媒视频 | 国产人免费人成免费视频 | 超碰在线97观看 | 人人爽人人做 | 婷婷网址| 日韩免费久久 | 久久福利精品 | 中文在线中文a | 久草在线中文视频 | 狠狠狠干狠狠 | 日韩com| 最新av免费在线 | 欧美人体xx| 三级黄色大片在线观看 | 69av视频在线观看 | 玖玖综合网 | 中文字幕一区二区三区久久 | 久久99精品久久久久久清纯直播 | 超碰99在线 | 久久夜视频 | 99精品久久久久久久久久综合 | 久久久久久久久久久久久久av | 伊人伊成久久人综合网小说 | 国内精品久久久久久久 | 中文字幕人成乱码在线观看 | 五月天综合色激情 | 婷婷久久亚洲 | 在线观看亚洲电影 | 亚洲涩涩一区 | 国产在线国偷精品产拍免费yy | 天天色.com| 丁香综合网 | 国产精品国产三级国产不产一地 | 一区二区伦理电影 | 欧美中文字幕第一页 | 久久综合电影 | 人人看人人做人人澡 | 激情久久网 | 伊人国产在线播放 | 午夜久久久久久久久 | 国产精品久久久久影院日本 | 国产在线毛片 | 手机看片国产日韩 | 看国产黄色片 | 国产字幕av | 久久精品爱视频 | 日本深夜福利视频 | www.亚洲精品| 看污网站| 国产精品a久久 | 日韩在线观看三区 | 久久久久国产成人精品亚洲午夜 | 六月婷婷久香在线视频 | 日韩专区一区二区 | 亚洲精选视频免费看 | 国产精品久久久久久久久久尿 | 中文字幕在线观看视频网站 | 97超碰中文 | 久久久国产成人 | 国产高清视频在线播放一区 | 久久影视中文字幕 | 亚洲国产精品一区二区尤物区 | 97人人模人人爽人人喊中文字 | 高清av免费一区中文字幕 | 中文字幕a∨在线乱码免费看 | 97超碰在线视 | 日韩欧美99 | 九九有精品 | 国产视频一区二区在线播放 | 天天天天天操 | a色视频| 伊人中文字幕在线 | 国产又粗又长又硬免费视频 | www.五月天激情 | 日韩高清成人在线 | 成人av在线网址 | 国产黄免费在线观看 | 国产高清专区 | 日韩中文在线字幕 | 国产一区二区日本 | 99热在线国产精品 | 夜色.com| av在线看片| 精品国产一区二 | 成年人视频在线免费播放 | 国产精品视频最多的网站 | 日本一区二区不卡高清 | 国产精品不卡视频 | 国产精品日韩欧美一区二区 | 国模精品一区二区三区 | 亚洲区二区 | 伊人热 | 九九九九精品 | 91视频久久久久久 | se视频网址 | 亚州精品天堂中文字幕 | 伊人天天操 | 在线 影视 一区 | 亚洲精品黄网站 | 久久免费视频一区 | 午夜精品一区二区国产 | 免费视频91蜜桃 | 久久夜色精品国产欧美一区麻豆 | 午夜三级大片 | 探花视频在线观看 | 日韩欧美一区二区三区视频 | 91插插插免费视频 | 99久久精品国产系列 | 日本性xxxxx 亚洲精品午夜久久久 | 女女av在线 | 国内精品视频一区二区三区八戒 | 一区二区久久久久 | 精品国产一区二区三区四区在线观看 | 亚洲天天综合网 | 国产亚洲综合在线 | 久久久久久国产精品999 | 午夜精品久久久久久久爽 | 国产h片在线观看 | 午夜三级大片 | 色99之美女主播在线视频 | 色中射 | 涩涩资源网 | 婷婷丁香久久五月婷婷 | 欧美激情视频在线观看免费 | 久久天天躁夜夜躁狠狠躁2022 | 国产自产高清不卡 | 天天干天天爽 | 久久综合色影院 | 国产成人精品亚洲精品 | 国产不卡视频在线 | 国产伦精品一区二区三区高清 | 成人免费视频视频在线观看 免费 | 九九免费观看全部免费视频 | 欧美极品xxxx | 中文字幕日韩免费视频 | 97精品国产97久久久久久粉红 | 一区二区三区精品在线视频 | 婷婷六月综合亚洲 | 久久国内精品视频 | 国产99久久久国产精品免费看 | 欧美精品国产精品 | 玖玖玖在线 | 爱色av.com| 久久国产精品免费一区 | 亚洲永久免费av | 91福利社在线观看 | 日韩精品在线视频 | 四虎小视频 | 精品国产成人av | 久久看片网 | 在线影视 一区 二区 三区 | 亚洲精品tv| bbbb操bbbb| 亚洲成人资源在线 | 最新99热| 日韩三级一区 | 亚洲视频精品 | 四虎影视www | 亚洲区另类春色综合小说 | 免费久久久久久久 | 亚洲国产69 | 成人免费视频网站在线观看 | 国产又黄又猛又粗 | 91香蕉视频污在线 | 国产99视频在线观看 | 香蕉日日 | 黄色av网站在线观看免费 | 96精品高清视频在线观看软件特色 | 久99久中文字幕在线 | 国产69久久久欧美一级 | 伊人午夜视频 | 久久嗨 | 2019中文字幕第一页 | 九九色在线观看 | 国产黄色大片 | 国产高清不卡在线 | 黄色日视频 | 中文字幕乱码亚洲精品一区 | 狠狠久久 | 十八岁以下禁止观看的1000个网站 | 亚洲aⅴ乱码精品成人区 | 国产乱对白刺激视频在线观看女王 | 国内亚洲精品 | 欧美一区二区三区激情视频 | 91精品国产一区二区在线观看 | 国产在线视频一区二区 | 99久久电影 | 免费a级大片 | 96视频在线 | 精品国模一区二区 | 伊人久久国产精品 | 久久黄色影院 | 久久avav| 国产精品久久久区三区天天噜 | 91桃花视频 | 亚洲国产精久久久久久久 | 国产一级片播放 | 精品免费国产一区二区三区四区 | 欧美色图30p | 9999激情 | av一区二区在线观看中文字幕 | 久草在线视频精品 |