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

Guava - 拯救垃圾代碼,寫出優(yōu)雅高效,效率提升N倍

開發(fā) 后端
最近在看一個同學(xué)代碼的時候,發(fā)現(xiàn)代碼中大量使用了 Google 開源的 Guava 核心庫中的內(nèi)容,讓代碼簡單清晰了不少,故學(xué)習(xí)分享出 Guava 中我認為最實用的功能。

[[349982]]

最近在看一個同學(xué)代碼的時候,發(fā)現(xiàn)代碼中大量使用了 Google 開源的 Guava 核心庫中的內(nèi)容,讓代碼簡單清晰了不少,故學(xué)習(xí)分享出 Guava 中我認為最實用的功能。

Guava 項目是 Google 公司開源的 Java 核心庫,它主要是包含一些在 Java 開發(fā)中經(jīng)常使用到的功能,如數(shù)據(jù)校驗、不可變集合、計數(shù)集合,集合增強操作、I/O、緩存、字符串操作等。并且 Guava 廣泛用于 Google 內(nèi)部的 Java 項目中,也被其他公司廣泛使用,甚至在新版 JDK 中直接引入了 Guava 中的優(yōu)秀類庫,所以質(zhì)量毋庸置疑。

使用方式直接 mavan 依賴引入。

  1. <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> 
  2. <dependency> 
  3.     <groupId>com.google.guava</groupId> 
  4.     <artifactId>guava</artifactId> 
  5.     <version>30.0-jre</version> 
  6. </dependency> 

數(shù)據(jù)校驗

數(shù)據(jù)校驗說來十分簡單,一是非空判斷,二是預(yù)期值判斷。非空判斷我想每一個 Java 開發(fā)者都很熟悉,一開始都經(jīng)常和 NullPointException 打交道。處理的方式我們自然是一個 if( xx == null) 就能輕松解決。預(yù)期值判斷也是類似,檢查數(shù)據(jù)值是不是自己想要的結(jié)果即可。

即使這么簡單的操作,我們是不是還經(jīng)常出錯呢?而且寫起來的代碼總是一行判斷一行異常拋出,怎么看都覺得那么優(yōu)雅。還好,現(xiàn)在就來嘗試第一次使用 Guava 吧。

非空判斷

 

  1. String param = "未讀代碼"
  2. String name = Preconditions.checkNotNull(param); 
  3. System.out.println(name); // 未讀代碼 
  4. String param2 = null
  5. String name2 = Preconditions.checkNotNull(param2); // NullPointerException 
  6. System.out.println(name2); 

引入了 Guava 后可以直接使用 Preconditions.checkNotNull 進行非空判斷,好處為覺得有兩個,一是語義清晰代碼優(yōu)雅;二是你也可以自定義報錯信息,這樣如果參數(shù)為空,報錯的信息清晰,可以直接定位到具體參數(shù)。

  1. String param2 = null
  2. String name2 = Preconditions.checkNotNull(param2,"param2 is null"); 
  3. // java.lang.NullPointerException: param2 is null 

預(yù)期值判斷

和非空判斷類似,可以比較當前值和預(yù)期值,如果不相等可以自定義報錯信息拋出。

  1. String param = "www.wdbyte.com2"
  2. String wdbyte = "www.wdbyte.com"
  3. Preconditions.checkArgument(wdbyte.equals(param), "[%s] 404 NOT FOUND", param); 
  4. // java.lang.IllegalArgumentException: [www.wdbyte.com2] 404 NOT FOUND 

是否越界

Preconditions 類還可以用來檢查數(shù)組和集合的元素獲取是否越界。

  1. // Guava 中快速創(chuàng)建ArrayList 
  2. List<String> list = Lists.newArrayList("a""b""c""d"); 
  3. // 開始校驗 
  4. int index = Preconditions.checkElementIndex(5, list.size()); 
  5. // java.lang.IndexOutOfBoundsException: index (5) must be less than size (4) 

代碼中快速創(chuàng)建 List 的方式也是 Guava 提供的,后面會詳細介紹 Guava 中集合創(chuàng)建的超多姿勢。

不可變的集合

創(chuàng)建不可變集合是我個人最喜歡 Guava 的一個原因,因為創(chuàng)建一個不能刪除、不能修改、不能增加元素的集合實在是太實用了。這樣的集合你完全不用擔(dān)心發(fā)生什么問題,總的來說有下面幾個優(yōu)點:

  1. 線程安全,因為不能修改任何元素,可以隨意多線程使用且沒有并發(fā)問題。
  2. 可以無憂的提供給第三方使用,反正修改不了。
  3. 減少內(nèi)存占用,因為不能改變,所以內(nèi)部實現(xiàn)可以最大程度節(jié)約內(nèi)存占用。
  4. 可以用作常量集合。

