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

要不要升級?Java 21強大的新特性,代碼量減半

開發(fā) 前端
FMT 是 Java 平臺定義的另一種模板處理器。FMT 與 STR 類似,它執(zhí)行插值,但也解釋嵌入式表達式左側(cè)的格式規(guī)范。格式說明符與 java.util.Formatter 中定義的格式說明符相同。

1. record模式

Record模式由 JEP 405 作為預(yù)覽功能提出,并在 JDK 19 中發(fā)布,JEP 432 進行了第二次預(yù)覽,并在 JDK 20 中發(fā)布。該功能與用于switch的模式匹配(JEP 441)共同發(fā)展,兩者之間有相當多的交互

1.1 instanceof類型模式

Object obj = "Pack" ;
// Java 16之前
if (obj instanceof String) {
    String s = (String) obj ;
    System.out.println("強轉(zhuǎn)為String") ;
}
// 自Java 16起
if (obj instanceof String s) {
    System.out.println("簡便多了") ;
}

在上面的代碼中從java16開始,運行時obj的值是String的實例,則obj與類型模式String s匹配。如果模式匹配,則表達式的實例為true,并且模式變量s初始化為obj轉(zhuǎn)換為String的值,然后可以在包含的代碼塊中使用該值。

1.2 模式匹配與Records

Records (JEP 395)是數(shù)據(jù)的透明載體。接收record類實例的代碼通常將使用內(nèi)置的組件訪問器方法提取數(shù)據(jù),稱為組件。例如,我們可以使用類型模式來測試值是否是record類Point的實例,如果是,則從值中提取x和y組件:

// 自Java 16起
public record Point(int x, int y) {
}
public static void main(String[] args) {
  Object obj = new Point(10, 20);
  if (obj instanceof Point p) {
    int x = p.x();
    int y = p.y();
    System.out.println(x + y);
  }
}

上面的代碼看著與1.1中介紹的沒撒區(qū)別就是類型模式,在上面的代碼中我們僅僅是訪問了record類x與y的方法,如果是這樣我們還可以像下面這樣操作:

Object obj = new Point(10, 20) ;
// 自java 21起
if (obj instanceof Point(int x, int y)) {
  System.out.println(x + y) ;
}

這里的Point(int x, int y) 是一個record模式。它將提取組件的局部變量聲明移至模式本身,并在值與模式匹配時通過調(diào)用訪問器方法初始化這些變量。

1.3 嵌套record模式

有如下定義

public record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}

如果要提取左上角點的顏色,我們可以這樣寫:

Object r = new Rectangle(
    new ColoredPoint(new Point(0, 0), Color.RED), 
    new ColoredPoint(new Point(100, 100), Color.BLUE)
  ) ;
// 從java 21起  
if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
  System.out.printf("%s, %s%n", ul, lr) ;
}

輸出結(jié)果

ColoredPoint[p=Point[x=0, y=0], c=RED], ColoredPoint[p=Point[x=100, y=100], c=BLUE]

如果你希望訪問具體的顏色值,record模式還支持嵌套,如下示例:

// 從java 21起
if (r instanceof Rectangle(
    ColoredPoint(Point(int x, int y), Color c1), 
    ColoredPoint lr
  )
) {
  System.out.printf("x = %d, y = %d%n", x, y) ;
}

1.4 嵌套模式無法匹配情況

在下面這情況下是無法進行匹配的

public record Pair(Object x, Object y) {}
Pair p = new Pair(42, 42);
if (p instanceof Pair(String s, String t)) {
  System.out.println(s + ", " + t);
} else {
  System.out.println("Not a pair of strings") ;
}

以上是關(guān)于record 模式的所有內(nèi)容。

2. switch模式匹配

該功能最初由 JEP 406(JDK 17)提出,后經(jīng) JEP 420(JDK 18)、427(JDK 19)和 433(JDK 20)改進。它與 "1. record模式 "功能(JEP 440)共同發(fā)展。

先來看下如下這段代碼

Object obj = 100L ;
if (obj instanceof Integer) {
  Integer i = (Integer) obj ;
  obj = String.format("int %d", i);
} else if (obj instanceof Long) {
  Long l = (Long) obj ;
  obj = String.format("long %d", l);
} else if (obj instanceof String) {
  String s = (String) obj ;
  obj = String.format("String %s", s);
}

