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

国产欧美一区二区三区在线老狼 | 成人a级免费视频| 国产aaaaaaaaa| 99久久久国产| 亚洲午夜精品久久久久久久久| 精品一区久久| 中文字幕+乱码+中文乱码www | 91久久偷偷做嫩草影院电| 欧美日韩激情小视频| 亚洲视频在线二区| 在线观看xxx| 国产乱妇无码大片在线观看| 欧美一级淫片videoshd| 黄色香蕉视频在线观看| 日韩激情网站| 日韩欧美一区二区不卡| 亚洲视频在线观看一区二区三区| 中中文字幕av在线| 国产农村妇女毛片精品久久麻豆| 国产精品一区二| 一区二区国产欧美| 日韩高清中文字幕一区| 亚州国产精品久久久| 日本黄色免费片| 精品福利久久久| 亚洲精品99999| 性生活一级大片| 777午夜精品电影免费看| 午夜精品爽啪视频| 久久人妻无码一区二区| 欧美成人性生活视频| 99国产精品99久久久久久| 91香蕉亚洲精品| 92久久精品一区二区| 日日骚欧美日韩| 欧美一级片一区| 日韩精品一区二区三区国语自制| 在线一区电影| 日韩视频精品在线| 精品女人久久久| 操欧美老女人| 国产一区二区三区在线观看网站 | 亚洲一区二区在线观看视频| 一道精品一区二区三区| 久久精品蜜桃| 久久久久久久久久久电影| 久久av一区二区三区亚洲| 亚洲免费成人在线| 北岛玲一区二区三区四区| 99re国产| 国精产品乱码一区一区三区四区| 国产精品自在欧美一区| 亚洲a在线播放| 国产哺乳奶水91在线播放| 国产一区激情在线| 99超碰麻豆| 懂色av一区二区三区四区| 国产福利一区二区| 国产精品日韩一区二区免费视频| 丰满人妻一区二区三区免费| 成人三级伦理片| 精品日本一区二区| 欧美欧美欧美| 中文字幕精品在线不卡| 亚洲人体一区| 影音先锋在线播放| 亚洲成人免费在线观看| 大j8黑人w巨大888a片| 亚洲涩涩在线| 欧美日韩国产在线播放网站| 日本高清久久久| 91成人短视频| 亚洲视频免费一区| 日韩欧美在线视频播放| 91精品综合| 97在线视频国产| 特级西西444www高清大视频| 久久se这里有精品| 国产精品对白一区二区三区| 午夜av免费观看| 欧美高清在线精品一区| 艳母动漫在线免费观看| 国产乱码在线| 91福利视频久久久久| 韩国一区二区在线播放| 国产精品久av福利在线观看| 亚洲欧美激情一区| 国产精品久久久精品四季影院| 亚洲大胆在线| 国产乱肥老妇国产一区二| 午夜免费福利视频| 久久久久久久久久久久久久久99| 中文字幕在线观看一区二区三区| www欧美xxxx| 欧美中文一区二区三区| 日韩精品国产一区| 成人在线国产| 97视频国产在线| 97caocao| 国产午夜精品美女毛片视频| wwwwww欧美| 成人1区2区| 亚洲国产精品成人av| 久草福利资源在线| 亚洲伊人网站| 超碰97在线资源| 高清av电影在线观看| 亚洲影视在线观看| 日本中文字幕精品—区二区| 日本三级久久| 欧美夫妻性生活xx| 在线观看免费中文字幕| 93久久精品日日躁夜夜躁欧美| 一区二区三区av| 亚洲wwww| 亚洲黄色片网站| 麻豆国产尤物av尤物在线观看| 日韩精品电影一区亚洲| 精品国产一区二区三区麻豆小说 | 欧美性生给视频| 亚洲一区视频| 激情伦成人综合小说| 97超碰资源站在线观看| 欧美性猛交xxxxxx富婆| 性久久久久久久久久| 一区在线视频观看| 成人免费看片网址| www视频在线免费观看| 欧美日韩精品三区| 成人在线观看免费高清| 天堂精品中文字幕在线| 麻豆av一区| 免费高潮视频95在线观看网站| 日韩欧美国产三级电影视频| 久久爱一区二区| 另类综合日韩欧美亚洲| 午夜老司机精品| 色豆豆成人网| 亚洲欧美国产va在线影院| 毛片在线免费视频| 久久这里只有精品6| 无罩大乳的熟妇正在播放| 久久成人福利| 777午夜精品福利在线观看| 色婷婷激情五月| 天天综合日日夜夜精品| 无套内谢大学处破女www小说| 99国产精品| 久久国产精品久久精品国产| 超碰资源在线| 精品无人国产偷自产在线| 亚洲第一精品在线观看 | 国产精品日韩一区二区免费视频| 日韩特级毛片| 亚洲精品在线观看视频| 久久午夜免费视频| 国产情人综合久久777777| 成人羞羞国产免费网站| 欧美日韩精品在线一区| 国产欧美一区二区白浆黑人| 色三级在线观看| 欧美一级精品在线| 国产一级特黄毛片| 久久影院电视剧免费观看| 日本黄网站免费| 99精品网站| av成人观看| 日韩av影片| 中文字幕欧美精品在线| 国产精品伦理一区| 亚洲成人一区二区在线观看| 久久精品一区二区免费播放| 麻豆视频一区二区| 中文字幕精品在线播放| 久久亚洲道色| 国产精品成人免费视频| 永久免费网站在线| 亚洲欧美日韩一区在线| 亚洲系列在线观看| 亚洲国产一区视频| 99精品欧美一区二区| 国模少妇一区二区三区| 秋霞无码一区二区| 日韩综合精品| 国产精品一区二区三区在线观 | 色一情一乱一乱一91av| 久久嫩草捆绑紧缚| 99久久精品免费看| 中文字幕第17页| 99精品欧美| 色香蕉在线观看| 日韩伦理一区二区三区| 国产日本欧美一区| 欧美少妇网站| 美女福利视频一区| 福利片在线看| 亚洲精品黄网在线观看| 一区二区三区午夜| 色欧美日韩亚洲| 精品视频在线观看免费| 中文字幕av一区二区三区高| 95视频在线观看| 激情久久久久久久久久久久久久久久| 久久99久久99精品| 欧美日韩激情| 国产在线精品一区二区三区| 婷婷激情成人| 国产成人精品国内自产拍免费看| 四虎影院观看视频在线观看| 色老头一区二区三区| 四虎电影院在线观看| 欧美变态tickle挠乳网站| 五月激情丁香网| 欧美视频在线观看 亚洲欧| 四虎免费在线视频| 国产精品久久久久9999吃药| 老牛影视av老牛影视av| 北岛玲一区二区三区四区| 免费人成视频在线播放| 日韩电影在线免费看| 大陆极品少妇内射aaaaa| 午夜精品偷拍| 久久观看最新视频| 婷婷久久一区| 一卡二卡3卡四卡高清精品视频| 综合亚洲自拍| 久久99精品久久久久久秒播放器| 国产成人tv| 豆国产97在线| 97一区二区国产好的精华液| 亚洲www在线| 成人豆花视频| 成人有码在线视频| 99精品视频在线免费播放 | 一本色道久久综合熟妇| 在线看日韩精品电影| 樱花视频在线免费观看| 色婷婷av一区二区三区大白胸| 国产成人精品片| 姬川优奈aav一区二区| 中文字幕亚洲精品在线| 五月婷婷色综合| 欧美日韩综合在线观看| 亚洲二区在线视频| 国产一区二区三区影院| 亚洲成人免费看| 六月丁香在线视频| 欧美午夜美女看片| av一级在线观看| 欧美体内she精视频| 中文字幕一区二区在线视频| 欧美亚洲综合一区| 国产精品无码久久av| 777久久久精品| 亚洲AV无码成人片在线观看| 精品精品国产高清一毛片一天堂| 日本韩国免费观看| 亚洲精品国产精品国自产在线| 日韩av免费观影| 中文日韩在线观看| 成人看av片| 久久久人成影片一区二区三区观看| 超级碰碰不卡在线视频| 91大神福利视频在线| 秋霞国产精品| 91免费视频国产| 丁香5月婷婷久久| 免费国产在线精品一区二区三区| 国产99亚洲| 在线视频91| 激情欧美一区二区三区| 日韩中文字幕免费在线| 久久精品久久综合| 亚洲麻豆一区二区三区| 久久精品人人做人人综合| 午夜激情视频在线播放| 午夜电影一区二区| 丰满熟女人妻一区二区三| 337p亚洲精品色噜噜狠狠| 全国男人的天堂网| 中文一区二区视频| 波多野结衣精品| 国产精品美女免费看| 欧美日韩中出| 视频一区在线免费观看| 欧美国产免费| 色综合天天色综合| 成人精品亚洲人成在线| 久久久精品成人| 亚洲不卡av一区二区三区| 免费在线不卡av| 亚洲成人久久久| 嫩草香蕉在线91一二三区| 91爱视频在线| 亚洲一区 二区| 日韩一区不卡| 亚洲午夜精品久久久久久app| 8x8x最新地址| 91在线精品一区二区| 午夜爽爽爽男女免费观看| 欧美日韩亚洲激情| www.色呦呦| 日韩少妇与小伙激情| 成人性教育av免费网址| 99re资源| 久久久久久免费视频| 无遮挡又爽又刺激的视频 | 国产精品av一区| 99久久亚洲精品蜜臀| 黄色a级片免费| 成人精品国产福利| 久久久久久久久久久久久女过产乱| 日韩欧美成人区| 欧美一级特黄aaaaaa| 日日摸夜夜添一区| 国产精品久久久久av电视剧| 狠狠爱一区二区三区| 欧美日韩99| 欧美在线a视频| ●精品国产综合乱码久久久久| 久久精品视频5| 亚洲毛片在线看| 国产精品xx| 狠狠色综合色区| 亚洲久久成人| 国产女人18毛片水真多18| 亚洲黄色录像片| 国产乱淫片视频| 久久久av网站| 羞羞视频在线观看一区二区| 无遮挡亚洲一区| 久久亚洲二区| 国产真实乱人偷精品人妻| 欧美日韩亚洲激情| 无码精品一区二区三区在线| 午夜精品久久久久久99热软件| av男人一区| 97超碰国产精品| 国产不卡一区视频| 国产一级生活片| 亚洲激情在线观看视频免费| 99riav视频在线观看| 国产成人成网站在线播放青青 | 超碰影院在线观看| 久久精品亚洲一区二区三区浴池| 久久中文字幕免费| 亚洲视频999| 国产69精品久久| 在线看视频不卡| 国产成人av资源| 成年免费在线观看| 国产亚洲精品美女久久久| 91精品国产经典在线观看| 中文字幕在线亚洲三区| 国产成人综合视频| 天天操天天射天天爽| 日韩久久精品成人| 电影久久久久久| 永久免费精品视频网站| 国产老妇另类xxxxx| 国产乡下妇女做爰| 亚洲人成电影在线播放| 国产精品毛片久久久久久久久久99999999 | 一级一级黄色片| xvideos亚洲人网站| 91午夜精品| 国产xxxxx在线观看| 国产精品水嫩水嫩| www.桃色av嫩草.com| 91国语精品自产拍在线观看性色 | 国产婷婷一区二区三区久久| 九九热最新视频//这里只有精品 | 日韩精品中文在线观看| 日韩毛片一区| 国产911在线观看| 久久综合色一综合色88| 国产又大又长又粗| 午夜精品久久久久久久99热| 精品精品久久| 韩国三级在线播放| 91黄色免费版| 在线观看三级视频| 日韩精品无码一区二区三区| 国内一区二区在线| 91美女免费看| 两个人的视频www国产精品| 开心激情综合| 国产精品一区二区小说| 亚洲二区在线视频| 免费网站看v片在线a| 精品亚洲欧美日韩| 狠狠久久亚洲欧美| 少妇一级淫片免费放中国 | 国模冰冰炮一区二区| 中文网丁香综合网| 久久久一区二区三区捆绑**| 国内精品久久久久久久久久| 欧美做受高潮电影o| 欧美成人高清| 肉色超薄丝袜脚交69xx图片|