亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java基礎——集合

2019-11-15 00:34:25
字體:
來源:轉載
供稿:網友
java基礎——集合

集合與數組的區別:

1.數組是固定長度的;集合的長度是可變的。

2.數組可以存儲基本數據類型,也可以存儲引用數據類型;集合只能存儲引用數據類型。

3.數組存儲元素必須是同一個數據類型;集合存儲的對象可以是不同數據類型。

java集合主要有3種重要的類型:

●List:是一個有序集合,可以存放重復的數據。

●Set: 是一個無序集合,不允許存放重復的數據。

●Map: 是一個無序集合,集合中包含一個鍵對象和一個值對象, 鍵對象不允許重復,值對象可以重復。

下面是集合繼承結構圖-Collection部分,從圖中可以很清楚的知道Collection接口下的子接口與實現類的關系。

Collection集合的常用方法:

boolean add(Object o): 向集合中添加元素

boolean addAll(Collection c):把集合c中的元素添加到指定的集合中

void clear():清空集合

boolean isEmpty():判斷集合中是否有元素

Iterator iterator(): 獲取集合所依賴的迭代器對象

boolean contains(Object o): 判斷集合中是否包含某個元素

boolean remove(Object o): 刪除集合中某個元素

int size(): 獲取集合中元素的個數