有個instanceof 模式以后就可以簡化這樣了

Object obj = 100L ;
if (obj instanceof Integer i) {
  obj = String.format("int %d", i);
} else if (obj instanceof Long l) {
  obj = String.format("long %d", l);
} else if (obj instanceof String s) {
  obj = String.format("String %s", s);
}
System.out.printf("result obj = %s%n", obj) ;

注意:上面的代碼有2個問題

  1. 上面的代碼有如果沒有編譯器的作用,那么它的時間復(fù)雜度將是O(n)
  2. 隱藏了一個BUG,當if,else沒有判斷到某個類型時可能會出現(xiàn)問題上面的代碼并沒有else,因為不強制所以當判斷遺漏了某種類型時可能會給程序帶來潛在的問題。

從Java 21開始,我們可以如下處理上面的if.. else 

var ret = switch (obj) {
  case Integer i -> String.format("int %d", i);
  case Long l    -> String.format("long %d", l);
  case String s  -> String.format("String %s", s);
  default        -> obj.toString() ;
};
System.out.printf("result ret = %s%n", ret) ;

在過去我們知道如果switch的每個case沒有break或者return,那么它會穿透到下一個case直到遇到break或return。并且在傳統(tǒng)的switch中沒有default也是可以的。但是在上面的代碼中必須要有default子句。

2.1 switch與null值

傳統(tǒng)上,如果switch表達式值為空,switch 語句和表達式會拋出 NullPointerException,因此必須在 switch 之外進行空判斷:

String s = null ;
switch (s) {
  // 如果不清楚這里的語法,你應(yīng)該先看看java14對switch新語法的介紹
  case "a", "b" -> System.out.println("a or b") ;
  default -> System.out.println("defualt value") ;
}

控制臺輸出

圖片圖片

在上面的代碼中在過去,我們要先對s進行null的判斷,再進行switch,否則有可能就會出現(xiàn)上面的錯誤。修改如下:

if (s == null) {
  return ;
}
switch (s) {
  // TODO
}

以上代碼是Java 21之前,從Java 21起,我們可以如下:

switch (s) {
  case null -> System.out.println("oops") ;
  case "a", "b" -> System.out.println("a or b") ;
  default -> System.out.println("defualt value") ;
}

無需單獨的if判斷是否為null情況。

2.2 switch條件判斷

在case中還可以添加if...else判斷

static void fn1(String resp) {
  switch (resp) {
    case String s -> {
      if (s.equalsIgnoreCase("success"))
        System.out.println("處理成功");
      else if (s.equalsIgnoreCase("failure"))
        System.err.println("處理失敗");
      else
        System.out.println("未知結(jié)果") ;
    }
  }
}

在case中是使用when子句

static void fn2(String resp) {
  switch (resp) {
    case null -> {}
    case String s 
    when s.equalsIgnoreCase("success") -> {
      System.out.println("處理成功");
    }
    case String s
    when s.equalsIgnoreCase("failure") -> {
      System.err.println("處理失敗");
    }
    case String s -> {
        System.out.println("未知結(jié)果") ;
    }
  }
}

這樣,switch的可讀性就更強了。

2.3 switch與enum常量

在Java 21之前,switch的case表達式必須是枚舉類型,標簽必須是枚舉常量的簡單名稱,如下示例:

public enum Color { RED, BLUE, GREEN }
public static void fn1(Color c) {
  switch (c) {
    case RED, BLUE -> System.out.println("我喜歡的顏色") ;
    case GREEN -> {
      // TODO
    }
    default -> System.out.println("我討厭的顏色") ;
  }
}

上面說的標簽必須是枚舉常量的簡單名稱什么意思呢?就是說在java21之前使用枚舉時的標簽不能是下面這種寫法:

case Color.GREEN -> {}

而從Java 21起可以使用這種語法。

3. 虛擬線程

關(guān)于虛擬線程請查看這篇文章:

【技術(shù)革命】JDK21虛擬線程來襲,讓系統(tǒng)的吞吐量翻倍!

4. 字符串模版

注:這是一個預(yù)覽功能

編譯:javac --enable-preview --source 21 -Xlint:preview Xxx.java

運行:java --enable-preview Xxx

在開發(fā)中字符串相關(guān)的操作是非常非常多的,雖然Java 提供了多種字符串組成機制,但遺憾的是,所有機制都有缺點。

  • 使用+操作符拼接字符串,看著都不好理解