創(chuàng)建方式

說了那么多,那么到底怎么使用呢?趕緊擼起代碼來。

  1. // 創(chuàng)建方式1:of 
  2. ImmutableSet<String> immutableSet = ImmutableSet.of("a""b""c"); 
  3. immutableSet.forEach(System.out::println); 
  4. // a 
  5. // b 
  6. // c 
  7.  
  8. // 創(chuàng)建方式2:builder 
  9. ImmutableSet<String> immutableSet2 = ImmutableSet.<String>builder() 
  10.     .add("hello"
  11.     .add(new String("未讀代碼")) 
  12.     .build(); 
  13. immutableSet2.forEach(System.out::println); 
  14. // hello 
  15. // 未讀代碼 
  16.  
  17. // 創(chuàng)建方式3:從其他集合中拷貝創(chuàng)建 
  18. ArrayList<String> arrayList = new ArrayList(); 
  19. arrayList.add("www.wdbyte.com"); 
  20. arrayList.add("https"); 
  21. ImmutableSet<String> immutableSet3 = ImmutableSet.copyOf(arrayList); 
  22. immutableSet3.forEach(System.out::println); 
  23. // www.wdbyte.com 
  24. // https 

都可以正常打印遍歷結(jié)果,但是如果進行增刪改,會直接報 UnsupportedOperationException .

其實 JDK 中也提供了一個不可變集合,可以像下面這樣創(chuàng)建。

  1. ArrayList<String> arrayList = new ArrayList(); 
  2. arrayList.add("www.wdbyte.com"); 
  3. arrayList.add("https"); 
  4. // JDK Collections 創(chuàng)建不可變 List 
  5. List<String> list = Collections.unmodifiableList(arrayList); 
  6. list.forEach(System.out::println);// www.wdbyte.com https 
  7. list.add("未讀代碼"); // java.lang.UnsupportedOperationException 

注意事項

1.使用 Guava 創(chuàng)建的不可變集合是拒絕 null 值的,因為在 Google 內(nèi)部調(diào)查中,95% 的情況下都不需要放入 null 值。

2.使用 JDK 提供的不可變集合創(chuàng)建成功后,原集合添加元素會體現(xiàn)在不可變集合中,而 Guava 的不可變集合不會有這個問題。

  1. List<String> arrayList = new ArrayList<>(); 
  2.    arrayList.add("a"); 
  3.    arrayList.add("b"); 
  4.    List<String> jdkList = Collections.unmodifiableList(arrayList); 
  5.    ImmutableList<String> immutableList = ImmutableList.copyOf(arrayList); 
  6.    arrayList.add("ccc"); 
  7.    jdkList.forEach(System.out::println);// result: a b ccc 
  8.    System.out.println("-------"); 
  9.    immutableList.forEach(System.out::println);// result: a b 

3.如果不可變集合的元素是引用對象,那么引用對象的屬性是可以更改的。

其他不可變集合

不可變集合除了上面演示的 set 之外,還有很多不可變集合,下面是 Guava 中不可變集合和其他集合的對應(yīng)關(guān)系。

可變集合接口 屬于JDK還是Guava 不可變版本
Collection JDK ImmutableCollection
List JDK ImmutableList
Set JDK ImmutableSet
SortedSet/NavigableSet JDK ImmutableSortedSet
Map JDK ImmutableMap
SortedMap JDK ImmutableSortedMap
Multiset Guava ImmutableMultiset
SortedMultiset Guava ImmutableSortedMultiset
Multimap Guava ImmutableMultimap
ListMultimap Guava ImmutableListMultimap
SetMultimap Guava ImmutableSetMultimap
BiMap Guava ImmutableBiMap
ClassToInstanceMap Guava ImmutableClassToInstanceMap
Table Guava ImmutableTable

集合操作工廠

其實這里只會介紹一個創(chuàng)建方法,但是為什么還是單獨拿出來介紹了呢?看下去你就會大呼好用。雖然 JDK 中已經(jīng)提供了大量的集合相關(guān)的操作方法,用起來也是非常的方便,但是 Guava 還是增加了一些十分好用的方法,保證讓你用上一次就愛不釋手,

創(chuàng)建集合。

  1. // 創(chuàng)建一個 ArrayList 集合 
  2. List<String> list1 = Lists.newArrayList(); 
  3. // 創(chuàng)建一個 ArrayList 集合,同時塞入3個數(shù)據(jù) 
  4. List<String> list2 = Lists.newArrayList("a""b""c"); 
  5. // 創(chuàng)建一個 ArrayList 集合,容量初始化為10 
  6. List<String> list3 = Lists.newArrayListWithCapacity(10); 
  7.  
  8. LinkedList<String> linkedList1 = Lists.newLinkedList(); 
  9. CopyOnWriteArrayList<String> cowArrayList = Lists.newCopyOnWriteArrayList(); 
  10.  
  11. HashMap<Object, Object> hashMap = Maps.newHashMap(); 
  12. ConcurrentMap<Object, Object> concurrentMap = Maps.newConcurrentMap(); 
  13. TreeMap<Comparable, Object> treeMap = Maps.newTreeMap(); 
  14.  
  15. HashSet<Object> hashSet = Sets.newHashSet(); 
  16. HashSet<String> newHashSet = Sets.newHashSet("a""a""b""c"); 

Guava 為每一個集合都添加了工廠方法創(chuàng)建方式,上面已經(jīng)展示了部分集合的工廠方法創(chuàng)建方式。是不是十分的好用呢。而且可以在創(chuàng)建時直接扔進去幾個元素,這個簡直太贊了,再也不用一個個 add 了。

集合交集并集差集

過于簡單,直接看代碼和輸出結(jié)果吧。

  1. Set<String> newHashSet1 = Sets.newHashSet("a""a""b""c"); 
  2. Set<String> newHashSet2 = Sets.newHashSet("b""b""c""d"); 
  3.  
  4. // 交集 
  5. SetView<String> intersectionSet = Sets.intersection(newHashSet1, newHashSet2); 
  6. System.out.println(intersectionSet); // [b, c] 
  7.  
  8. // 并集 
  9. SetView<String> unionSet = Sets.union(newHashSet1, newHashSet2); 
  10. System.out.println(unionSet); // [a, b, c, d] 
  11.  
  12. // newHashSet1 中存在,newHashSet2 中不存在 
  13. SetView<String> setView = Sets.difference(newHashSet1, newHashSet2); 
  14. System.out.println(setView); // [a] 

有數(shù)量的集合

這個真的太有用了,因為我們經(jīng)常會需要設(shè)計可以計數(shù)的集合,或者 value 是 List 的 Map 集合,如果說你不太明白,看下面這段代碼,是否某天夜里你也這樣寫過。

1.統(tǒng)計相同元素出現(xiàn)的次數(shù)(下面的代碼我已經(jīng)盡可能精簡寫法了)。

JDK 原生寫法:

  1. // Java 統(tǒng)計相同元素出現(xiàn)的次數(shù)。 
  2.    List<String> words = Lists.newArrayList("a""b""c""d""a""c"); 
  3.    Map<String, Integer> countMap = new HashMap<String, Integer>(); 
  4.    for (String word : words) { 
  5.        Integer count = countMap.get(word); 
  6.        count = (count == null) ? 1 : ++count
  7.        countMap.put(word, count); 
  8.    } 
  9.    countMap.forEach((k, v) -> System.out.println(k + ":" + v)); 
  10.    /** 
  11.     * result: 
  12.     * a:2 
  13.     * b:1 
  14.     * c:2 
  15.     * d:1 
  16.     */ 

盡管已經(jīng)盡量優(yōu)化代碼,代碼量還是不少的,那么在 Guava 中有什么不一樣呢?在 Guava. 中主要是使用 HashMultiset 類,看下面。

  1. ArrayList<String> arrayList = Lists.newArrayList("a""b""c""d""a""c"); 
  2.    HashMultiset<String> multiset = HashMultiset.create(arrayList); 
  3.    multiset.elementSet().forEach(s -> System.out.println(s + ":" + multiset.count(s))); 
  4.    /** 
  5.     * result: 
  6.     * a:2 
  7.     * b:1 
  8.     * c:2 
  9.     * d:1 
  10.     */ 

是的,只要把元素添加進去就行了,不用在乎是否重復(fù),最后都可以使用 count 方法統(tǒng)計重復(fù)元素數(shù)量。看著舒服,寫著優(yōu)雅,HashMultiset 是 Guava 中實現(xiàn)的 Collection 類,可以輕松統(tǒng)計元素數(shù)量。

2.一對多,value 是 List 的 Map 集合。

假設(shè)一個場景,需要把很多動物按照種類進行分類,我相信最后你會寫出類似的代碼。

JDK 原生寫法:

  1. HashMap<String, Set<String>> animalMap = new HashMap<>(); 
  2.   HashSet<String> dogSet = new HashSet<>(); 
  3.   dogSet.add("旺財"); 
  4.   dogSet.add("大黃"); 
  5.   animalMap.put("狗", dogSet); 
  6.   HashSet<String> catSet = new HashSet<>(); 
  7.   catSet.add("加菲"); 
  8.   catSet.add("湯姆"); 
  9.   animalMap.put("貓", catSet); 
  10.   System.out.println(animalMap.get("貓")); // [加菲, 湯姆] 

最后一行查詢貓得到了貓類的 "加菲" 和 ”湯姆“。這個代碼簡直太煩做了,如果使用 Guava 呢?

  1. // use guava 
  2.    HashMultimap<String, String> multimap = HashMultimap.create(); 
  3.    multimap.put("狗""大黃"); 
  4.    multimap.put("狗""旺財"); 
  5.    multimap.put("貓""加菲"); 
  6.    multimap.put("貓""湯姆"); 
  7.    System.out.println(multimap.get("貓")); // [加菲, 湯姆] 

HashMultimap 可以扔進去重復(fù)的 key 值,最后獲取時可以得到所有的 value 值,可以看到輸出結(jié)果和 JDK 寫法上是一樣的,但是代碼已經(jīng)無比清爽。

字符串操作

作為開發(fā)中最長使用的數(shù)據(jù)類型,字符串操作的增強可以讓開發(fā)更加高效。

字符拼接

JDK 8 中其實已經(jīng)內(nèi)置了字符串拼接方法,但是它只是簡單的拼接,沒有額外操作,比如過濾掉 null 元素,去除前后空格等。先看一下 JDK 8 中字符串拼接的幾種方式。

  1. // JDK 方式一 
  2. ArrayList<String> list = Lists.newArrayList("a""b""c"null); 
  3. String join = String.join(",", list); 
  4. System.out.println(join); // a,b,c,null 
  5. // JDK 方式二 
  6. String result = list.stream().collect(Collectors.joining(",")); 
  7. System.out.println(result); // a,b,c,null 
  8. // JDK 方式三 
  9. StringJoiner stringJoiner = new StringJoiner(","); 
  10. list.forEach(stringJoiner::add); 
  11. System.out.println(stringJoiner.toString()); // a,b,c,null 

可以看到 null 值也被拼接到了字符串里,這有時候不是我們想要的,那么使用 Guava 有什么不一樣呢?

  1. ArrayList<String> list = Lists.newArrayList("a""b""c"null); 
  2. String join = Joiner.on(",").skipNulls().join(list); 
  3. System.out.println(join); // a,b,c 
  4.  
  5. String join1 = Joiner.on(",").useForNull("空值").join("旺財""湯姆""杰瑞"null); 
  6. System.out.println(join1); // 旺財,湯姆,杰瑞,空值 

可以看到使用 skipNulls() 可以跳過空值,使用 useFornull(String) 可以為空值自定義顯示文本。

字符串分割

JDK 中是自帶字符串分割的,我想你也一定用過,那就是 String 的 split 方法,但是這個方法有一個問題,就是如果最后一個元素為空,那么就會丟棄,奇怪的是第一個元素為空卻不會丟棄,這就十分迷惑,下面通過一個例子演示這個問題。

  1. String str = ",a,,b,"
  2. String[] splitArr = str.split(","); 
  3. Arrays.stream(splitArr).forEach(System.out::println); 
  4. System.out.println("------"); 
  5. /** 
  6.  * 
  7.  * a 
  8.  *  
  9.  * b 
  10.  * ------ 
  11.  */ 

你也可以自己測試下,最后一個元素不是空,直接消失了。

如果使用 Guava 是怎樣的操作方式呢?Guava 提供了 Splitter 類,并且有一系列的操作方式可以直觀的控制分割邏輯。

  1. String str = ",a ,,b ,"
  2. Iterable<String> split = Splitter.on(","
  3.     .omitEmptyStrings() // 忽略空值 
  4.     .trimResults() // 過濾結(jié)果中的空白 
  5.     .split(str); 
  6. split.forEach(System.out::println); 
  7. /** 
  8.  * a 
  9.  * b 
  10.  */ 

緩存

在開發(fā)中我們可能需要使用小規(guī)模的緩存,來提高訪問速度。這時引入專業(yè)的緩存中間件可能又覺得浪費。現(xiàn)在可以了, Guava 中提供了簡單的緩存類,且可以根據(jù)預(yù)計容量、過期時間等自動過期已經(jīng)添加的元素。即使這樣我們也要預(yù)估好可能占用的內(nèi)存空間,以防內(nèi)存占用過多。

現(xiàn)在看一下在 Guava 中緩存該怎么用。

  1. @Test 
  2. public void testCache() throws ExecutionException, InterruptedException { 
  3.  
  4.     CacheLoader cacheLoader = new CacheLoader<String, Animal>() { 
  5.         // 如果找不到元素,會調(diào)用這里 
  6.         @Override 
  7.         public Animal load(String s) { 
  8.             return null
  9.         } 
  10.     }; 
  11.     LoadingCache<String, Animal> loadingCache = CacheBuilder.newBuilder() 
  12.         .maximumSize(1000) // 容量 
  13.         .expireAfterWrite(3, TimeUnit.SECONDS) // 過期時間 
  14.         .removalListener(new MyRemovalListener()) // 失效監(jiān)聽器 
  15.         .build(cacheLoader); // 
  16.     loadingCache.put("狗", new Animal("旺財", 1)); 
  17.     loadingCache.put("貓", new Animal("湯姆", 3)); 
  18.     loadingCache.put("狼", new Animal("灰太狼", 4)); 
  19.  
  20.     loadingCache.invalidate("貓"); // 手動失效 
  21.  
  22.     Animal animal = loadingCache.get("狼"); 
  23.     System.out.println(animal); 
  24.     Thread.sleep(4 * 1000); 
  25.     // 狼已經(jīng)自動過去,獲取為 null 值報錯 
  26.     System.out.println(loadingCache.get("狼")); 
  27.     /** 
  28.      * key=貓,value=Animal{name='湯姆', age=3},reason=EXPLICIT 
  29.      * Animal{name='灰太狼', age=4} 
  30.      * key=狗,value=Animal{name='旺財', age=1},reason=EXPIRED 
  31.      * key=狼,value=Animal{name='灰太狼', age=4},reason=EXPIRED 
  32.      * 
  33.      * com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 狼. 
  34.      */ 
  35.  
  36. /** 
  37.  * 緩存移除監(jiān)聽器 
  38.  */ 
  39. class MyRemovalListener implements RemovalListener<String, Animal> { 
  40.  
  41.     @Override 
  42.     public void onRemoval(RemovalNotification<String, Animal> notification) { 
  43.         String reason = String.format("key=%s,value=%s,reason=%s", notification.getKey(), notification.getValue(), notification.getCause()); 
  44.         System.out.println(reason); 
  45.     } 
  46.  
  47. class Animal { 
  48.     private String name
  49.     private Integer age; 
  50.  
  51.     @Override 
  52.     public String toString() { 
  53.         return "Animal{" + 
  54.             "name='" + name + '\'' + 
  55.             ", age=" + age + 
  56.             '}'
  57.     } 
  58.  
  59.     public Animal(String nameInteger age) { 
  60.         this.name = name
  61.         this.age = age; 
  62.     } 

這個例子中主要分為 CacheLoader、MyRemovalListener、LoadingCache。

CacheLoader 中重寫了 load 方法,這個方法會在查詢緩存沒有命中時被調(diào)用,我這里直接返回了 null,其實這樣會在沒有命中時拋出 CacheLoader returned null for key 異常信息。

MyRemovalListener 作為緩存元素失效時的監(jiān)聽類,在有元素緩存失效時會自動調(diào)用 onRemoval 方法,這里需要注意的是這個方法是同步方法,如果這里耗時較長,會阻塞直到處理完成。

LoadingCache 就是緩存的主要操作對象了,常用的就是其中的 put 和 get 方法了。

總結(jié)

上面介紹了我認為最常用的 Guava 功能,Guava 作為 Google 公司開源的 Java 開發(fā)核心庫,個人覺得實用性還是很高的。引入后不僅能快速的實現(xiàn)一些開發(fā)中常用的功能,而且還可以讓代碼更加的優(yōu)雅簡潔。我覺得適用于每一個 Java 項目。Guava 的其他的功能你也可以自己去發(fā)現(xiàn)。它的 Github 地址是:https://github.com/google/guava.

參考

https://github.com/google/guava/wiki

 

 

責(zé)任編輯:龐桂玉 來源: Java知音
相關(guān)推薦

2024-06-27 11:22:34

2020-09-13 13:30:01

命令開發(fā)代碼

2021-01-04 07:57:07

C++工具代碼

2019-09-20 15:47:24

代碼JavaScript副作用

2022-03-11 12:14:43

CSS代碼前端

2024-12-06 06:20:00

代碼枚舉

2012-04-20 09:47:59

戴爾存儲虛擬化

2023-06-27 13:49:00

GPU通信RLHF

2019-12-24 10:40:53

Java代碼編程

2024-12-04 15:10:21

2024-03-28 14:29:46

JavaScript編程

2020-07-08 17:06:00

Python開發(fā)工具

2025-05-26 04:00:00

2020-05-29 11:27:27

VS Code遠程工具

2021-03-17 08:11:29

SpringBoot項目數(shù)據(jù)庫

2023-03-09 07:51:23

性能提升數(shù)據(jù)庫

2013-02-22 09:36:32

ImpalaHadoop大數(shù)據(jù)Cloudera

2024-10-09 12:18:38

2022-04-08 14:52:31

模型谷歌方法

2020-05-14 09:15:52

設(shè)計模式SOLID 原則JS
點贊
收藏

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

jizz日本在线播放| 最近中文字幕一区二区| 污污的视频网站在线观看| 国产精品婷婷| xxx成人少妇69| 精品人妻一区二区免费视频| 在线成人视屏| 亚洲国产日日夜夜| 亚洲第一导航| 天天舔天天干天天操| 免费欧美在线视频| 久久久亚洲天堂| 99精品中文字幕| 婷婷综合电影| 欧美成人一区二区三区片免费| 欧美日韩二三区| 国产婷婷视频在线| 久久亚洲捆绑美女| 国产传媒一区| 91午夜交换视频| 免费在线亚洲欧美| 欧美极品在线播放| 国产日产精品一区二区三区的介绍| 九色丨蝌蚪丨成人| 91精品国产综合久久福利软件| 成人综合视频在线| heyzo中文字幕在线| 亚洲天堂a在线| 欧美中文娱乐网| 午夜影院免费体验区| 国产一区不卡视频| 国产欧亚日韩视频| 亚洲毛片一区二区三区| 亚洲黄网站黄| 欧美激情伊人电影| 99视频只有精品| 欧美电影一二区| 亚洲人成免费电影| 亚洲欧美色图视频| 久久精品色综合| 日韩精品一区二区三区视频| 亚洲欧美偷拍另类| 岛国一区二区| 精品视频免费看| 国产免费视频传媒| 欧美大片免费| 色综合网站在线| 免费黄色福利视频| 无遮挡在线观看| 精品久久香蕉国产线看观看亚洲| youjizz.com在线观看| а√中文在线8| 亚洲人午夜精品天堂一二香蕉| 亚洲乱码一区二区三区| 二区三区在线| 国产精品欧美精品| 亚洲一区二区免费视频软件合集| 99青草视频在线播放视| 中文字幕第一区| 亚洲一区二区三区涩| 亚洲s色大片| 中文字幕在线不卡视频| 中国 免费 av| 欧美性爽视频| 欧美日韩国产一中文字不卡| 亚洲色欲综合一区二区三区| 黑人巨大精品| 欧美视频在线观看一区| 污污的视频免费观看| 老司机亚洲精品一区二区| 日韩欧美国产wwwww| 日韩av无码一区二区三区不卡| 国产精品qvod| 亚洲男人第一av网站| 亚洲精品国产精品国自产网站| 视频国产一区| 日韩少妇与小伙激情| 欧美三级在线免费观看| 日韩午夜在线| 国产精品人成电影| 中文无码精品一区二区三区| 精东粉嫩av免费一区二区三区| 99精品国产高清一区二区| 欧美 日韩 国产 精品| 久久久一区二区三区| 日韩av一区二区三区美女毛片| 男人天堂手机在线| 亚洲成在人线免费| 无码日韩人妻精品久久蜜桃| 国产一区二区视频在线看| 亚洲精品在线观看视频| 摸摸摸bbb毛毛毛片| 中文字幕一区二区av| 青青久久av北条麻妃黑人| 一级视频在线播放| av一区二区三区四区| 五月天亚洲综合小说网| 美足av综合网| 欧美日韩国产高清一区二区| 无码人妻一区二区三区在线| 精品国精品国产自在久国产应用| 美女撒尿一区二区三区| 东京热一区二区三区四区| 国产一区二区三区四| 蜜桃传媒视频麻豆一区 | 中文字幕乱码人妻综合二区三区 | 欧美性猛交xxxx乱大交退制版| 拔插拔插华人永久免费| 亚洲国产合集| 欧美富婆性猛交| 老熟妇一区二区三区啪啪| 高清视频一区二区| 一区二区三区不卡在线| 日韩欧美一中文字暮专区| 日韩欧美一区电影| 美国黑人一级大黄| 国产精品婷婷| 成人综合电影| 国产写真视频在线观看| 在线视频一区二区免费| 无码一区二区精品| 国内在线观看一区二区三区| 成人动漫网站在线观看| 国产精品视频二区三区| 欧美午夜精品久久久久久人妖 | 99久久国产免费看| 黄色片免费在线观看视频| 欧美美女被草| 中文字幕日韩欧美在线| 秋霞av一区二区三区| 91一区二区三区在线播放| 六月婷婷激情综合| 国产在线视频欧美一区| 日韩一级黄色av| 伊人网免费视频| 欧美经典三级视频一区二区三区| 18岁网站在线观看| 精品久久对白| 97视频在线免费观看| 亚洲黄色a级片| 亚洲一区免费视频| 中文字幕在线播放一区二区| 亚洲第一偷拍| 成人免费在线视频网址| 在线观看黄色av| 欧美日韩国产123区| 女人黄色一级片| 日本女人一区二区三区| 午夜视频久久久| 91另类视频| xvideos亚洲人网站| 国产露脸91国语对白| 亚洲日穴在线视频| 国产又粗又猛又爽又黄| 午夜欧美理论片| 国产精品欧美久久| 爱搞国产精品| 亚洲欧洲日产国产网站| 中文字幕精品视频在线观看| 国产亚洲成av人在线观看导航 | 国产福利一区二区| 女人帮男人橹视频播放| 狠狠久久伊人| 欧美最猛性xxxxx亚洲精品| 免费在线视频你懂得| 在线看一区二区| 91n在线视频| 国产精品亚洲综合一区在线观看| 激情五月六月婷婷| 日本欧美高清| 国产免费亚洲高清| 在线中文字幕电影| 日韩高清av一区二区三区| 午夜视频网站在线观看| 亚洲人成影院在线观看| 先锋资源av在线| 日韩1区2区3区| av影院在线播放| 欧美中文一区| 国产在线播放不卡| 白浆在线视频| 精品久久久999| 人妻va精品va欧美va| 91黄色免费版| 日本a级片视频| 久久精品人人做人人综合| 91日韩精品视频| 国产亚洲午夜| 艳母动漫在线观看| 日韩av三区| 亚洲a成v人在线观看| caoporn视频在线| 综合网日日天干夜夜久久| www.桃色av嫩草.com| 91黄色在线观看| 精品无码久久久久久久久| 国产亚洲人成网站| 国产乱淫av片| 久久国内精品视频| 欧美成人一区二区在线观看| 99久久综合| 欧美成熟毛茸茸复古| 欧洲大片精品免费永久看nba| 热久久免费视频精品| 在线视频观看国产| 中文字幕日韩av| 青青草在线免费视频| 欧美一区二区人人喊爽| 天天操天天干天天摸| 亚洲国产色一区| 国产一二三区精品| 亚洲国产精品二十页| 精品国产人妻一区二区三区| 国产一区二区毛片| 午夜免费高清视频| 国产精品日本| 成人精品视频在线播放| 91精品国产91久久久久久密臀| 日韩av一区二区三区美女毛片| 欧美大胆视频| 国产九色精品| 一区二区三区在线免费看| 91精品国产综合久久男男| 成人香蕉视频| 欧美一级片在线播放| 美女航空一级毛片在线播放| 欧美成人免费在线观看| 婷婷成人激情| 中文字幕在线观看日韩| 国产精品久久久久一区二区国产| 亚洲电影天堂av| 高清一区二区三区四区| 欧美电影免费提供在线观看| 国产又粗又猛视频免费| 欧美日本在线看| 国产成人av免费| 欧美色综合网站| 亚洲av无码乱码国产精品fc2| 一本一本大道香蕉久在线精品 | 日韩国产欧美精品| 九九亚洲精品| 蜜桃导航-精品导航| 自拍自偷一区二区三区| 奇米888一区二区三区| 久久99视频| 日韩av电影免费在线| 国产欧美日韩精品一区二区三区| 欧美另类视频在线| 国产精品中文字幕亚洲欧美| 免费国产一区二区| 欧美极品中文字幕| 色大师av一区二区三区| 久久在线免费| 青青草原国产免费| 欧美日韩国产免费观看| 日韩美女爱爱视频| 一区二区三区国产盗摄| 日韩视频第二页| 美女尤物国产一区| 91蝌蚪视频在线| 丰满亚洲少妇av| 三叶草欧洲码在线| 久久久久久97三级| 国产wwwwxxxx| 亚洲在线视频一区| 国产成人无码精品久在线观看 | 国产手机视频在线| 亚洲精品在线观| 久草视频在线看| 日韩一区二区在线视频| 免费影视亚洲| 国产91精品青草社区| yiren22亚洲综合| 亚洲一区二区三| 人人精品视频| 一本一本a久久| 在线观看视频免费一区二区三区| 97成人在线观看视频| 久久久国产精品一区二区中文| 韩国中文字幕av| 国产成人免费视频| 久久久久久亚洲中文字幕无码| 国产精品天天看| 国产一卡二卡在线播放| 日本久久电影网| 国产黄a三级三级看三级| 亚洲欧美日韩天堂一区二区| 欧美a在线看| 97精品在线观看| 亚洲精品tv| 鲁片一区二区三区| 亚洲精彩视频| 成年人网站大全| 国产精品亚洲午夜一区二区三区| 黄色录像a级片| 中文字幕在线不卡一区二区三区| 日韩在线观看第一页| 欧美精品精品一区| 青青免费在线视频| 不卡av在线网站| 另类激情视频| www.成人av.com| 欧美肉体xxxx裸体137大胆| h无码动漫在线观看| 麻豆国产精品官网| 精品少妇一区二区三区免费观| 亚洲精品视频免费看| 久久永久免费视频| 亚洲激情视频在线播放| 国产成人在线视频免费观看| 国产999精品| 久草在线综合| 少妇大叫太大太粗太爽了a片小说| 青青青伊人色综合久久| 国产艳俗歌舞表演hd| 一二三区精品视频| 国产精品无码在线播放| 亚洲欧美第一页| 国产探花在线观看| 成人免费福利在线| 精品国产一区二区三区香蕉沈先生| 91丨porny丨探花| 国产91精品入口| 麻豆明星ai换脸视频| 欧美日韩久久一区| 国产大学生校花援交在线播放| 97超视频免费观看| 精品福利一区| 天堂8在线天堂资源bt| 国产一区二区不卡| 日本一级二级视频| 538prom精品视频线放| 亚洲1卡2卡3卡4卡乱码精品| 国产精品日韩在线一区| 国产一区二区三区电影在线观看 | 91美女精品福利| 国产大片中文字幕| 精品欧美久久久| 精精国产xxxx视频在线中文版| 亚洲最大福利视频| 女主播福利一区| 永久av免费在线观看| 亚洲人成人一区二区在线观看| 一级黄色片在线| 精品国产一区av| 8av国产精品爽爽ⅴa在线观看| 欧美18视频| 美腿丝袜亚洲色图| 国产视频精品免费| 日韩欧美一区二区不卡| 波多野结衣中文字幕久久| 国产精品久久久久av福利动漫| 狠狠入ady亚洲精品| 久草视频福利在线| 精品日韩中文字幕| 国产在线网站| 91精品久久久久久久久不口人| 欧美va久久久噜噜噜久久| 国产美女视频免费看| 亚洲影院理伦片| 色噜噜一区二区三区| 日韩av成人在线观看| 欧美中文一区二区| 亚洲自拍第三页| 亚洲成人一区在线| 国产视频网址在线| 国产在线a不卡| 韩日视频一区| 永久免费成人代码| 欧美日韩三级一区| 青草影视电视剧免费播放在线观看| 国产精品高清一区二区三区| 亚洲一区欧美激情| 亚洲色图100p| 亚洲精品按摩视频| 欧美不卡高清一区二区三区| 最新av在线免费观看| 成人av电影在线| 久草视频在线免费| 久热精品视频在线观看| 国产精品99久久免费观看| 三级在线视频观看| 亚洲永久精品国产| 牛牛影视精品影视| 91超碰rencao97精品| 亚洲免费网站| 亚洲综合网在线| 国产视频精品一区二区三区| 亚洲伊人精品酒店| 免费国产a级片| 中文字幕在线不卡视频| 午夜一区在线观看| 亚洲综合中文字幕在线| 久久久精品五月天| 国产亚洲精品成人| 中文字幕一精品亚洲无线一区| 香蕉大人久久国产成人av| 中文字幕欧美人妻精品一区| 洋洋成人永久网站入口| 成人免费视频|