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

我終于搞清楚了和String有關的那點事兒

開發(fā) 開發(fā)工具
String,是Java中除了基本數(shù)據(jù)類型以外,最為重要的一個類型了。很多人會認為他比較簡單。但是和String有關的面試題有很多,下面我隨便找兩道面試題,看看你能不能都答。

String,是Java中除了基本數(shù)據(jù)類型以外,最為重要的一個類型了。很多人會認為他比較簡單。但是和String有關的面試題有很多,下面我隨便找兩道面試題,看看你能不能都答對:

Q1:String s = new String("hollis");定義了幾個對象。

Q2:如何理解String的intern方法?

上面這兩個是面試題和String相關的比較常考的,很多人一般都知道答案。

A1:若常量池中已經(jīng)存在"hollis",則直接引用,也就是此時只會創(chuàng)建一個對象,如果常量池中不存在"hollis",則先創(chuàng)建后引用,也就是有兩個。

A2:當一個String實例調用intern()方法時,JVM會查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等于str的字符串并返回它的引用;

兩個答案看上去沒有任何問題,但是,仔細想想好像哪里不對呀。

按照上面的兩個面試題的回答,就是說new String會檢查常量池,如果有的話就直接引用,如果不存在就要在常量池創(chuàng)建一個,那么還要intern干啥?難道以下代碼是沒有意義的嗎?

  1. String s = new String("Hollis").intern(); 

如果,每當我們使用new創(chuàng)建字符串的時候,都會到字符串池檢查,然后返回。那么以下代碼也應該輸出結果都是true?

  1. String s1 = "Hollis"
  2.     String s2 = new String("Hollis"); 
  3.     String s3 = new String("Hollis").intern(); 
  4.  
  5.     System.out.println(s1 == s2); 
  6.     System.out.println(s1 == s3); 

但是,以上代碼輸出結果為(base jdk1.8.0_73):

  1. false 
  2. true 

不知道,聰明的讀者看完這段代碼之后,是不是有點被搞蒙了,到底是怎么回事兒?

別急,且聽我慢慢道來。

字面量和運行時常量池

JVM為了提高性能和減少內(nèi)存開銷,在實例化字符串常量的時候進行了一些優(yōu)化。為了減少在JVM中創(chuàng)建的字符串的數(shù)量,字符串類維護了一個字符串常量池。

在JVM運行時區(qū)域的方法區(qū)中,有一塊區(qū)域是運行時常量池,主要用來存儲編譯期生成的各種字面量和符號引用。