String result = x + " + " + y + " = " + (x + y) ;
  • 冗余的StringBuilder
String s = new StringBuilder().append(x).append(" + ")
  .append(y).append(" = ").append(x + y).toString() ;
  • String#format 與 String#formatted將格式字符串與參數(shù)分離,避免了類型錯配:
int x = 10, y = 20 ;
String s = String.format("%2$d + %1$d = %3$d", x, y, x + y);
String t = "%2$d + %1$d = %3$d".formatted(x, y, x + y) ;
  • java.text.MessageFormat要求太多,而且格式字符串中使用了不熟悉的語法:
String ret = MessageFormat.format("{0} + {1} = {2}", x, y, x + y) ;

4.1 STR 模板處理器

STR 是 Java 平臺定義的模板處理器。它通過用表達式的(字符串化)值替換模板中的每個嵌入表達式來執(zhí)行字符串插值。

String firstName = "Bill" ;
String lastName  = "Duck" ;
String fullName  = STR."\{firstName} \{lastName}" ;
System.out.println(fullName) ;

輸出結(jié)果

Bill Duck

注:STR 是一個公共靜態(tài)最終字段,會自動導(dǎo)入到每個 Java 源文件中。

表達式還可以執(zhí)行相應(yīng)的操作,如下:

int x = 10, y = 20 ;
String result = STR."\{x} + \{y} = \{x + y}" ;
System.out.println(result) ;
// 10 + 20 = 30

表達式中還可以調(diào)用方法

static String getName() {
  return "張三" ;
}
static record Req(String date, String time) {}
static void fn5() {
  String s = STR."我的名字是 \{getName()} ";
  System.out.println(s) ;
  Req req = new Req("2000-01-01", "23:59:59") ;
  String t = STR."Access at \{req.date} \{req.time}";
  System.out.println(t) ;
}

輸出結(jié)果

我的名字是 張三
Access at 2000-01-01 23:59:59

多行模版字符串

static void fn6() {
  String name    = "張三";
  String phone   = "1899999999";
  String address = "xxxooo";
  String json = STR."""
  {
    "name":    "\{name}",
    "phone":   "\{phone}",
    "address": "\{address}"
  }
  """;
  System.out.println(json);
}

輸出結(jié)果

{
   "name": "張三",
   "phone": "1899999999",
   "address": "xxxooo"
}

以上是基于STR模版處理器的內(nèi)容,接下來介紹另外一個。

4.2 FMT 模板處理器

FMT 是 Java 平臺定義的另一種模板處理器。FMT 與 STR 類似,它執(zhí)行插值,但也解釋嵌入式表達式左側(cè)的格式規(guī)范。格式說明符與 java.util.Formatter 中定義的格式說明符相同。

record Rectangle(String name, double width, double height) {
  double area() {
    return width * height;
  }
}
public static void main(String[] args) {
  Rectangle[] zone = new Rectangle[] {
    new Rectangle("Alfa", 17.8, 31.4),
    new Rectangle("Bravo", 9.6, 12.4),
  };
  String s = FMT."""
    Description     Width    Height     Area
    %-12s\{zone[0].name}  %7.2f\{zone[0].width}  %7.2f\{zone[0].height}     %7.2f\{zone[0].area()}
    %-12s\{zone[1].name}  %7.2f\{zone[1].width}  %7.2f\{zone[1].height}     %7.2f\{zone[1].area()}
    \{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()}
  """;
  System.out.println(s) ;
}

5. 序列集合

在Java21 之前的集合類中要獲取第一個和最后一個元素,不同的集合操作方式不同或者壓根就沒有對應(yīng)的方法。如下示例:

圖片圖片

在說遍歷集合,正向時(從第一個到最后一個)操作方法基本一致。但是反向時遍歷時每個集合就又不相同了。

在JDK21中提供了如下3個序列接口:

  • SequencedCollection
public interface SequencedCollection<E> extends Collection<E> {
  SequencedCollection<E> reversed() ;
  default void addFirst(E e) ;
  default void addLast(E e) ;
  default E getFirst() ;
  default E getLast() ;
  default E removeFirst() ;
  default E removeLast() ;
}
  • SequencedSet