Object[] toArray(): 將集合轉換成數組

 1 import java.util.*; 2  3 public class CollectionDemo { 4     public static void main(String[] args) { 5  6         // 創建集合 7         Collection c = new ArrayList();// 多態 8  9         // 添加元素10         c.add(100); // 自動裝箱11         c.add("Java編程");12 13         Person p = new Person("Bill", 21);14         c.add(p);// Collection集合只能單個存儲元素,并且只能存儲引用類型15 16         // 獲取元素個數17         System.out.PRintln(c.isEmpty());// false 說明集合c不為空18         System.out.println("c集合的元素個數為:" + c.size());// 個數為319 20         // 將集合轉換成Object類型的數組21         Object[] obj = c.toArray();22         for (int i = 0; i < obj.length; i++) {23 24             // 輸出結果:100 Java編程 Person[name=Bill,age=21]25             System.out.println(obj[i]);26         }27 28         // 刪除指定元素29         c.remove(100); // 元素100已刪30         System.out.println("c集合的元素個數為:" + c.size());// 個數為231 32         // 清空33         c.clear();34         System.out.println(c.isEmpty());// true 說明集合c為空35         System.out.println("c集合的元素個數為:" + c.size());// 個數為036 37     }38 }39 40 class Person {41     String name;42     int age;43 44     Person(String name, int age) {45         this.name = name;46         this.age = age;47     }48 49     // 重寫Object中的toString方法50     public String toString() {51         return "Person[name=" + name + ",age=" + age + "]";52     }53 54 }
View Code

Iterator iterator();獲取集合所依賴的迭代器對象

通過迭代器中的方法完成集合的迭代(遍歷)

這種方式是所有集合通用的遍歷方式

Itertor接口定義的三個方法:

boolean hasNext():如果仍有元素可以迭代,則返回 true。

Object next(): 返回迭代的下一個元素。

void remove(): 從迭代器指向的 collection 中移除迭代器返回的最后一個元素(可選操作)。

Iterator必須依附于Collection對象,若有一個Iterator對象,則必然有一個與之關聯的Collection對象。

當使用Iterator對集合元素進行迭代時,Iterator并不是把集合元素本身傳給迭代變量,而是把集合元素的值傳給迭代變量,因此當修改迭代變量的值時對集合元素本身沒有任何影響

注意:當使用Iterator迭代訪問Collection集合元素時,Collection集合里的元素不能被改變,只能通過Iterator的remove方法刪除上一次next方法返回的集合元素,否則將會引發java.util.CencurrentModificationException異常。

 1 import java.util.*; 2 public class IteratorDemo { 3  4     public static void main(String[] args) { 5  6         // 創建一個集合 7         Collection books = new HashSet(); 8         books.add("三國演義"); 9         books.add("西游記");10         books.add("水滸傳");11 12         // 獲取books集合對應的迭代器13         Iterator it = books.iterator();14         while (it.hasNext()) {15             // it.next()方法返回的是Object類型,需強制類型轉換16             String str = (String) it.next();17             System.out.println(str);18 19             if (str.equals("三國演義")) {20                 // 從集合中刪除上一次next方法返回的元素21                 it.remove();// 通過迭代器刪除22 23                 // 不要使用集合自身所帶的remove方法,會引發異常24                 // books.remove(str);25             }26             // 對str變量賦值,不會改變集合元素本身27             str = "紅樓夢";// 此處代碼對集合沒有任何影響28         }29         System.out.println(books);// [西游記, 水滸傳]30     }31 }
View Code

boolean contains(Object o):判斷集合中是否包含某個元素存儲在集合中的元素應該重寫equals方法

 1 import java.util.*; 2 public class ContainsDemo { 3  4     public static void main(String[] args) { 5  6         // 創建集合 7         Collection c = new ArrayList(); 8  9         // 創建Integer類型對象10         Integer i1 = new Integer(100);11 12         // 添加元素13         c.add(i1);14 15         // 判斷集合中是否包含i116         System.out.println(c.contains(i1));// true17 18         // 創建另一個Integer類型對象19         Integer i2 = new Integer(100);20         // contains方法底層調用的是equals方法。Integer重寫了equals方法,i1就是i221         System.out.println(c.contains(i2));// true22 23         // 創建一個Student對象24         Student s1 = new Student(100, "Bill");25         // 添加到集合里26         c.add(s1);27         // 判斷集合c中是否包含s128         System.out.println(c.contains(s1));// true29 30         // 創建另一個Student對象31         Student s2 = new Student(100, "Bill");32         // 重寫equals方法之前,比較的是內存33         // System.out.println(c.contains(s2));//false34 35         // 重寫equals方法之后,比較的是內容36         System.out.println(c.contains(s2));// true37     }38 }39 40 class Student {41     int no;42     String name;43 44     Student(int no, String name) {45         this.no = no;46         this.name = name;47     }48 49     // 重寫equals方法50     // 要求:編號和姓名相同則表示同一個Student51     public boolean equals(Object o) {52         if (this == o) {53             return true;54         }55         if (o instanceof Student) {56             Student s = (Student) o;57             if (s.no == this.no && s.name == this.name) {58                 return true;59             }60         }61         return false;62     }63 }
View Code

List集合

ArrayList集合底層是數組。數組是有下標的. 所以ArrayList集合有很多自己的特性.

ArrayList集合底層默認初始化容量是 10. 擴大之后的容量是原容量的1.5倍.

Vector集合底層默認初始化容量也是10.擴大之后的容量是原容量的2倍.

如何優化ArrayList和Vector?

盡量減少擴容操作,因為擴容需要數組拷貝。數組拷貝很耗內存。一般推薦在創建集合的時候指定初始化容量。

 1 import java.util.*; 2 public class ListDemo { 3  4     public static void main(String[] args) { 5  6         // 創建List集合 7         List li = new ArrayList(); 8         // List li = new LinkedList(); 9 10         // 添加元素11         li.add(100);12         li.add(200);13         li.add(400);14 15         // 在下標為2的位置上添加30016         li.add(2, 300);17 18         // 取得第一個元素19         System.out.println(li.get(0));// 10020 21         // 遍歷(List集合特有的遍歷方式)22         for (int i = 0; i < li.size(); i++) {23             Object o = li.get(i);24             System.out.println(o);25         }26 27         // 迭代器也可以28         Iterator it = li.iterator();29         while (it.hasNext()) {30             System.out.println(it.next());31         }32     }33 }
View Code

Set集合:HashSet

1.HashSet底層實際上是一個HashMap,HashMap底層采用了哈希表數據結構。

2.哈希表又叫做散列表,哈希表底層是一個數組,這個數組中每一個元素是一個單向鏈表。每個單向鏈表都有一個獨一無二的hash值,代表數組的下標。在某個單向鏈表中的每一個節點上的hash值是相等的。hash值實際上是key調用hashCode方法,在通過"hash function"轉換成的值。

3.如何向哈希表中添加元素:先調用被存儲的key的hashCode方法,經過某個算法得出hash值,如果在這個哈希表中不存在這個 hash值,則直接加入元素。如果該hash值已經存在,繼續調用key之間的equals方法,如果equals方法返回false,則將該元素添加。如果equals方法返回true,則放棄添加該元素。

4.HashSet其實是HashMap中的key部分。HashSet有什么特點,HashMap中的key 應該具有相同的特點。

5.HashMap和HashSet初始化容量都是 16,默認加載因子是0.75,即當存儲容量達到75%時就擴容。

6.關于往Set集合中存儲的元素,該元素的hashCode和equals方法:

HashMap中有一個put方法,put(key,value) key是無序不可重復的.

結論:存儲在HashSet集合或者HashMap集合key部分的元素,需要同時重寫hashCode+equals

 1 import java.util.*; 2 public class SetDemo { 3  4     public static void main(String[] args) { 5          6         // Set集合存儲元素是無序不可重復的,這里就不做測試了 7          8         //創建集合 9         Set s = new HashSet();10         11         //這里假設鍵值重復只為做測試,實際上是不可重復的12         Employee e1 = new Employee("1000","JACK");13         Employee e2 = new Employee("1000","JACK");14         Employee e3 = new Employee("1000","SCOTT");15         Employee e4 = new Employee("2001","SUN");16         Employee e5 = new Employee("3000","JIM");17         Employee e6 = new Employee("3001","COOK");18         19         System.out.println(e1.hashCode());//重寫hashCode方法后e1就是e220         System.out.println(e2.hashCode());21         22         //添加元素23         s.add(e1);24         s.add(e2);25         s.add(e3);26         s.add(e4);27         s.add(e5);28         s.add(e6);29         30         //查看集合元素個數31         System.out.println(s.size()); //532         33     }34 }35 36 //假設該公司員工編號是: 1000 - 999937 class Employee{38     39     //編號40     String no;41     42     //姓名43     String name;44     45     //Constructor46     Employee(String no,String name){47         this.no = no;48         this.name = name;49     }50     51     //重寫equals方法.52     //如果員工編號相同,并且名字相同,則是同一個對象53     public boolean equals(Object o){54         if(this==o){55             return true;56         }57         if(o instanceof Employee){58             Employee e = (Employee)o;59             if(e.no.equals(this.no) && e.name.equals(this.name)){60                 return true;61             }62         }63         64         return false;65     }66     67     //重寫hashCode方法.68     public int hashCode(){69         //以員工編號分組.70         return no.hashCode();71     }72 }
View Code

先對SortedSet做測試

 1 import java.text.*; 2 import java.util.*; 3  4 public class SortedSetDemo01 { 5  6     public static void main(String[] args) throws Exception { 7  8         // 創建集合 9         SortedSet ss = new TreeSet();10 11         // 測試Integer類型12         ss.add(10); // 自動裝箱13         ss.add(20);14         ss.add(15);15         ss.add(30);16         ss.add(25);17         ss.add(9);18 19         // 遍歷20         Iterator it = ss.iterator();21         while (it.hasNext()) {22             Object element = it.next();23             System.out.println(element);//9 10 15 20 25 3024         }25 26         // 測試String類型27         SortedSet strs = new TreeSet();28 29         strs.add("JACK");30         strs.add("SUN");31         strs.add("KOOK");32         strs.add("LUCY");33         strs.add("KING");34 35         // 遍歷36         it = strs.iterator();37         while (it.hasNext()) {38             Object element = it.next();39             System.out.println(element);40             /*輸出:JACK41                   KING42                   KOOK43                   LUCY44                   SUN*/45         }46 47         // 測試日期Date類型48         String st1 = "2008-08-08";49         String st2 = "2009-08-08";50         String st3 = "2008-09-08";51         String st4 = "2008-08-09";52         String st5 = "2012-08-08";53 54         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");55 56         Date t1 = sdf.parse(st1);57         Date t2 = sdf.parse(st2);58         Date t3 = sdf.parse(st3);59         Date t4 = sdf.parse(st4);60         Date t5 = sdf.parse(st5);61 62         // 添加63         SortedSet times = new TreeSet();64 65         times.add(t5);66         times.add(t2);67         times.add(t3);68         times.add(t4);69         times.add(t1);70 71         // 遍歷72         it = times.iterator();73         while (it.hasNext()) {74             Object element = it.next();75             if (element instanceof Date) {76                 Date d = (Date) element;77                 78                 System.out.println(sdf.format(d));79                 /*輸出:2008-08-0880                         2008-08-0981                       2008-09-0882                       2009-08-0883                       2012-08-08*/84             }85         }86     }87 }
View Code

SortedSet集合存儲元素為什么可以自動排序?  因為被存儲的元素實現了Comparable接口, SUN編寫TreeSet集合在添加元素的時候,會調用compareTo方法完成比較.

 1 import java.util.*; 2  3 public class SortedSetDemo02 { 4  5     public static void main(String[] args) { 6  7         SortedSet users = new TreeSet(); 8  9         User u1 = new User(15);10         User u2 = new User(16);11         User u3 = new User(25);12         User u4 = new User(13);13         User u5 = new User(11);14 15         // 添加元素16         users.add(u1);17         users.add(u2);18         users.add(u3);19         users.add(u4);20         users.add(u5);21 22         // 遍歷23         Iterator it = users.iterator();24         while (it.hasNext()) {25             //輸出:User[age=11] User[age=13] User[age=15] User[age=16] User[age=25]26             System.out.println(it.next());27         }28     }29 30 }31 32 // 這是第一種方式.33 class User implements Comparable {34 35     int age;36 37     User(int age) {38         this.age = age;39     }40 41     public String toString() {42         return "User[age=" + age + "]";43     }44 45     // 實現java.lang.Comparable;接口中的compareTo方法46     // 該方法程序員負責實現,SUN提供的程序已經調用了該方法.47     // 需求:按照User的age排序48     public int compareTo(Object o) {49         // 編寫一個比較規則.50         int age1 = this.age;51         int age2 = ((User) o).age;52         return age1 - age2;53     }54 }
View Code

讓SortedSet集合做到排序還有另一種方式:java.util.Comparator;

單獨編寫一個比較器.

 1 import java.util.*; 2  3 public class SortedSetDemo03 { 4  5     public static void main(String[] args) { 6  7         // 創建TreeSet集合的時候提供一個比較器. 8         SortedSet products = new TreeSet(new ProductComparator()); 9 10         // 匿名內部類:不推薦使用,因為比較器無法得到重復利用。11         /*12          * SortedSet products = new TreeSet(new Comparator() { // 需求:按照商品價格排序13          * public int compare(Object o1, Object o2) {14          * 15          * double price1 = ((Product) o1).price; double price2 = ((Product)16          * o2).price;17          * 18          * if (price1 == price2) { return 0; } else if (price1 > price2) {19          * return 1; } else { return -1; } } });20          */21 22         Product p1 = new Product(3.4);23         Product p2 = new Product(4.0);24         Product p3 = new Product(3.0);25         Product p4 = new Product(2.0);26         Product p5 = new Product(5.0);27 28         // 添加元素29         products.add(p1);30         products.add(p2);31         products.add(p3);32         products.add(p4);33         products.add(p5);34 35         // 遍歷36         Iterator it = products.iterator();37         while (it.hasNext()) {38             //輸出2.0 3.0 3.4 4.0 5.039             System.out.println(it.next());40             41         }42     }43 44 }45 46 class Product {47 48     double price;49 50     Product(double price) {51         this.price = price;52     }53 54     public String toString() {55         return price + "";56     }57 58 }59 60 // 第二種方法單獨編寫一個比較器61 62 class ProductComparator implements Comparator {63 64     // 需求:按照商品價格排序65     public int compare(Object o1, Object o2) {66 67         double price1 = ((Product) o1).price;68         double price2 = ((Product) o2).price;69 70         if (price1 == price2) {71             return 0;72         } else if (price1 > price2) {73             return 1;74         } else {75             return -1;76         }77     }78 79 }
View Code

下面是集合繼承結構圖-Map部分,從圖中可以清楚的知道Map接口下子接口與實現類的關系。

關于Map集合中常用的方法

void clear(); 清空Mapboolean isEmpty();判斷該集合是否為空int size(); 獲取Map中鍵值對的個數。 Object put(Object key, Object value); 向集合中添加鍵值對Object get(Object key);通過key獲取value boolean containsKey(Object key); 判斷Map中是否包含這樣的keyboolean containsValue(Object value); 判斷Map中是否包含這樣的value Object remove(Object key); 通過key將鍵值對刪除.Collection values(); 獲取Map集合中所有的valueSet keySet(); 獲取Map中所有的keySet entrySet();返回此映射中包含的映射關系的 Set 視圖。

注意:存儲在Map集合key部分的元素需要同時重寫hashCode+equals方法.

 1 import java.util.*; 2  3 public class MapDemo01{ 4      5     public static void main(String[] args){ 6          7         //1.創建Map集合 8         Map persons = new HashMap(); //HashMap的默認初始化容量是16,默認加載因子是0.75 9         10         //2.存儲鍵值對11         persons.put("10000","JACK");12         persons.put("10011","JACK");13         persons.put("10002","SUN");14         persons.put("10003","COOK");15         persons.put("10004","KING");16         persons.put("10000","LUCY");17         18         //3.判斷鍵值對的個數19         //Map中的key是無序不可重復的.和HashSet相同.20         System.out.println(persons.size());//521         22         //4.判斷集合中是否包含這樣的key23         System.out.println(persons.containsKey("10000")); //true24         25         //5.判斷集合中是否包含這樣的value26         //注意:Map中如果key重復了,value采用的是“覆蓋”。27         System.out.println(persons.containsValue("LUCY")); //true28         29         //6.通過key獲取value30         String k = "10002";31         Object v = persons.get(k);32         System.out.println(v); //SUN33         34         //7.通過key刪除鍵值對35         persons.remove("10002");36         System.out.println(persons.size()); //437         38         //8.獲取所有的value39         Collection values = persons.values();40         Iterator it = values.iterator();41         while(it.hasNext()){42             System.out.println(it.next()); 43             /*LUCY44               JACK45               COOK46               KING*/47         }48         49         //9.獲取所有的key50         //以下程序演示如何遍歷Map集合.51         Set keys = persons.keySet();52         53         Iterator it2 = keys.iterator();54         55         while(it2.hasNext()){56             Object id = it2.next();57             Object name = persons.get(id);58             System.out.println(id+"-->"+name);59             /*10000-->LUCY60             10011-->JACK61             10003-->COOK62             10004-->KING*/63 64         }65         66         //10.entrySet67         //將Map轉換成Set集合.68         /*69         Set entrySet = persons.entrySet();70         Iterator it3 = entrySet.iterator();71         while(it3.hasNext()){72             System.out.println(it3.next());73         }74         */75         76     }77 }
View Code

使用集合的技巧:

看到Array就是數組結構,有角標,查詢速度很快。

看到link就是鏈表結構:增刪速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();

看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到該結構的中的元素必須覆蓋hashCode,equals方法。

看到tree就是二叉樹,就要想到排序,就想要用到比較。

比較的兩種方式:

一個是Comparable:覆蓋compareTo方法;

一個是Comparator:覆蓋compare方法。

LinkedHashSet,LinkedHashMap:這兩個集合可以保證哈希表有存入順序和取出順序一致,保證哈希表有序。

  這是我在自學到java集合時通過看視頻所整理出來的一部分內容,馬馬虎虎。在此感謝授課老師將視頻分享,讓在黑暗中摸索的我看到了一絲光明。把自己學到的一些知識分享出來是快樂的,這樣也能鞭策自己,磨礪自己。所謂當局者迷,旁觀者清,在此還望各位前輩不吝賜教,指出不足之處,這樣我也才能更好的認清自己。下面附上我所看視頻的下載地址:http://pan.baidu.com/s/1i342Y6x


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲剧情一区二区| 亚洲经典中文字幕| 亚洲激情久久久| 亚洲欧美一区二区三区情侣bbw| 国产99久久久欧美黑人| 久久精品国产久精国产一老狼| 国产精品成熟老女人| 69影院欧美专区视频| 中文字幕在线日韩| 欧美精品一区二区免费| 国产精品一区二区性色av| 久久91精品国产91久久跳| 色狠狠av一区二区三区香蕉蜜桃| 欧美精品在线视频观看| 欧美日韩亚洲国产一区| 亚洲欧洲视频在线| 国产欧美亚洲精品| 精品久久久久久电影| 国产日韩在线免费| 国产亚洲美女久久| 欧美日韩人人澡狠狠躁视频| 在线电影中文日韩| 国产一区二区视频在线观看| 精品国产精品三级精品av网址| 日韩美女写真福利在线观看| 日韩欧美成人免费视频| 韩国v欧美v日本v亚洲| 亚洲国产精品va在看黑人| 国产成人综合亚洲| 亚洲国产精彩中文乱码av| 亚洲一区二区三区乱码aⅴ| 日日骚av一区| 7m精品福利视频导航| 精品国产鲁一鲁一区二区张丽| 色偷偷噜噜噜亚洲男人的天堂| 亚洲精品999| 欧美激情视频在线观看| 欧美香蕉大胸在线视频观看| 国产亚洲一区二区精品| 91久久精品国产91性色| 91沈先生作品| 久久久免费高清电视剧观看| 亚洲aⅴ日韩av电影在线观看| 久久视频这里只有精品| 亚洲在线免费观看| 亚洲第一天堂av| 久久久久九九九九| 亚洲精品www久久久久久广东| 国语自产精品视频在免费| 亚洲精品在线看| 久久久久久久国产精品视频| 日本中文字幕成人| 久久久久久久久久av| 久久资源免费视频| 日日摸夜夜添一区| 欧美激情一区二区三区高清视频| 久久精品国产亚洲精品2020| 91九色国产视频| 在线观看国产精品淫| 日韩大胆人体377p| 久久亚洲精品一区| 日本韩国欧美精品大片卡二| 欧美成人黄色小视频| 国产美女主播一区| 日本不卡高字幕在线2019| 韩国欧美亚洲国产| 亚洲色无码播放| 国产成人拍精品视频午夜网站| 一区二区成人精品| 91精品国产自产91精品| 456亚洲影院| 在线成人激情黄色| 欧美日在线观看| 日韩视频在线观看免费| 久久久精品一区| 亚洲国产精品美女| 国产一区二区三区日韩欧美| 国产性猛交xxxx免费看久久| 国产成人黄色av| 日本亚洲精品在线观看| 久久人人爽人人爽人人片av高请| 中文字幕亚洲国产| 九九久久国产精品| 97在线视频精品| 亚洲国产成人久久综合| 国产69精品99久久久久久宅男| 2021国产精品视频| 欧美在线亚洲一区| 亚洲精品永久免费| 欧美日韩亚洲视频一区| 日韩av在线免费| 亚洲电影免费观看| 亚洲美腿欧美激情另类| 中文字幕日韩av| 欧美成人一区二区三区电影| 97香蕉超级碰碰久久免费的优势| 欧美精品videosex牲欧美| 粉嫩老牛aⅴ一区二区三区| 精品国产一区av| 成人午夜高潮视频| 超在线视频97| 亚洲国产又黄又爽女人高潮的| 欧美成人一区在线| 国内精品久久久久影院 日本资源| 97人洗澡人人免费公开视频碰碰碰| 78色国产精品| 欧美在线免费观看| 日韩精品黄色网| 亚洲aⅴ日韩av电影在线观看| 精品中文字幕视频| 亚洲美女在线视频| 国产精品免费福利| 欧美视频在线观看 亚洲欧| 国产在线不卡精品| 久久精品国产91精品亚洲| 国产精品久久久久久久久久久久久久| 日本精品中文字幕| 日本午夜精品理论片a级appf发布| 成人欧美在线视频| 午夜精品久久久久久久99热浪潮| 欧美另类99xxxxx| 亚洲毛茸茸少妇高潮呻吟| 3344国产精品免费看| 亚洲日韩中文字幕在线播放| 北条麻妃一区二区三区中文字幕| 成人黄色av网站| 日本久久久久久久| 欧美精品videos| 欧美国产日韩xxxxx| 欧美性猛交xxxx富婆弯腰| 日韩欧美在线观看视频| 日韩欧美精品中文字幕| 亚洲自拍偷拍福利| 欧美性猛交丰臀xxxxx网站| 欧美日韩中文字幕日韩欧美| 精品福利免费观看| 欧美日韩亚洲精品一区二区三区| 亚洲精品成a人在线观看| 国产成人精品免高潮费视频| 国产精品免费视频xxxx| 亚洲女人天堂成人av在线| 国产欧美日韩中文字幕在线| 91视频免费网站| 欧美xxxx18性欧美| 欧美成人午夜剧场免费观看| 欧美高清视频一区二区| 日韩av在线一区二区| 91热福利电影| 少妇精69xxtheporn| 亚洲精品成人av| 国产福利精品av综合导导航| 国产精品精品视频| 久久久久久久影院| 91啪国产在线| 国产免费一区二区三区在线观看| 欧美一级高清免费播放| 国产精品免费一区二区三区都可以| 亚洲全黄一级网站| 啪一啪鲁一鲁2019在线视频| 国产精品丝袜白浆摸在线| 日韩hd视频在线观看| 三级精品视频久久久久| 国产在线98福利播放视频| 美女视频黄免费的亚洲男人天堂|