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

萬萬沒想到!!! 谷歌面試原來也問ArrayList

開發 前端
前幾天H同學和我聊了下去谷歌的面試經驗,令我詫異的是,沒想到谷歌也問ArrayList???仔細一想也正常,畢竟集合是Java程序員逃不掉的金光咒。

[[417055]]

本文轉載自微信公眾號「稀飯下雪」,作者帥氣的小飯飯 。轉載本文請聯系稀飯下雪公眾號。

前幾天H同學和我聊了下去谷歌的面試經驗,令我詫異的是,沒想到谷歌也問ArrayList???

仔細一想也正常,畢竟集合是Java程序員逃不掉的金光咒。

看文章前可以先看看以下幾個問題,如果覺得莫得問題,可以直接跳過該篇文章了,不用浪費大家時間。

  • ArrayList使用無參構造函數的時候什么時候進行擴容?
  • 說說看ArrayList是擴容的時候是怎么復制數組的?
  • ArrayList遍歷刪除的時候會觸發什么機制?為什么用迭代器遍歷刪除不會?

好了,接下來繼續聊聊高頻面試題 ArrayList。

ArrayList的擴容機制

  1. // 存儲數組元素的緩沖區 
  2. transient Object[] elementData; 
  3. // 默認空數組元素 
  4. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 
  5. // 默認初始化容量 
  6. private static final int DEFAULT_CAPACITY = 10; 
  7. // 數組的大小 
  8. private int size
  9. // 記錄被修改的次數 
  10. protected transient int modCount = 0; 
  11. // 數組的最大值 
  12. private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 

底層ArrayList使用數組實現,不設置的話,默認初始容量為10

  1. // 數組擴容方法 
  2. // minCapacity = size + 1 
  3. private int newCapacity(int minCapacity) { 
  4.     // 當前數組長度 
  5.     int oldCapacity = elementData.length; 
  6.     // 新的數組容量 = 舊數組長度 + 舊數組長度 / 2  
  7.     // oldCapacity = 10   oldCapacity >> 1   --- 5 
  8.     // 例如10的二進制為 :  0000 1010 >> 1  ----->  0000 0101 = 5 
  9.     int newCapacity = oldCapacity + (oldCapacity >> 1); 
  10.     if (newCapacity - minCapacity <= 0) { 
  11.         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) 
  12.             // 如果一開始沒有定義初始容量這時newCapacity=0,返回默認容量10 
  13.             // 可以得出當無參new 一個ArrayList()時候,這個ArrayList()為空集合,size為0 
  14.             return Math.max(DEFAULT_CAPACITY, minCapacity); 
  15.         if (minCapacity < 0) // overflow 
  16.             throw new OutOfMemoryError(); 
  17.         return minCapacity; 
  18.     } 
  19.     return (newCapacity - MAX_ARRAY_SIZE <= 0) 
  20.         ? newCapacity    // 這里返回的長度為原數組的1.5倍 
  21.         : hugeCapacity(minCapacity); 

當增加元素的時候發現底層數組的需要的容量(size+1)大于數組的容量的時候,就會觸發擴容,在首次調用add()方法之后,返回一個容量為10的數組,后面每次擴容后新數組的長度為原數組長度的 「1.5」 倍,并調用底層原生的System.arraycopy將舊數組的數據copy到新的數組中,完成整個擴容。

所以日常開發中,在知道初始值的時候先設置初始值,因為擴容是比較耗性能的。

「不用腦子的總結:首次擴容為10 ,后面每次擴容為原數組的1.5倍,調用底層原生的System.arraycopy將舊數組的數據copy到新的數組中,完成整個擴容。」

ArrayList添加元素與擴容