public interface SequencedSet<E> extends SequencedCollection<E>, Set<E> {
  SequencedSet<E> reversed();
}
  • SequencedMap
public interface SequencedMap<K, V> extends Map<K, V> {
  SequencedMap<K, V> reversed() ;
  default Map.Entry<K,V> firstEntry() ;
  default Map.Entry<K,V> lastEntry() ;
  default Map.Entry<K,V> pollFirstEntry() ;
  default Map.Entry<K,V> pollLastEntry() ;
  default V putFirst(K k, V v) ;
  default V putLast(K k, V v) ;
  // other
}

以上3個集合都提供了對應(yīng)的獲取第一個和最后一個元素的方法及集合反轉(zhuǎn)方法。上面定義的三個新接口與現(xiàn)有的集合類型層次結(jié)構(gòu)非常吻合,如下圖:

圖片圖片

對現(xiàn)有的類和接口進行了如下調(diào)整:

  • List 現(xiàn)在將 SequencedCollection 作為其直接超接口、
  • Deque 現(xiàn)在將 SequencedCollection 作為其直接超接口、
  • LinkedHashSet 進一步實現(xiàn)了 SequencedSet、
  • SortedSet 現(xiàn)在將 SequencedSet 作為其直接超接口、
  • LinkedHashMap 進一步實現(xiàn)了 SequencedMap,而
  • SortedMap 現(xiàn)在將 SequencedMap 作為其直接超接口。

6. 未命名模式&變量

注:這是一個預(yù)覽功能

先看下面這個示例

public record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint cp) {}
  
Object obj = new Rectangle(
    new ColoredPoint(new Point(10, 10), Color.RED)
  ) ;
if (obj instanceof Rectangle(ColoredPoint(Point(int x, int y), Color c))) {
  System.out.printf("x = %d, y = %d%n", x, y) ;
}

在上面的if判斷中,對于Color c變量并沒有使用,從Java 21開始我們可以像下面這樣改寫:

if (obj instanceof Rectangle(ColoredPoint(Point(int x, int y), _))) {
  System.out.printf("x = %d, y = %d%n", x, y) ;
}

使用一個 "_" 下劃線代替即可。

未使用的變量

int[] arr = {1, 2, 3, 4, 5} ;
int total = 0 ;
for (var a : arr) {
  total++ ;
}

在這個示例中,變量a并沒有使用,所以從Java 21開始可以改寫如下:

for (var _ : arr) {
  total++ ;
}

對于這樣沒有使用的變量,我們可以用一個 "_" 下劃線代替。其它示例:

try {
  int a = 1 / 0 ;
} catch (Exception _) { // 這里沒有用到異常通過可以使用 _
}

注:我用的Eclipse沒法直接使用,我這里是通過記事本編寫,通過命令行編譯&運行。

7. 未命名的類&Main方法

注:這是一個預(yù)覽功能

下面這個代碼是學習java的入門代碼

public class UnnamedClassAndMain {
 public static void main(String[] args) {
   System.out.println("Hello World!!!") ;
 }
}

從Java 21開始,我們可以簡化成如下形式了

public class UnnamedClassAndMain {
  void main() {
    System.out.println("Hello World!!!") ;
  }
}

未命名的類

還是拿上面的程序演示,我們還可以繼續(xù)簡化如下形式:

void main() {
  System.out.println("Hello World!!!") ;
}

對,文件中只有一個極簡的方法,連類的聲明都沒有了。你甚至還可以如下,定義方法,方法調(diào)用

String name = "Pack" ;
String getName() {
  return name ;
}
void main() {
  System.out.println(getName()) ;
}

類文件直接定義方法,聲明變量。

責任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2013-11-29 14:04:42

2012-03-16 14:23:00

框架

2018-11-19 09:02:53

垃圾代碼辭職入職

2017-11-20 09:00:43

跳槽職場精英年終獎

2023-10-06 12:04:41

ORM關(guān)系型數(shù)據(jù)庫

2012-03-16 14:23:00

框架

2021-11-24 22:39:03

手機系統(tǒng)功能

2021-02-21 09:09:24

GoGOPATH代碼

2019-10-23 20:19:26

Python 開發(fā)編程語言

2014-12-09 09:13:46

BaaS云備份備份即服務(wù)

2020-11-17 09:17:58

框架組件基礎(chǔ)服務(wù)