了解Class文件結構或者做過Java代碼的反編譯的朋友可能都知道,在java代碼被javac編譯之后,文件結構中是包含一部分Constant pool的。比如以下代碼:

  1. public static void main(String[] args) { 
  2.     String s = "Hollis"

經(jīng)過編譯后,常量池內(nèi)容如下:

  1. Constant pool: 
  2.   #1 = Methodref          #4.#20         // java/lang/Object."<init>":()V 
  3.   #2 = String             #21            // Hollis 
  4.   #3 = Class              #22            // StringDemo 
  5.   #4 = Class              #23            // java/lang/Object 
  6.   ... 
  7.   #16 = Utf8               s 
  8.   .. 
  9.   #21 = Utf8               Hollis 
  10.   #22 = Utf8               StringDemo 
  11.   #23 = Utf8               java/lang/Object 

上面的Class文件中的常量池中,比較重要的幾個內(nèi)容:

  1. #16 = Utf8               s 
  2.   #21 = Utf8               Hollis 
  3.   #22 = Utf8               StringDemo 

上面幾個常量中,s就是前面提到的符號引用,而Hollis就是前面提到的字面量。而Class文件中的常量池部分的內(nèi)容,會在運行期被運行時常量池加載進去。關于字面量,詳情參考Java SE Specifications

new String創(chuàng)建了幾個對象

下面,我們可以來分析下String s = new String("Hollis");創(chuàng)建對象情況了。

這段代碼中,我們可以知道的是,在編譯期,符號引用s和字面量Hollis會被加入到Class文件的常量池中,然后在類加載階段,這兩個常量會進入常量池。

但是,這個“進入”過程,并不會直接把所有類中定義的常量全部都加載進來,而是會做個比較,如果需要加到字符串常量池中的字符串已經(jīng)存在,那么就不需要再把字符串字面量加載進來了。

所以,當我們說<若常量池中已經(jīng)存在"hollis",則直接引用,也就是此時只會創(chuàng)建一個對象>說的就是這個字符串字面量在字符串池中被創(chuàng)建的過程。

說完了編譯期的事兒了,該到運行期了,在運行期,new String("Hollis");執(zhí)行到的時候,是要在Java堆中創(chuàng)建一個字符串對象的,而這個對象所對應的字符串字面量是保存在字符串常量池中的。但是,String s = new String("Hollis");,對象的符號引用s是保存在Java虛擬機棧上的,他保存的是堆中剛剛創(chuàng)建出來的的字符串對象的引用。

所以,你也就知道以下代碼輸出結果為false的原因了。

  1. String s1 = new String("Hollis"); 
  2. String s2 = new String("Hollis"); 
  3. System.out.println(s1 == s2); 

因為,==比較的是s1和s2在堆中創(chuàng)建的對象的地址,當然不同了。但是如果使用equals,那么比較的就是字面量的內(nèi)容了,那就會得到true。

在不同版本的JDK中,Java堆和字符串常量池之間的關系也是不同的,這里為了方便表述,就畫成兩個獨立的物理區(qū)域了。具體情況請參考Java虛擬機規(guī)范。

上圖中s1和s2是兩個完全不同的對象,在堆中有自己的內(nèi)存空間,當然不相等了。

所以,String s = new String("Hollis");創(chuàng)建幾個對象的答案你也就清楚了。

常量池中的“對象”是在編譯期就確定好了的,在類被加載的時候創(chuàng)建的,如果類加載時,該字符串常量在常量池中已經(jīng)有了,那這一步就省略了。堆中的對象是在運行期才確定的,在代碼執(zhí)行到new的時候創(chuàng)建的。

運行時常量池的動態(tài)擴展

編譯期生成的各種字面量和符號引用是運行時常量池中比較重要的一部分來源,但是并不是全部。那么還有一種情況,可以在運行期像運行時常量池中增加常量。那就是String的intern方法。

當一個String實例調用intern()方法時,JVM會查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等于str的字符串并返回它的引用;

intern()有兩個作用,***個是將字符串字面量放入常量池(如果池沒有的話),第二個是返回這個常量的引用。

我們再來看下開頭的那個讓人產(chǎn)生疑惑的例子:

  1. String s1 = "Hollis"
  2.     String s2 = new String("Hollis"); 
  3.     String s3 = new String("Hollis").intern(); 
  4.  
  5.     System.out.println(s1 == s2); 
  6.     System.out.println(s1 == s3); 

你可以簡單的理解為String s1 = "Hollis";和String s3 = new String("Hollis").intern();做的事情是一樣的(但實際有些區(qū)別,這里暫不展開)。都是定義一個字符串對象,然后將其字符串字面量保存在常量池中,并把這個字面量的引用返回給定義好的對象引用。如下圖:

對于String s3 = new String("Hollis").intern();,在不調intern情況,s3指向的是JVM在堆中創(chuàng)建的那個對象的引用的(如圖中的s2)。但是當執(zhí)行了intern方法時,s3將指向字符串常量池中的那個字符串常量。

由于s1和s3都是字符串常量池中的字面量的引用,所以s1==s3。但是,s2的引用是堆中的對象,所以s2!=s1。

intern的正確用法

不知道,你有沒有發(fā)現(xiàn),在String s3 = new String("Hollis").intern();中,其實intern是多余的?

因為就算不用intern,Hollis作為一個字面量也會被加載到Class文件的常量池,進而加入到運行時常量池中,為啥還要多此一舉呢?到底什么場景下才會用到intern呢?

在解釋這個之前,我們先來看下以下代碼:

  1. String s1 = "Hollis"
  2.     String s2 = "Chuang"
  3.     String s3 = s1 + s2; 
  4.     String s4 = "Hollis" + "Chuang"

在經(jīng)過反編譯后,得到代碼如下:

  1. String s1 = "Hollis"
  2.    String s2 = "Chuang"
  3.    String s3 = (new StringBuilder()).append(s1).append(s2).toString(); 
  4.    String s4 = "HollisChuang"

可以發(fā)現(xiàn),同樣是字符串拼接,s3和s4在經(jīng)過編譯器編譯后的實現(xiàn)方式并不一樣。s3被轉化成StringBuilder及append,而s4被直接拼接成新的字符串。

如果你感興趣,你還能發(fā)現(xiàn),String s4 = s1 + s2; 經(jīng)過編譯之后,常量池中是有兩個字符串常量的分別是 Hollis、Chuang(其實Hollis和Chuang是String s1 = "Hollis";和String s2 = "Chuang";定義出來的),拼接結果HollisChuang并不在常量池中。

如果代碼只有String s4 = "Hollis" + "Chuang";,那么常量池中將只有HollisChuang而沒有Hollis和 Chuang。

究其原因,是因為常量池要保存的是已確定的字面量值。也就是說,對于字符串的拼接,純字面量和字面量的拼接,會把拼接結果作為常量保存到字符串。

如果在字符串拼接中,有一個參數(shù)是非字面量,而是一個變量的話,整個拼接操作會被編譯成StringBuilder.append,這種情況編譯器是無法知道其確定值的。只有在運行期才能確定。

那么,有了這個特性了,intern就有用武之地了。那就是很多時候,我們在程序中用到的字符串是只有在運行期才能確定的,在編譯期是無法確定的,那么也就沒辦法在編譯期被加入到常量池中。

這時候,對于那種可能經(jīng)常使用的字符串,使用intern進行定義,每次JVM運行到這段代碼的時候,就會直接把常量池中該字面值的引用返回,這樣就可以減少大量字符串對象的創(chuàng)建了。

如一美團點評團隊的《深入解析String#intern》文中舉的一個例子:

  1. static final int MAX = 1000 * 10000; 
  2. static final String[] arr = new String[MAX]; 
  3.  
  4. public static void main(String[] args) throws Exception { 
  5.     Integer[] DB_DATA = new Integer[10]; 
  6.     Random random = new Random(10 * 10000); 
  7.     for (int i = 0; i < DB_DATA.length; i++) { 
  8.         DB_DATA[i] = random.nextInt(); 
  9.     } 
  10.     for (int i = 0; i < MAX; i++) { 
  11.          arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern(); 
  12.     } 

在以上代碼中,我們明確的知道,會有很多重復的相同的字符串產(chǎn)生,但是這些字符串的值都是只有在運行期才能確定的。所以,只能我們通過intern顯示的將其加入常量池,這樣可以減少很多字符串的重復創(chuàng)建。

總結

我們再回到文章開頭那個疑惑:按照上面的兩個面試題的回答,就是說new String也會檢查常量池,如果有的話就直接引用,如果不存在就要在常量池創(chuàng)建一個,那么還要intern干啥?難道以下代碼是沒有意義的嗎?

  1. String s = new String("Hollis").intern(); 

new String 所謂的“如果有的話就直接引用”,指的是Java堆中創(chuàng)建的String對象中包含的字符串字面量直接引用字符串池中的字面量對象。也就是說,還是要在堆里面創(chuàng)建對象的。

而intern中說的“如果有的話就直接返回其引用”,指的是會把字面量對象的引用直接返回給定義的對象。這個過程是不會在Java堆中再創(chuàng)建一個String對象的。

的確,以上代碼的寫法其實是使用intern是沒什么意義的。因為字面量Hollis會作為編譯期常量被加載到運行時常量池。

之所以能有以上的疑惑,其實是對字符串常量池、字面量等概念沒有真正理解導致的。有些問題其實就是這樣,單個問題,自己都知道答案,但是多個問題綜合到一起就蒙了。歸根結底是知識的理解還停留在點上,沒有串成面。

本文中的內(nèi)容歡迎大家討論,因為筆者只是翻閱了部分JVM規(guī)范及Java語言規(guī)范,并未完全深入到虛擬機源碼級別。如有偏頗請不吝賜教。文中例子是為了方面講解特意舉的,如有不當之處望諒解。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2020-11-16 08:37:16

MariaDB性能優(yōu)化

2021-09-01 09:32:40

工具

2022-11-16 14:02:44

2020-12-02 09:36:09

處理器手機卡頓

2020-05-16 13:25:03

分析網(wǎng)購數(shù)據(jù)

2023-06-26 11:59:52

標簽質量梳理

2011-06-22 09:37:03

桌面虛擬化存儲

2025-06-24 09:16:48

2020-12-16 11:09:27

JavaScript語言開發(fā)

2020-12-31 07:57:25

JVM操作代碼

2022-08-08 08:48:15

Go版本偽版本

2021-09-21 16:18:07

手機電池快充

2020-10-27 08:24:45

阿里巴巴SLF4J

2017-08-15 08:27:48

云備份問題恢復

2015-10-12 10:01:26

AndroidWindows應用Windows 10

2025-08-25 09:42:45

2018-06-20 10:43:58

云端霧端霧計算

2021-01-19 06:43:10

Netty框架網(wǎng)絡技術

2023-01-26 00:01:00

機器學習大腦活動

2011-03-07 17:44:59

中小企業(yè)實施虛擬化
點贊
收藏

51CTO技術棧公眾號

av天堂一区二区| 欧美 国产 精品| 波多野结衣一区二区三区四区| 自拍视频一区| 欧美日韩免费高清一区色橹橹 | 国产三级伦理片| 精品99视频| 亚洲人成网站777色婷婷| 国产精品视频分类| 在线观看免费视频你懂的| 北条麻妃一区二区三区| 日韩女优人人人人射在线视频| 亚洲一级片在线播放| 美国十次综合久久| 欧美性猛交xxxx富婆弯腰| 亚洲精品中文字幕乱码三区不卡 | 尤物视频在线看| 95精品视频在线| 国产精品欧美风情| 日本熟妇成熟毛茸茸| 色乱码一区二区三区网站| 日韩免费观看高清完整版| 超碰97人人射妻| 综合久久2019| 日本一二三不卡| 国产富婆一区二区三区| 中文字幕精品在线观看| 亚洲大胆在线| 播播国产欧美激情| 91精品人妻一区二区| 网站一区二区| 欧美日韩午夜影院| 久久久久人妻精品一区三寸| 天天色天天射天天综合网| 久久精品亚洲精品国产欧美kt∨ | 国产一区二区三区在线免费观看| 绯色av蜜臀vs少妇| 国产成人免费| 欧美视频中文字幕在线| 天堂а√在线中文在线 | 精品国产自在精品国产浪潮| 风间由美一二三区av片| 亚洲网址在线观看| 欧美一区二区三区思思人| 婷婷激情四射五月天| 欧美日韩在线观看首页| 亚洲一区二区三区免费视频| 久久免费视频2| 91在线品视觉盛宴免费| 国产亚洲视频系列| 蜜桃传媒视频第一区入口在线看| 免费看av毛片| 成人午夜在线播放| 91视频网页| 99久久国产热无码精品免费| 美女视频黄频大全不卡视频在线播放| 国产97免费视| 国产一级免费视频| 久久成人精品| 国产99久久精品一区二区 夜夜躁日日躁 | 人妻 日韩精品 中文字幕| 日韩a一区二区| 亚洲精品视频久久| 中文字幕在线免费看线人| 麻豆成人入口| 日韩精品视频免费专区在线播放| 奇米777第四色| 久久精品亚洲成在人线av网址| 精品久久一二三区| 欧美熟妇精品一区二区蜜桃视频| 国产精品对白久久久久粗| 欧美精品一区二区三区在线播放 | 日韩新的三级电影| 色欧美片视频在线观看| 国产精品69页| 777午夜精品电影免费看| 欧美制服丝袜第一页| 在线观看国产福利| 视频二区欧美毛片免费观看| 日韩欧美一区中文| 亚州av综合色区无码一区| 久久超碰99| 日韩中文字幕免费| 久久久久久久久毛片| 亚洲夜间福利| 日本精品一区二区三区在线播放视频 | 中文字幕一区二区三区电影| 国产小视频你懂的| 欧美96在线丨欧| 久久久爽爽爽美女图片| 久久国产视频一区| 精品一区二区三区在线观看| 91九色蝌蚪嫩草| 天天干天天做天天操| 久久青草欧美一区二区三区| 亚洲精品视频一二三| 色图在线观看| 色偷偷成人一区二区三区91 | 午夜写真片福利电影网| 在线综合亚洲| 国产精品影院在线观看| 可以免费看毛片的网站| 日本一区二区三区久久久久久久久不| 一区高清视频| a天堂资源在线| 欧美三级韩国三级日本一级| 在线观看你懂的视频| 亚洲香蕉视频| 久久中国妇女中文字幕| 日本特级黄色片| 九九热在线视频观看这里只有精品| http;//www.99re视频| 黄色视屏网站在线免费观看| 亚洲欧美国产三级| 丁香啪啪综合成人亚洲| 日韩欧美激情电影| 一区二区三区四区视频| 国产午夜精品无码| 极品销魂美女一区二区三区| 久久久久久久久一区二区| 黄a在线观看| 欧美综合欧美视频| 国产ts丝袜人妖系列视频| 亚洲91视频| 国产精品99久久久久久久久| 免费a级片在线观看| 中文字幕亚洲视频| 国产日韩成人内射视频| 久久超级碰碰| 欧美丰满片xxx777| 国产精品无码久久av| 欧美国产日韩a欧美在线观看| 日本人体一区二区| 在线精品国产亚洲| 精品国产视频在线| 最新中文字幕免费| 久久久国产午夜精品| www.99热这里只有精品| 99久久香蕉| 欧美精品一区二区免费| 黄色一区二区视频| 久久久久99精品国产片| 欧美亚洲一二三区| 九色丨蝌蚪丨成人| 韩国视频理论视频久久| 精品久久久中文字幕人妻| 中文字幕一区二区三中文字幕| 人人干人人视频| 国产99久久| 欧美亚洲日本黄色| 欧美 日韩 国产 成人 在线| 一区二区三区在线播| 91aaa精品| 91精品国产视频| 成人性生交大片免费看小说| 色网站免费在线观看| 欧美日韩国产小视频在线观看| 东方伊人免费在线观看| 麻豆久久久久久久| 中文字幕免费在线不卡| 91国产一区| 久久久av网站| 99在线精品视频免费观看20| 亚洲人成小说网站色在线| 午夜激情视频网| 欧美日韩精品| 国产日韩一区欧美| 在线观看欧美日韩电影| 亚洲日韩中文字幕| 中国a一片一级一片| 中文字幕亚洲综合久久菠萝蜜| 99九九99九九九99九他书对| 亚洲va在线| 爱情岛论坛亚洲入口| 国内在线视频| 国产视频精品一区二区三区| 无码人妻av免费一区二区三区| 国产片一区二区| 玖玖爱视频在线| 亚洲欧美一级二级三级| 狠狠色伊人亚洲综合网站色| 成人免费看黄| 中文字幕在线成人| 国产叼嘿视频在线观看| 无码av中文一区二区三区桃花岛| 中国美女乱淫免费看视频| 日本午夜精品视频在线观看| 99亚洲精品视频| 精品自拍偷拍| 国产精品欧美激情| 色www永久免费视频首页在线| 亚洲第一区第二区| 中文字幕 国产精品| 亚洲欧美aⅴ...| 538国产视频| 久久成人精品无人区| www成人免费| 欧美手机在线| 岛国一区二区三区高清视频| 中文在线а√天堂| 久久精品国产69国产精品亚洲| 丰满人妻一区二区| 欧美亚洲高清一区二区三区不卡| 欧洲第一无人区观看| 91麻豆视频网站| 亚洲午夜激情影院| 久久福利毛片| 91午夜在线观看| 日韩精品免费一区二区在线观看| 国产精品三区www17con| 中韩乱幕日产无线码一区| 欧美激情精品久久久| av网站无病毒在线| 日韩精品极品在线观看播放免费视频| 在线视频 91| 天天影视涩香欲综合网| 中文字幕电影av| 久久久久久黄色| 四虎永久免费观看| 久99久精品视频免费观看| 免费观看精品视频| 黄色成人在线网站| 先锋影音男人资源| 欧美在线观看视频一区| 久久99精品久久久久久久久久| 激情综合婷婷| 国产女精品视频网站免费| 都市激情亚洲综合| 国内精品美女av在线播放| 精品孕妇一区二区三区| 国产午夜精品视频| 欧美偷拍视频| 亚洲高清免费观看高清完整版| 国产精品爽爽久久久久久| 欧美色综合网站| www.色国产| 欧美日韩中文在线| 天天综合网入口| 亚洲国产视频a| 久久国产精品二区| 一区二区三区四区在线免费观看| 肉色超薄丝袜脚交69xx图片| 久久九九国产精品| 三级网站在线免费观看| 91丨porny丨最新| 91精品小视频| 91丝袜高跟美女视频| 疯狂揉花蒂控制高潮h| 99久久久无码国产精品| 性久久久久久久久久久| 99免费精品在线观看| 男人网站在线观看| www.av精品| 六十路息与子猛烈交尾| 99久久综合精品| 国产精品无码午夜福利| 久久精品欧美一区二区三区不卡 | 国产精品一线二线三线| 亚洲午夜91| 精品无码一区二区三区在线| 日韩一区二区免费看| 国产精品333| 亚洲欧美久久久| 精品中文字幕av| 日日欢夜夜爽一区| www.亚洲高清| 国产在线精品免费| 免费看91视频| av成人老司机| 自拍偷拍亚洲天堂| 国产精品嫩草影院com| а天堂中文在线资源| 一区二区在线看| 国产精品99无码一区二区| 精品久久香蕉国产线看观看gif| 午夜精品久久久久久久久久久久久蜜桃| 午夜精品福利视频网站| 台湾佬中文在线| 欧美日韩在线精品一区二区三区激情 | 国产麻豆免费视频| 欧美变态口味重另类| 同心难改在线观看| 国产亚洲精品91在线| 久做在线视频免费观看| 久久久久久久久久久国产| 亚洲妇女成熟| 成人福利网站在线观看| 18国产精品| 农村寡妇一区二区三区| 欧美成免费一区二区视频| 国产女教师bbwbbwbbw| 亚洲一区日韩| www.污污视频| av高清久久久| 日日操免费视频| 亚洲综合色区另类av| 中文字幕国产在线观看| 欧美一区二区三区四区在线观看| 天天综合天天色| 日韩小视频在线观看| 91九色在线看| 91精品久久久久久| 秋霞在线一区| 国产av第一区| 国产亚洲永久域名| 又黄又爽又色的视频| 久久精品夜色噜噜亚洲aⅴ| 欧美精品入口蜜桃| 欧美日韩一卡二卡三卡| 日本激情一区二区三区| 日韩亚洲欧美成人| 中国色在线日|韩| 亚洲自拍欧美另类| 欧美一区二区性| 色欲色香天天天综合网www| 激情小说亚洲一区| 国产小视频自拍| 午夜精品免费在线| 国产美女无遮挡永久免费| 亚洲精选在线观看| 久色国产在线| 成人精品久久久| 欧美影院三区| 免费激情视频在线观看| 91在线视频免费观看| 久久久精品国产sm调教| 欧美日韩亚洲高清一区二区| 男男电影完整版在线观看| 国内精品模特av私拍在线观看| 精品视频一区二区三区| 亚洲图色在线| 日韩av一二三| 91国模少妇一区二区三区| 欧美日韩久久久久| 国精产品一品二品国精品69xx| 久久精品人人做人人爽| 日本欧美在线| 亚洲精品乱码视频| 日本美女一区二区三区视频| 亚洲精品成人无码| 色婷婷激情一区二区三区| 青春有你2免费观看完整版在线播放高清| 欧美黑人xxxⅹ高潮交| 日韩激情精品| 成年丰满熟妇午夜免费视频| 国模一区二区三区白浆| 日韩欧美123区| 91精品欧美福利在线观看| 麻豆tv入口在线看| 国产在线观看精品| 色综合咪咪久久网| 午夜宅男在线视频| 国产精品高潮呻吟久久| 一区二区国产欧美| 久久精品免费电影| 老司机亚洲精品一区二区| 法国空姐在线观看免费| 国产精品99久| 久久精品免费在线| 日韩精品中文字幕视频在线| 中文字幕一区久| 日韩精品另类天天更新| 免费国产亚洲视频| 亚洲女人久久久| 日韩一区二区电影| a√中文在线观看| 久久婷婷国产综合尤物精品| 模特精品在线| 国精产品一区一区| 日韩一级大片在线观看| 91制片在线观看| 日本一区免费| 经典三级在线一区| 国产亚洲精品久久久久久无几年桃| 亚洲第一福利网站| 91精品xxx在线观看| 一本色道婷婷久久欧美| 国产毛片精品一区| 欧美亚洲天堂网| 亚洲欧美中文字幕在线一区| 激情欧美一区二区三区黑长吊| 亚洲 欧洲 日韩| 成人免费av在线| 亚洲国产成人精品女人久久| 日韩在线视频线视频免费网站| 一本一道久久a久久| 日本黄色三级大片| 国产精品久久久久aaaa| 俄罗斯嫩小性bbwbbw| 国产精品 欧美在线| 在线精品视频在线观看高清| 三级电影在线看| 欧美精三区欧美精三区| segui88久久综合| 日韩一区不卡| 成人性视频免费网站| 中日韩av在线| 97在线免费视频| 99视频精品全国免费| 一级欧美一级日韩片|