ArrayList.add(E e)源碼:

  1. public boolean add(E e) { 
  2.     ensureCapacityInternal(size + 1);  // Increments modCount!! 
  3.     elementData[size++] = e; 
  4.     return true

add()中elementData[size++] = e很好理解,就是將元素插入第size個位置,然后將size++,我們重點來看看ensureCapacityInternal(size + 1)方法;

  1. private void ensureCapacityInternal(int minCapacity) { 
  2.     if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { 
  3.         minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); 
  4.     } 
  5.     ensureExplicitCapacity(minCapacity); 

ensureCapacityInternal()方法中判斷緩存變量elementData是否為空,也就是判斷是否是第一次添加元素,如果是第一次添加元素,則設置初始化大小為默認容量10,否則為傳入的參數。這個方法的目的就是「獲取初始化數組容量」。獲取到初始化容量后調用ensureExplicitCapacity(minCapacity)方法;

  1. private void ensureExplicitCapacity(int minCapacity) { 
  2.     modCount++; 
  3.  
  4.     // overflow-conscious code 
  5.     if (minCapacity - elementData.length > 0) 
  6.         grow(minCapacity); 

ensureExplicitCapacity(minCapacity)方法用來判斷是否需要擴容,假如第一次添加元素,minCapacity為10,elementData容量為0,那么就需要去擴容。調用grow(minCapacity)方法。

  1. // 數組的最大容量 
  2. private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 
  3.  
  4. private void grow(int minCapacity) { 
  5.     // overflow-conscious code 
  6.     int oldCapacity = elementData.length; 
  7.     // 擴容大小為原來數組長度的1.5倍 
  8.     int newCapacity = oldCapacity + (oldCapacity >> 1); 
  9.     // 擴容容量比需要擴容的長度小,則使用需要擴容的容量 
  10.     if (newCapacity - minCapacity < 0) 
  11.         newCapacity = minCapacity; 
  12.     // 擴容容量比最大數組長度大,則使用最大整數長度 
  13.     if (newCapacity - MAX_ARRAY_SIZE > 0) 
  14.         newCapacity = hugeCapacity(minCapacity); 
  15.     // minCapacity is usually close to size, so this is a win: 
  16.     elementData = Arrays.copyOf(elementData, newCapacity); 

grow(minCapacity)方法對數組進行擴容,擴容大小為原數組的1.5倍,如果計算出的擴容容量比需要的容量小,則擴容大小為需要的容量,可以看到,第一次擴容的時候其實是10。如果擴容容量比數組最大容量大,則調用hugeCapacity(minCapacity)方法,將數組擴容為整數的最大長度,然后將elemetData數組指向新擴容的內存空間并將元素復制到新空間,這里使用的是 Arrays.copyOf(elementData, newCapacity)

  1. public static int[] copyOf(int[] original, int newLength) { 
  2.     int[] copy = new int[newLength]; 
  3.     System.arraycopy(original, 0, copy, 0, 
  4.                      Math.min(original.length, newLength)); 
  5.     return copy; 

可以看到底層使用的是System.arraycopy,而這個copy的過程是比較耗性能的,因此建議初始化時預估一個容量大小。

「不用腦子的總結:用無參構造函數創建ArrayList后進行第一次擴容容量是10,后續則是1.5倍,底層調用的是System.arraycopy,而這個copy的過程是比較耗性能的,因此建議初始化時預估一個容量大小。」

ArrayList刪除元素

ArrayList提供兩種刪除元素的方法,可以通過索引和元素進行刪除。兩種刪除大同小異,刪除元素后,將后面的元素一次向前移動。

ArrayList.remove(int index)源碼:

  1. public E remove(int index) { 
  2.     rangeCheck(index); 
  3.  
  4.     modCount++; 
  5.     E oldValue = elementData(index); 
  6.  
  7.     int numMoved = size - index - 1; 
  8.     if (numMoved > 0) 
  9.         System.arraycopy(elementData, index+1, elementData, index
  10.                          numMoved); 
  11.     elementData[--size] = null; // clear to let GC do its work 
  12.  
  13.     return oldValue; 

刪除元素時,首先會判斷索引是否大于ArrayList的大小,如果索引范圍正確,則將索引位置的下一個元素賦值到索引位置,將ArrayList的大小-1,最后返回移除的元素。

「不用腦子的總結:刪除后底層調用的依舊是System.arraycopy,而這個copy的過程是比較耗性能的,因此才說頻繁增刪的盡量別用ArrayList。」

ArrayList遍歷刪除

  1. @Override 
  2. public void forEach(Consumer<? super E> action) { 
  3.     Objects.requireNonNull(action); 
  4.     // 預設值了一個expectedModCount值 
  5.     final int expectedModCount = modCount; 
  6.     @SuppressWarnings("unchecked"
  7.     final E[] elementData = (E[]) this.elementData; 
  8.     final int size = this.size
  9.     // 遍歷過程中拿出來判斷 
  10.     for (int i=0; modCount == expectedModCount && i < size; i++) { 
  11.         action.accept(elementData[i]); 
  12.     } 
  13.     // 如果對不上則報錯 
  14.     if (modCount != expectedModCount) { 
  15.         throw new ConcurrentModificationException(); 
  16.     } 
  1. public E remove(int index) {  
  2.     rangeCheck(index);  
  3.  // 修改了modCount  
  4.     modCount++;  
  5.     E oldValue = elementData(index);  
  6.   
  7.     int numMoved = size - index - 1;  
  8.     if (numMoved > 0)  
  9.         System.arraycopy(elementData, index+1, elementData, index,  
  10.                          numMoved);  
  11.     elementData[--size] = null; // clear to let GC do its work  
  12.   
  13.     return oldValue;  
  14. }  

從代碼就可以看出來了,在遍歷的時候會率先 預設值了一個expectedModCount值,然后再遍歷拿出來判斷,如果不一樣了,則中斷流程并且報錯,而這個過程則涉及到了快速失敗機制了,正常來說,ArrayList不允許遍歷刪除。

「不用腦子的總結:ArrayList通過預設值expectedModCount實現了快速失敗機制,避免了多線程遍歷刪除或者增加,以及遍歷過程中增刪元素。」

集合的快速失敗(fail-fast)

它是 Java 集合的一種錯誤檢測機制,當多個線程對集合進行結構上的改變操作時,有可能會產生 fail-fast 機制。

迭代器在遍歷時直接訪問集合中的內容,并且在遍歷過程中使用一個 modCount 變量。集合在被遍歷期間如果內容發生變化,就會改變modCount的值。每當迭代器使用hashNext()/next()遍歷下一個元素之前,都會檢測modCount變量是否為expectedmodCount值,是的話就返回遍歷;否則拋出異常,終止遍歷。

注意:這里異常的拋出條件是檢測到 modCount!=expectedmodCount 這個條件。如果集合發生變化時修改modCount值剛好又設置為了expectedmodCount值,則異常不會拋出。因此,不能依賴于這個異常是否拋出而進行并發操作的編程,這個異常只建議用于檢測并發修改的bug。

場景:java.util包下的集合類都是快速失敗的,不能在多線程下發生并發修改(迭代過程中被修改)。

「不用腦子的總結:我們日常看到的Concurrent Modification Exception,其實就是觸發了快速失敗機制的表現,做法也很簡單:在遍歷的時候給你給modCount設置個備份expectedModCount,如果有多線程在搞,那么必定會導致modCount被改,那么就容易了,每次遍歷的時候都檢測下modCount變量是否為expectedModCount就可以了,如果不是意味著被改了,那我就不管,我就要報錯。」

集合的安全失敗(fail-safe)

采用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先復制原有集合內容,在拷貝的集合上進行遍歷。

原理:由于迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改并不能被迭代器檢測到,所以不會觸發Concurrent Modification Exception。

缺點:基于拷貝內容的優點是避免了Concurrent Modification Exception,但同樣地,迭代器并不能訪問到修改后的內容,即:迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝,在遍歷期間原集合發生的修改迭代器是不知道的。

場景:java.util.concurrent包下的容器都是安全失敗,可以在多線程下并發使用,并發修改。

「不用記憶的總結:那么為啥并發容器的時候不怕呢?簡單,因為采用了安全失敗機制,在遍歷的時候直接拷貝了一份出來,這樣就不會觸發了。」

使用ArrayList的subList()需要注意的地方

  1. public List<E> subList(int fromIndex, int toIndex) { 
  2.         subListRangeCheck(fromIndex, toIndex, size); 
  3.         return new SubList(this, 0, fromIndex, toIndex); 
  1. SubList(AbstractList<E> parent,int offset,int fromIndex,int toIndex) { 
  2.             this.parent = parent; 
  3.             this.parentOffset = fromIndex; 
  4.             this.offset = offset + fromIndex; 
  5.             this.size = toIndex - fromIndex; 
  6.             this.modCount = ArrayList.this.modCount; 

subList()返回結果不可強制轉為ArrayList類型,因為該方法實質是創建一個內部類SubList實例,這個SubList是AbstractList的實現類,并不繼承于ArrayList。

通過上面源碼可以看出,通過parent屬性指定父類并直接引用了原有的List,并返回該父類的部分視圖,只是指定了他要使用的元素的范圍fromIndex(包含),endIndex(不包含)。

那么,如果對其原有或者子List做數據性修改,則會互相影響。如果對原有List進行結構性修改,則會踩坑Fast-fail,報錯會拋出異常ConcurrentModification Exception。

ArrayList迭代器

看下迭代器的遍歷和刪除相關的源碼

  1. public boolean hasNext() { 
  2.     return cursor != size
  3.  
  4. @SuppressWarnings("unchecked"
  5. public E next() { 
  6.     // 同樣判斷modCount != expectedModCount,不同則報錯 
  7.     checkForComodification(); 
  8.     int i = cursor
  9.     if (i >= size
  10.         throw new NoSuchElementException(); 
  11.     Object[] elementData = ArrayList.this.elementData; 
  12.     if (i >= elementData.length) 
  13.         throw new ConcurrentModificationException(); 
  14.     cursor = i + 1; 
  15.     return (E) elementData[lastRet = i]; 
  16.  
  17. public void remove() { 
  18.     if (lastRet < 0) 
  19.         throw new IllegalStateException(); 
  20.     checkForComodification(); 
  21.  
  22.     try { 
  23.         ArrayList.this.remove(lastRet); 
  24.         cursor = lastRet; 
  25.         lastRet = -1; 
  26.         // 這里刪除后會重新復制一次 
  27.         expectedModCount = modCount; 
  28.     } catch (IndexOutOfBoundsException ex) { 
  29.         throw new ConcurrentModificationException(); 
  30.     } 

通過代碼我們也可以看出ArrayList的迭代器是支持遍歷刪除的,因為在刪除后會重新賦一次值給expectedModCount。

ArrayList和LinkedList的優劣

其實就是數組和鏈表的優劣勢,ArrayList優點,支持隨機訪問,get(i)的時間復雜度為O(1),而缺點就是需要擴容,要復制數組,而且內部插入數據需要移動數據,插入刪除的性能差;

對于LinkedList來說,優點就是容量理論上來說是無限,不存在擴容,而且可以很方便的插入和刪除數據(性能損失在查找),而缺點就是不能隨機訪問,get(i)需要遍歷。 

貌似就是反過來的,所以在實際開發中也很容易區別,看是查找頻繁、還是增刪頻繁,如果是查找頻繁就用ArrayList,如果增刪頻繁就用LinkedList即可。

 

責任編輯:武曉燕 來源: 稀飯下雪
相關推薦

2021-11-29 05:37:24

Windows Def操作系統微軟

2015-07-15 13:00:31

英特爾開源

2023-10-31 12:29:25

模型訓練

2025-09-09 09:03:00

2017-12-12 11:09:39

顯卡散熱CPU

2018-06-27 14:23:38

機器學習人工智能入門方法

2018-05-02 09:38:02

程序員代碼互聯網

2024-01-04 12:33:17

ChatGPTAI視頻

2021-02-21 17:14:27

程序員技能開發者

2020-06-08 08:38:24

可執行文件文件字符

2021-08-31 09:35:01

TCPIP漏洞

2023-08-10 08:00:00

2019-08-19 09:21:36

程序員Bug代碼

2021-07-21 05:38:20

中國聯通攜號轉網移動

2021-01-27 18:13:35

日志nginx信息

2019-04-12 09:24:46

Spring Clou服務注冊

2019-04-28 14:14:48

爬蟲網絡特價機票

2019-10-12 08:53:26

Redis多線程版本

2017-12-26 15:41:26

2018-01-26 23:23:23

JDBC MySQL數據庫
點贊
收藏

51CTO技術棧公眾號

成人福利网站在线观看| www.久久色.com| 2022亚洲天堂| 91在线看黄| 国产盗摄视频一区二区三区| 午夜精品在线视频| 国产传媒在线看| 91成人午夜| 欧美性大战久久久久久久蜜臀 | 欧美日韩国产综合新一区| 欧美激情专区| 精品毛片一区二区三区| 亚洲深爱激情| 久久这里只有精品视频首页| 亚洲中文字幕无码av| 欧美综合社区国产| 欧美色另类天堂2015| 欧美一级免费在线观看| 无码精品一区二区三区在线| 久久精品久久综合| 97国产suv精品一区二区62| 天堂网av2018| 亚洲香蕉视频| 亚洲第一区中文99精品| 911福利视频| 美女一区网站| 午夜精彩视频在线观看不卡| 先锋影音男人资源| 国产福利在线看| fc2成人免费人成在线观看播放| 国产精品国产三级国产专播精品人| 国产大片中文字幕| 国产精品麻豆久久| 国产亚洲精品va在线观看| 精品久久久久久无码人妻| 91国产一区| 欧美色网一区二区| 97在线免费公开视频| 国产经典三级在线| 一区二区三区不卡在线观看 | 国产亚洲精品v| 欧美日韩高清在线观看| 日韩精品久久久久久久的张开腿让 | 色综合久久天天| 国产视频九色蝌蚪| 91av久久| 精品久久久久久中文字幕一区奶水| 中国 免费 av| 97caopron在线视频| 中文字幕一区二区三区精华液 | 国产一区日韩欧美| 久久99久国产精品黄毛片入口| 欧美精品日韩在线| 精品久久久久久久| 深夜福利91大全| 成人信息集中地| 97精品国产| 色婷婷av一区二区三区在线观看| 在线免费观看视频| 日韩成人免费| 久久影视电视剧免费网站清宫辞电视 | 久久久久久国产精品| 国产黄色片在线免费观看| 欧美黄色一区二区| 国语对白做受69| 日韩欧美亚洲视频| 久久久久99| 国产精品久久婷婷六月丁香| 一级黄色av片| 精品一区二区三区在线视频| 亚洲一区二区三区四区在线播放| 国内老熟妇对白xxxxhd| 丁香婷婷综合网| 美日韩免费视频| 91在线看片| 夜夜爽夜夜爽精品视频| 777av视频| 日韩国产激情| 欧美放荡的少妇| 亚洲精品成人无码毛片| 台湾佬综合网| 日韩综合中文字幕| 久久网中文字幕| 久久中文在线| 亚洲自拍中文字幕| 日av在线播放| 日韩毛片视频在线看| 国产精品无码电影在线观看| 国产免费拔擦拔擦8x高清在线人| 日本道色综合久久| 日韩久久久久久久久久久| 久久悠悠精品综合网| 正在播放亚洲1区| 青娱乐av在线| 日韩成人免费电影| 99久久99久久精品国产片| 精品久久av| 亚洲综合精品自拍| 一道本视频在线观看| 亚洲1区在线观看| 亚洲人成网站在线播| 少妇人妻丰满做爰xxx| 亚洲国产三级| 国产在线999| 每日更新在线观看av| 亚洲欧洲一区二区在线播放| 免费一级特黄毛片| **国产精品| 亚洲美女av网站| 久久黄色免费网站| 精品一区二区三区在线播放 | 91精品国产综合久久久久久久久| 日本激情一区二区| 亚洲婷婷综合久久一本伊一区| 乱人伦xxxx国语对白| 粉嫩一区二区三区在线观看| 亚洲欧美成人在线| 久久亚洲成人av| 久久精品国产亚洲一区二区三区| 精品国产中文字幕| 2024短剧网剧在线观看| 欧美日韩欧美一区二区| a视频免费观看| 亚洲日本激情| 国产传媒一区二区三区| av在线免费网址| 欧美三级视频在线| xxxx日本黄色| 久久九九电影| 欧美精品v日韩精品v国产精品| 国产蜜臀在线| 精品国产乱码久久久久久久| 欧美黑人性猛交xxx| 久88久久88久久久| 亚洲精品8mav| 亚洲成人va| 在线成人激情黄色| 波多野结衣影片| 久久精品一区二区三区四区| 国产乱子伦农村叉叉叉| 国产精品极品| 91国产视频在线| 亚洲欧洲视频在线观看| 婷婷久久综合九色国产成人| 亚洲精品乱码久久久久久蜜桃欧美| 91tv精品福利国产在线观看| 91精品在线播放| 免费av在线网站| 91精品国产综合久久蜜臀| 91大神福利视频| 久久精品国产精品青草| 中文字幕精品一区日韩| 91视频亚洲| 欧美成在线视频| 午夜精品在线播放| 性久久久久久久久久久久| 你懂的在线观看网站| 国产情侣一区| 色姑娘综合av| 青草综合视频| 精品中文字幕在线| 男人天堂av网| 色综合天天视频在线观看 | 欧美激情在线免费| 国产精品久久久久7777婷婷| av电影在线播放高清免费观看| 欧美日韩日日摸| 欧美毛片在线观看| 不卡的电视剧免费网站有什么| 欧美 日韩 激情| 欧美精品系列| 亚洲自拍偷拍福利| 国产精品一区二区日韩| 一区二区三区亚洲| 99久久精品国产成人一区二区| 亚洲影院久久精品| 少妇毛片一区二区三区| 青青草成人在线观看| 伊人网在线免费| 欧美亚洲tv| 国产一区二区在线免费视频| 亚洲七七久久综合桃花剧情介绍| 亚洲国产高潮在线观看| 黄色大全在线观看| 亚洲综合图片区| 91视频免费观看网站| 久久精品国产第一区二区三区| 高清无码视频直接看| 午夜精品影视国产一区在线麻豆| 国产一区欧美二区三区| 国产ktv在线视频| 久久精品国产成人精品| 天天射天天操天天干| 欧美性受极品xxxx喷水| 欧美成人手机视频| 国产亚洲欧洲一区高清在线观看| www.五月天色| 欧美资源在线| 成年人看的毛片| 久久国产影院| 精品国产免费久久久久久尖叫| 亚洲网站免费| 国产成人福利网站| 欧美性video| 久久精品91久久久久久再现| 天堂中文资源在线| 日韩久久精品一区| 伊人网免费视频| 欧美性猛交xxxx黑人猛交| 中文字幕人妻一区二| 久久久久国色av免费看影院| 国产大尺度视频| 久久成人麻豆午夜电影| 日本三级免费观看| 激情欧美丁香| 日本精品福利视频| 四虎国产精品免费观看| 免费国产一区二区| 国产成人澳门| 国产chinese精品一区二区| 日韩伦理一区二区| 国产精品自拍视频| 亚洲mmav| 国产mv久久久| 成人爱爱网址| 全亚洲最色的网站在线观看| 丁香花高清在线观看完整版| 久久影院中文字幕| 福利视频在线播放| 亚洲色图国产精品| 青青青免费视频在线2| 亚洲国产成人精品一区二区| 午夜美女福利视频| 日韩欧美成人一区二区| 国产成人av免费看| 欧美一级xxx| 国产三级视频在线播放| 欧美一区三区四区| 99精品免费观看| 日韩免费视频一区二区| www.av日韩| 精品欧美一区二区久久| 亚洲第一色网站| 精品黑人一区二区三区久久| 亚洲国产福利视频| 精品国一区二区三区| 欧美熟妇另类久久久久久不卡| 欧美变态凌虐bdsm| 天堂国产一区二区三区| 精品中文字幕久久久久久| 日韩电影免费| 夜夜嗨av一区二区三区免费区| 黄色大片在线看| 伊人青青综合网站| 精品欧美色视频网站在线观看| 日韩亚洲欧美中文高清在线| 久久久久久国产精品免费无遮挡| 按摩亚洲人久久| 污片在线免费观看| 97久久久久久| 欧美va在线观看| 国产欧美一区二区| 伊人久久影院| 精品久久久久久乱码天堂| 亚洲综合小说图片| 亚洲v日韩v欧美v综合| 婷婷亚洲综合| 9久久9毛片又大又硬又粗| 美女网站久久| 在线免费黄色网| 成人免费视频视频在线观看免费| 国内精品久久99人妻无码| 中文字幕欧美日本乱码一线二线 | 免费黄色片在线观看| 色老头一区二区三区在线观看| √天堂8在线网| 欧美又大又粗又长| 中文字幕成人| 国产伦精品一区二区三区视频孕妇| 亚洲区小说区图片区qvod| 亚洲一区二区免费视频软件合集 | 99久久久无码国产精品6| 美女国产一区二区三区| 美女又黄又免费的视频| 国产亚洲综合性久久久影院| 污污的视频在线免费观看| 午夜久久久影院| 国产精品老熟女视频一区二区| 欧美r级电影在线观看| 国产高清视频在线| 欧美多人爱爱视频网站| 欧美aaa视频| 国产精品免费一区二区三区四区| 国产成人精品999在线观看| aaa免费在线观看| 老色鬼久久亚洲一区二区| 色姑娘综合天天| 国产视频一区不卡| 国产精品1000| 在线播放91灌醉迷j高跟美女 | av不卡在线观看| 中文字幕美女视频| 色香蕉成人二区免费| 成人黄色免费视频| 影音先锋日韩有码| 中文在线а√天堂| 成人av免费在线看| 99欧美视频| 欧美自拍小视频| 99视频一区二区三区| 日韩影院一区二区| 欧美日韩精品欧美日韩精品| 日韩专区一区二区| 久久久久久国产三级电影| 亚洲福利影视| 天堂av一区二区| 久久福利影视| 女同性恋一区二区三区| 一区二区三区中文字幕电影 | 久久久精品视频免费| 欧美浪妇xxxx高跟鞋交| 国产污视频在线| 欧美资源在线观看| 欧美精品中文| 免费 成 人 黄 色| 成人av电影免费观看| 538精品在线观看| 777亚洲妇女| 麻豆影视在线观看_| 国产精品永久免费观看| 韩日一区二区三区| av免费在线播放网站| 91视视频在线观看入口直接观看www | 美女尤物久久精品| 国产特黄级aaaaa片免| 欧美性色19p| 偷拍自拍在线| 热久久这里只有精品| 色天天色综合| 日韩久久一级片| 久久久噜噜噜久噜久久综合| 永久免费无码av网站在线观看| 日韩激情视频在线| 黑人巨大精品| 日本免费高清一区二区| 久久综合九色| 国产91在线播放九色| 欧美精品久久久久久久多人混战| 免费黄网在线观看| 91亚色免费| 黑人一区二区| 亚洲の无码国产の无码步美| 欧美日韩免费在线| 国产精品视频二区三区| 国产精品视频永久免费播放| 日韩在线视屏| 色欲无码人妻久久精品| 亚洲成人自拍偷拍| 日本天堂影院在线视频| 国产精品mp4| 99久久亚洲精品蜜臀| 中文字幕第六页| 五月激情综合网| 国产福利片在线| 亚洲精品免费av| 99精品视频网| 日本猛少妇色xxxxx免费网站| 欧美卡1卡2卡| aa国产成人| 日韩欧美在线一区二区| 国产自产高清不卡| 青青草av在线播放| 中文字幕视频在线免费欧美日韩综合在线看 | 日本中文字幕中出在线| 精品久久sese| 久久99热狠狠色一区二区| 久草网在线观看| 国产亚洲欧美日韩精品| 爱情电影网av一区二区| a级黄色一级片| 国产精品大尺度| 香港一级纯黄大片| 国产精品一区二区三区毛片淫片| 一区二区三区午夜视频| 麻豆国产精品一区| 欧美日韩一级片网站| 大菠萝精品导航| 一区二区三区欧美成人| av网站免费线看精品| 亚洲图片中文字幕| 性日韩欧美在线视频| 91嫩草亚洲精品| 亚洲一区二区乱码| 欧美一区二区三区婷婷月色 | 91黄色小视频| 欧美6一10sex性hd| 亚洲一区二区三区加勒比| 91亚洲永久精品| 国产成人精品a视频| 国产精品久久久久久久久久小说|