2018-07-12 09:04:15

RAID陣列硬盤

2018-01-24 07:58:47

框架組件技術(shù)棧開源

2020-06-11 14:07:44

iOS 13.6.2蘋果手機

2015-10-22 10:57:12

Facebook功能

2021-10-21 09:41:43

互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)

2020-10-20 10:53:01

5G套餐運營商5G

2018-01-29 09:42:27

創(chuàng)業(yè)技術(shù)團隊

2015-11-30 11:52:03

云服務(wù)最佳實踐
點贊
收藏

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

亚洲国产成人无码av在线| 99久久综合网| se在线电影| 国产在线日韩欧美| 7m精品福利视频导航| 国产在线综合视频| av动漫精品一区二区| 欧美日韩国产丝袜另类| 一区二区在线观看网站| 五月色婷婷综合| 免费观看久久久4p| 久久久在线视频| 性欧美疯狂猛交69hd| 偷拍一区二区| 精品第一国产综合精品aⅴ| 少妇高潮喷水久久久久久久久久| 免费av毛片在线看| 26uuu色噜噜精品一区二区| 91免费观看网站| 欧美一区免费看| 国产综合视频| 久久久国产精品亚洲一区| 国产精品九九九九九| 日本在线成人| 欧美高清hd18日本| 亚洲少妇第一页| 依依综合在线| 亚洲二区在线视频| 亚洲精品国产suv一区88| 日本三级视频在线观看| 久久久久国色av免费看影院| www久久99| 国产伦理吴梦梦伦理| 日韩精品一二区| 国产91精品久久久| 日本一级黄色大片| 欧美黄在线观看| 久久精品国产亚洲精品| 91无套直看片红桃在线观看| 国产99久久久国产精品成人免费 | 在线观看不卡的av| 免费在线观看成人av| 97涩涩爰在线观看亚洲| 免费又黄又爽又色的视频| 偷拍欧美精品| 久久精品视频亚洲| 老熟妻内射精品一区| 日韩精品一区二区三区免费观影 | 极品少妇一区二区三区精品视频 | 欧美成人第一页| 国产午夜精品理论片| 999国产精品永久免费视频app| 亚洲天堂男人天堂女人天堂| 精品少妇人妻一区二区黑料社区| 欧美久久精品| 亚洲欧美日韩成人| 日本高清www| 欧美女王vk| 色偷偷综合社区| 天天色影综合网| 91精品99| 欧美精品成人91久久久久久久| 免费在线一区二区三区| 亚洲第一在线| 日本最新高清不卡中文字幕| 中文字幕福利视频| 精品一区二区三区在线观看| 亚洲自拍偷拍色图| 亚洲欧美激情国产综合久久久| 成人avav影音| 欧洲精品码一区二区三区免费看| 欧美69xxxxx| 国产精品美女久久久久aⅴ| 中文字幕在线亚洲精品| 深夜国产在线播放| 婷婷成人综合网| 又色又爽又高潮免费视频国产| 成人福利一区二区| 欧美一区二区三区色| 欧美xxxxx精品| 国产成人1区| 欧美精品手机在线| 在线能看的av| 蜜臀91精品一区二区三区 | 欧美午夜aaaaaa免费视频| 日韩三区四区| 亚洲成年人在线| 人妻一区二区视频| 欧美精品福利| 日韩女优在线播放| 国产精品美女一区| 91丨porny丨蝌蚪视频| 亚洲欧美日本国产有色| 国产精品偷拍| 精品视频资源站| 中国黄色片视频| 久久人人88| 91精品国产91久久| 国产精品亚洲欧美在线播放| 国产精品538一区二区在线| 久久青青草综合| 成码无人av片在线观看网站| 欧美性黄网官网| 自拍一级黄色片| 国产永久精品大片wwwapp| 欧美另类69精品久久久久9999| 精品欧美一区二区三区免费观看| 美女爽到高潮91| 好吊色欧美一区二区三区视频 | 欧美精品福利视频| 91亚洲国产成人久久精品麻豆| av在线播放成人| 天天想你在线观看完整版电影免费| 欧美片第一页| 亚洲精品按摩视频| av成人免费网站| 日韩成人精品在线| 激情小说综合区| 欧美性爽视频| 91麻豆精品国产91久久久更新时间| 久久精品成人av| 亚洲国产国产亚洲一二三| 成人免费视频网| 99reav在线| 色噜噜狠狠成人中文综合| 屁屁影院国产第一页| 国产一区日韩欧美| 亚洲一区二区免费| 日本黄色片在线观看| 欧美中文字幕亚洲一区二区va在线 | 亚洲欧美国产精品专区久久 | 制服.丝袜.亚洲.中文.综合| www.av天天| 丝袜诱惑亚洲看片| 久久久av水蜜桃| 麻豆mv在线看| 日韩av网站在线| 日韩欧美一区二区一幕| 成人免费高清视频| 成年人网站国产| 中文字幕久久精品一区二区| 欧美成人午夜激情| 国产v在线观看| 亚洲综合成人在线| 中文字幕1区2区| 欧美女人交a| 99在线观看视频网站| 色婷婷av在线| 亚洲成人av片| 日本特级黄色片| 国产午夜亚洲精品理论片色戒 | 国产一区二区三区不卡在线观看 | 国产视频99| 忘忧草在线日韩www影院| 亚洲精品福利在线观看| 丰满少妇xoxoxo视频| 国产午夜久久久久| 伊人色在线观看| 久久久久久久久久久妇女| 91欧美精品午夜性色福利在线| 最新国产在线拍揄自揄视频| 精品精品欲导航| 国产精品视频久久久久久久| 久久综合999| 97公开免费视频| 日韩欧美中字| 91久久精品一区二区别| av在线理伦电影| 亚洲毛片在线观看| 亚洲无码精品在线观看| 一区二区成人在线视频| 黄色a一级视频| 日本欧美韩国一区三区| 最新av在线免费观看| 国产成人福利av| 国产精品18久久久久久麻辣| 免费在线观看黄色| 亚洲二区中文字幕| 免费无码国产精品| 亚洲免费视频成人| 中文字幕在线免费看线人| 日本视频在线一区| 800av在线免费观看| 最新亚洲精品| 91九色视频在线| 涩涩视频在线| 久久久97精品| 日本成人一区| 欧美一区二区三区人| 91精品国产高清一区二区三密臀| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 日韩av网址在线| 国产又粗又猛又爽又黄91| 亚洲第一激情av| 欧美a级片免费看| 97国产精品videossex| 在线观看岛国av| 国产精品毛片在线| japanese在线播放| 欧洲杯半决赛直播| 国产伦一区二区三区色一情| 九七影院97影院理论片久久| 午夜精品视频网站| 成人高清免费在线| 一个人www欧美| 色婷婷av一区二区三区之e本道| 欧美女孩性生活视频| 成人精品免费在线观看| 亚洲激情网站免费观看| 妖精视频在线观看免费| 久久这里只精品最新地址| a级大片免费看| 免费高清在线一区| 成年人在线看片| 日韩午夜av在线| 久久观看最新视频| 五月久久久综合一区二区小说| 久久精品国产精品青草色艺| 亚洲**毛片| 91精品在线看| 亚洲青青一区| 国产精品视频资源| 三级成人在线| 日本在线精品视频| 成人免费短视频| 2020欧美日韩在线视频| 2019中文字幕在线电影免费| 久久伊人91精品综合网站| 一区二区三区视频在线观看视频| 亚洲日本中文字幕免费在线不卡| 丰满人妻一区二区| 精品国免费一区二区三区| 99视频国产精品免费观看a| 欧美高清hd18日本| 国产又粗又猛又爽又黄视频 | 日韩美女免费视频| 涩涩视频在线免费看| 9.1国产丝袜在线观看 | 好吊日精品视频| 精品一二三四五区| 亚洲一级影院| 欧美精品卡一卡二| 亚洲国产1区| 777777av| 美女黄色成人网| 欧美两根一起进3p做受视频| 视频一区二区国产| 天堂中文视频在线| 免费精品视频在线| 超碰在线免费av| 国产成人免费xxxxxxxx| 欧美图片自拍偷拍| 99久久久久久99| 亚洲AV无码国产精品| 2024国产精品| 一级特黄曰皮片视频| 国产精品久久影院| 欧美做爰爽爽爽爽爽爽| 亚洲综合免费观看高清完整版在线| 加勒比av在线播放| 精品福利在线视频| 国产免费一区二区三区四区五区| 在线免费观看日韩欧美| 一级全黄裸体免费视频| 日韩欧美国产午夜精品| 欧美一级一区二区三区| 国产午夜精品麻豆| 日本视频不卡| 欧美激情网站在线观看| 老色鬼在线视频| 国产精品专区h在线观看| 深夜激情久久| 欧美久久在线| 五月婷婷亚洲| 69堂免费视频| 九九视频精品免费| 中文字幕在线视频播放| 久久久久久久性| 欧美成人精品激情在线视频| 午夜视频在线观看一区| 丰满熟女人妻一区二区三| 欧美一区二区三区影视| 欧美成熟毛茸茸| 久久99国产精品久久久久久久久| 自拍网站在线观看| 91夜夜揉人人捏人人添红杏| 亚洲黄页网站| 最新不卡av| 亚洲欧美日韩视频二区| 九九精品久久久| 99这里只有久久精品视频| 中文字幕在线观看二区| 精品免费在线观看| 一级做a爱片久久毛片| 日韩黄色在线免费观看| 国精产品一区| 日本免费一区二区三区视频观看| 96视频在线观看欧美| 欧美日韩一区二| 悠悠资源网久久精品| 伊人国产在线视频| 91免费国产在线| 欧美一级黄色网| 国产男女猛烈无遮挡| 日韩电影中文字幕在线观看| 免费黄色在线| 日韩av成人在线| 6080成人| 日本一二三区视频在线| 视频精品一区二区| 国产精品无码在线| 亚洲精品日韩一| 一区二区视频免费| 亚洲欧美国产一本综合首页| 中文字幕有码在线视频| 国产综合香蕉五月婷在线| 性欧美lx╳lx╳| 久久久性生活视频| 国产精品一区在线| 制服丨自拍丨欧美丨动漫丨| 日本精品视频一区二区| 三级av在线| 高清欧美性猛交xxxx| 国产精品一区免费在线| 一本色道久久综合亚洲精品婷婷 | 国内精久久久久久久久久人| 国产精品亚洲综合在线观看| 亚洲欧洲久久| 日韩av中文在线观看| 一区二区精品免费| 欧美午夜女人视频在线| 色一情一乱一区二区三区| 欧美老女人在线视频| 天堂精品久久久久| 女女百合国产免费网站| 狠狠色丁香久久婷婷综| 91麻豆精品久久毛片一级| 欧美日韩国产在线播放网站| 亚洲搞黄视频| 成人精品久久久| 亚洲精品一二三区区别| 精品国产鲁一鲁一区二区三区| 国产精品国产自产拍高清av| 一级黄色片在线播放| 精品国产一区二区三区久久狼5月| 日本精品久久| 日韩中文在线字幕| 国产69精品久久久久毛片| 劲爆欧美第一页| 亚洲国产成人av在线| 波多野一区二区| 欧美日韩在线不卡一区| 日韩电影在线一区二区| 四季av中文字幕| 69堂亚洲精品首页| 国产理论电影在线| 久久婷婷国产综合尤物精品| 久久激情中文| 美国美女黄色片| 欧美顶级少妇做爰| 四季久久免费一区二区三区四区| 高清国产一区| 久久国产高清| 日韩av网站在线播放| 日韩欧美三级在线| 国产激情视频在线看| 日本一区二区精品视频| 久久国产精品一区二区| 久草免费在线观看视频| 国产视频在线一区二区| 成人在线免费av| 糖心vlog在线免费观看| 波多野结衣中文字幕一区| 少妇高潮av久久久久久| 中文字幕日韩在线视频| 国产亚洲久久| 黄色免费观看视频网站| 亚洲国产岛国毛片在线| 精品人妻无码一区二区| 欧美一级大片在线免费观看| 凹凸成人精品亚洲精品密奴| 久久久久亚洲av片无码v| 精品久久久久久久久久久久久久| av资源网站在线观看| 999国产在线| 日韩中文字幕av电影| 曰本女人与公拘交酡| 亚洲精品99999| 亚洲精品毛片| 国产精品欧美激情在线观看| 亚洲天堂久久久久久久| 日韩欧美亚洲系列| 99久久一区三区四区免费| 三级欧美韩日大片在线看| 欧美卡一卡二卡三| 国产一区二区av| 久久久精品国产**网站| 亚洲成人av免费观看| 日本高清不卡在线观看| heyzo在线播放|