亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java性能優化技巧

2019-11-11 00:14:59
字體:
來源:轉載
供稿:網友
java程序中,性能問題的大部分原因并不在于JAVA語言,而是程序本身。養成良好的編碼習慣非常重要,能夠顯著地提升程序性能。 1. 盡量使用final修飾符。 帶有final修飾符的類是不可派生的。在JAVA核心API中,有許多應用final的例子,例如 java.lang.String。為String類指定final防止了使用者覆蓋length()方法。另外,如果一個類是final的,則該類所有方法都是final的。java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高 50%。2.盡量重用對象。 特別是String對象的使用中,出現字符串連接情況時應使用StringBuffer代替,由于系統不僅要花時間生成對象,以后可能還需要花時間對這些對象進行垃圾回收和處理。因此生成過多的對象將會給程序的性能帶來很大的影響。3. 盡量使用局部變量。 調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態變量,實例變量等,都在堆(Heap)中創建,速度較慢。 4.不要重復初始化變量。 默認情況下,調用類的構造函數時,java會把變量初始化成確定的值,所有的對象被設置成null,整數變量設置成0,float和double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵字創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。這里有個注意,給成員變量設置初始值但需要調用其他方法的時候,最好放在一個方法比如initXXX()中,因為直接調用某方法賦值可能會因為類尚未初始化而拋空指針異常,public int state = this.getState();5.在java+Oracle的應用系統開發中,java中內嵌的SQL語言應盡量使用大寫形式,以減少Oracle解析器的解析負擔。6.java編程過程中,進行數據庫連接,I/O流操作,在使用完畢后,及時關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷。7.過分的創建對象會消耗系統的大量內存,嚴重時,會導致內存泄漏,因此,保證過期的對象的及時回收具有重要意義。 JVM的GC并非十分智能,因此建議在對象使用完畢后,手動設置成null。 8.在使用同步機制時,應盡量使用方法同步代替代碼塊同步。 9.盡量減少對變量的重復計算。 比如
for(int i=0;i<list.size();i++) 應修改為 
for(int i=0,len=list.size();i<len;i++)10. 采用在需要的時候才開始創建的策略。 例如: 
String str="abc";if(i==1){ list.add(str);}應修改為: 
if(i==1){String str="abc"; list.add(str);}11.慎用異常,異常對性能不利。 拋出異常首先要創建一個新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地方法,fillInStackTrace()方法檢查棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用棧,因為在處理過程中創建了一個新的對象。異常只能用于錯誤處理,不應該用來控制程序流程。 12.不要在循環中使用Try/Catch語句,應把Try/Catch放在循環最外層。 Error是獲取系統錯誤的類,或者說是虛擬機錯誤的類。不是所有的錯誤Exception都能獲取到的,虛擬機報錯 Exception就獲取不到,必須用Error獲取。13.通過StringBuffer的構造函數來設定他的初始化容量,可以明顯提升性能。 StringBuffer的默認容量為16,當StringBuffer的容量達到最大容量時,她會將自身容量增加到當前的2倍+2,也就是2*n+2。無論何時,只要StringBuffer到達她的最大容量,她就不得不創建一個新的對象數組,然后復制舊的對象數組,這會浪費很多時間。所以給StringBuffer設置一個合理的初始化容量值,是很有必要的!14.合理使用java.util.Vector。 Vector 與StringBuffer類似,每次擴展容量時,所有現有元素都要賦值到新的存儲空間中。Vector的默認存儲能力為10個元素,擴容加倍。 vector.add(index,obj) 這個方法可以將元素obj插入到index位置,但index以及之后的元素依次都要向下移動一個位置(將其索引加 1)。 除非必要,否則對性能不利。同樣規則適用于remove(int index)方法,移除此向量中指定位置的元素。將所有后續元素左移(將其索引減 1)。返回此向量中移除的元素。所以刪除vector最后一個元素要比刪除第1個元素開銷低很多。刪除所有元素最好用 removeAllElements()方法。如果要刪除vector里的一個元素可以使用 vector.remove(obj);而不必自己檢索元素位置,再刪除,如int index = indexOf(obj);vector.remove(index);15.當復制大量數據時,使用 System.arraycopy(); 16.代碼重構,增加代碼的可讀性。 17.不用new關鍵字創建對象的實例。 用 new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable接口,我們可以調用她的clone() 方法。clone()方法不會調用任何類構造函數。下面是Factory模式的一個典型實現。 
public static Credit getNewCredit(){    return new Credit();}改進后的代碼使用clone() 方法, 
PRivate static Credit BaseCredit = new Credit();public static Credit getNewCredit(){    return (Credit)BaseCredit.clone();}18. 乘除法如果可以使用位移,應盡量使用位移,但最好加上注釋,因為位移操作不直觀,難于理解。19.不要將數組聲明為:public static final。 20.HaspMap的遍歷。 
Map<String, String[]> paraMap = new HashMap<String, String[]>();for( Entry<String, String[]> entry : paraMap.entrySet() ){    String appFieldDefId = entry.getKey();    String[] values = entry.getValue();}利用散列值取出相應的Entry做比較得到結果,取得entry的值之后直接取key和 value。 21.array(數組)和ArrayList的使用。 array 數組效率最高,但容量固定,無法動態改變,ArrayList容量可以動態增長,但犧牲了效率。 22.單線程應盡量使用 HashMap, ArrayList,除非必要,否則不推薦使用HashTable,Vector,她們使用了同步機制,而降低了性能。23.StringBuffer,StringBuilder 的區別在于:java.lang.StringBuffer 線程安全的可變字符序列。一個類似于String的字符串緩沖區,但不能修改。StringBuilder與該類相比,通常應該優先使用 StringBuilder類,因為她支持所有相同的操作,但由于她不執行同步,所以速度更快。為了獲得更好的性能,在構造StringBuffer或 StringBuilder時應盡量指定她的容量。當然如果不超過16個字符時就不用了。相同情況下,使用StringBuilder比使用 StringBuffer僅能獲得10%~15%的性能提升,但卻要冒多線程不安全的風險。綜合考慮還是建議使用StringBuffer。24. 盡量使用基本數據類型代替對象。 25.用簡單的數值計算代替復雜的函數計算,比如查表方式解決三角函數問題。 26.使用具體類比使用接口效率高,但結構彈性降低了,但現代IDE都可以解決這個問題。 27.考慮使用靜態方法, 如果你沒有必要去訪問對象的外部,那么就使你的方法成為靜態方法。她會被更快地調用,因為她不需要一個虛擬函數導向表。這同事也是一個很好的實踐,因為她告訴你如何區分方法的性質,調用這個方法不會改變對象的狀態。28.應盡可能避免使用內在的GET,SET方法。 android編程中,虛方法的調用會產生很多代價,比實例屬性查詢的代價還要多。我們應該在外包調用的時候才使用get,set方法,但在內部調用的時候,應該直接調用。29. 避免枚舉,浮點數的使用。 30.二維數組比一維數組占用更多的內存空間,大概是10倍計算。 

31.SQLite數據庫讀取整張表的全部數據很快,但有條件的查詢就要耗時30-50MS,大家做這方面的時候要注意,盡量少用,尤其是嵌套查找!

數值表達式1. 奇偶判斷不要使用 i % 2 == 1 來判斷是否是奇數,因為i為負奇數時不成立,請使用 i % 2 != 0 來判斷是否是奇數,或使用 高效式 (i & 1) != 0來判斷。 2. 小數精確計算

System.out.println(2.00 -1.10);//0.8999999999999999上面的計算出的結果不是 0.9,而是一連串的小數。問題在于1.1這個數字不能被精確表示為一個double,因此它被表 示為最接近它的double值,該程序從2中減去的就是這個值,但這個計算的結果并不是最接近0.9的double值。 一般地說,問題在于并不是所有的小數都可以用二進制浮點數精確表示。 二進制浮點對于貨幣計算是非常不適合的,因為它不可能將1.0表示成10的其他任何負次冪。 解決問題的第一種方式是使用貨幣的最小單位(分)來表示: 
System.out.println(200-110);//90第二種方式是使用BigDecimal,但一定要用BigDecimal(String)構造器,而千萬不要用 BigDecimal(double)來構造(也不能將float或double型轉換成String再來使用BigDecimal(String)來構造,因為在將float或double轉換成String時精度已丟失)。例如new BigDecimal(0.1), 它將返回一個BigDecimal, 也即0.1000000000000000055511151231257827021181583404541015625, 正確使用BigDecimal,程序就可以打印出我們所期 望的結果0.9: 
System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.10")));// 0.9另外,如果要比較兩個浮點數的大小,要使用BigDecimal的compareTo方法。 3. int整數相乘溢出我們計算一天中的微秒數: 
long microsPerDay = 24 * 60 * 60 * 1000 * 1000;// 正確結果應為:86400000000System.out.println(microsPerDay);// 實際上為:500654080  問題在于計算過程中溢出了。這個計算式完全是以int運算來執行的,并且只有在運算完成之后,其結果才被提升為long,而此時已經太遲:計算已經溢出。   解決方法使計算表達式的第一個因子明確為long型,這樣可以強制表達式中所有的后續計算都用long運算來完成,這樣結果就不會溢出: 
long microsPerDay = 24L * 60 * 60 * 1000 * 1000;4. 負的十六進制與八進制字面常量“數字字面常量”的類型都是int型,而不管他們是幾進制,所以“2147483648”、“0x180000000(十六進制,共33位,所以超過了整數的取值范圍)”字面常量是錯誤的,編譯時會報超過int的取值范圍了,所以要確定以long來表示“2147483648L”“0x180000000L”。十進制字面常量只有一個特性,即所有的十進制字面常量都是正數,如果想寫一個負的十進制,則需要在正的十進制 字面常量前加上“-”即可。 十六進制或八進制字面常量可就不一定是正數或負數,是正還是負,則要根據當前情況看:如果十六進制和八進制字 面常量的最高位被設置成了1,那么它們就是負數: 
System.out.println(0x80);//128 //0x81看作是int型,最高位(第32位)為0,所以是正數System.out.println(0x81);//129 System.out.println(0x8001);//32769System.out.println(0x70000001);//1879048193 //字面量0x80000001為int型,最高位(第32位)為1,所以是負數System.out.println(0x80000001);//-2147483647//字面量0x80000001L強制轉為long型,最高位(第64位)為0,所以是正數System.out.println(0x80000001L);//2147483649//最小int型System.out.println(0x80000000);//-2147483648//只要超過32位,就需要在字面常量后加L強轉long,否則編譯時出錯System.out.println(0x8000000000000000L);//-9223372036854775808從上面可以看出,十六進制的字面常量表示的是int型,如果超過32位,則需要在后面加“L”,否則編譯過不過。如果為32,則為負int正數,超過32位,則為long型,但需明確指定為long。
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));// cafebabe結果為什么不是0x1cafebabe?該程序執行的加法是一個混合類型的計算:左操作數是long型,而右操作數是int類型。為了執行該計算,Java將int類型的數值用拓寬原生類型轉換提升為long類型,然后對兩個long類型數值相加。因為int是有符號的整數類型,所以這個轉換執行的是符號擴展。  這個加法的右操作數0xcafebabe為32位,將被提升為long類型的數值0xffffffffcafebabeL,之后這個數值加上了左操 作0x100000000L。當視為int類型時,經過符號擴展之后的右操作數的高32位是-1,而左操作數的第32位是1,兩個數 值相加得到了0:   0x 0xffffffffcafebabeL +0x 0000000100000000L ----------------------------- 0x 00000000cafebabeL 如果要得到正確的結果0x1cafebabe,則需在第二個操作數組后加上“L”明確看作是正的long型即可,此時相加時拓 展符號位就為0: 
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));// 1cafebabe5. 窄數字類型提升至寬類型時使用符號位擴展還是零擴展 
System.out.println((int)(char)(byte)-1);// 65535結果為什么是65535而不是-1? 窄的整型轉換成較寬的整型時符號擴展規則:如果最初的數值類型是有符號的,那么就執行符號擴展(即如果符號位 為1,則擴展為1,如果為零,則擴展為0);如果它是char,那么不管它將要被提升成什么類型,都執行零擴展。 了解上面的規則后,我們再來看看迷題:因為byte是有符號的類型,所以在將byte數值-1(二進制為:11111111)提 升到char時,會發生符號位擴展,又符號位為1,所以就補8個1,最后為16個1;然后從char到int的提升時,由于是 char型提升到其他類型,所以采用零擴展而不是符號擴展,結果int數值就成了65535。 如果將一個char數值c轉型為一個寬度更寬的類型時,只是以零來擴展,但如果清晰表達以零擴展的意圖,則可以考慮 使用一個位掩碼: 
int i = c & 0xffff;//實質上等同于:int i = c ;如果將一個char數值c轉型為一個寬度更寬的整型,并且希望有符號擴展,那么就先將char轉型為一個short,它與 char上個具有同樣的寬度,但是它是有符號的: 
int i = (short)c;如果將一個byte數值b轉型為一個char,并且不希望有符號擴展,那么必須使用一個位掩碼來限制它: 
char c = (char)(b & 0xff);// char c = (char) b;為有符號擴展[size=medium] 6. ((byte)0x90 == 0x90)? [/size] 答案是不等的,盡管外表看起來是成立的,但是它卻等于false。為了比較byte數值(byte)0x90和int數值0x90,Java 通過拓寬原生類型將byte提升為int,然后比較這兩個int數值。因為byte是一個有符號類型,所以這個轉換執行的是 符號擴展,將負的byte數值提升為了在數字上相等的int值(10010000111111111111111111111111 10010000)。在本例中,該轉換將(byte)0x90提升為int數值-112,它不等于int數值的0x90,即+144。解決辦法:使用一個屏蔽碼來消除符號擴展的影響,從而將byte轉型為int。 
((byte)0x90 & 0xff)== 0x907. 三元表達式(?:)
char x = 'X';int i = 0;System.out.println(true ? x : 0);// XSystem.out.println(false ? i : x);// 88條件表達式結果類型的規則: (1) 如果第二個和第三個操作數具有相同的類型,那么它就是條件表達式的類型。 (2) 如果一個操作的類型是T,T表示byte、short或char,而另一個操作數是一個int類型的“字面常量”,并且 它的值可以用類型T表示,那條件表達式的類型就是T。 (3) 否則,將對操作數類型進行提升,而條件表達式的類型就是第二個和第三個操作被提升之后的類型。 現來使用以上規則解上面的迷題,第一個表達式符合第二條規則:一個操作數的類型是char,另一個的類型是字面常 量為0的int型,但0可以表示成char,所以最終返回類型以char類型為準;第二個表達式符合第三條規則:因為i為int 型變量,而x又為char型變量,所以會先將x提升至int型,所以最后的結果類型為int型,但如果將i定義成final時, 則返回結果類型為char,則此時符合第二條規則,因為final類型的變量在編譯時就使用“字面常量0”來替換三元表 達式了: 
final int i = 0;System.out.println(false ? i : x);// X在JDK1.4版本或之前,條件操作符 ?: 中,當第二個和延續三個操作數是引用類型時,條件操作符要求它們其中一個 必須是另一個的子類型,那怕它們有同一個父類也不行: 
public class T { public static void main(String[] args) {  System.out.println(f()); } public static T f() {  // !!1.4不能編譯,但1.5可以  // !!return true?new T1():new T2();  return true ? (T) new T1() : new T2();// T1 }}class T1 extends T { public String toString() {  return "T1"; }}class T2 extends T { public String toString() {  return "T2"; }}在5.0或以上版本中,條件操作符在延續二個和第三個操作數是引用類型時總是合法的。其結果類型是這兩種類型的最 小公共超類。公共超類總是存在的,因為Object是每一個對象類型的超類型,上面的最小公共超類是T,所以能編譯。

 

在JAVA程序中,性能問題的大部分原因并不在于JAVA語言,而是程序本身。養成良好的編碼習慣非常重要,能夠顯著地提升程序性能。 1. 盡量使用final修飾符。 帶有final修飾符的類是不可派生的。在JAVA核心API中,有許多應用final的例子,例如 java.lang.String。為String類指定final防止了使用者覆蓋length()方法。另外,如果一個類是final的,則該類所有方法都是final的。java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高 50%。2.盡量重用對象。 特別是String對象的使用中,出現字符串連接情況時應使用StringBuffer代替,由于系統不僅要花時間生成對象,以后可能還需要花時間對這些對象進行垃圾回收和處理。因此生成過多的對象將會給程序的性能帶來很大的影響。3. 盡量使用局部變量。 調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態變量,實例變量等,都在堆(Heap)中創建,速度較慢。 4.不要重復初始化變量。 默認情況下,調用類的構造函數時,java會把變量初始化成確定的值,所有的對象被設置成null,整數變量設置成0,float和double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵字創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。這里有個注意,給成員變量設置初始值但需要調用其他方法的時候,最好放在一個方法比如initXXX()中,因為直接調用某方法賦值可能會因為類尚未初始化而拋空指針異常,public int state = this.getState();5.在java+Oracle的應用系統開發中,java中內嵌的SQL語言應盡量使用大寫形式,以減少Oracle解析器的解析負擔。6.java編程過程中,進行數據庫連接,I/O流操作,在使用完畢后,及時關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷。7.過分的創建對象會消耗系統的大量內存,嚴重時,會導致內存泄漏,因此,保證過期的對象的及時回收具有重要意義。 JVM的GC并非十分智能,因此建議在對象使用完畢后,手動設置成null。 8.在使用同步機制時,應盡量使用方法同步代替代碼塊同步。 9.盡量減少對變量的重復計算。 比如 for(int i=0;i<list.size();i++)   應修改為 for(int i=0,len=list.size();i<len;i++)  10. 采用在需要的時候才開始創建的策略。 例如: String str="abc";   if(i==1){ list.add(str);}  應修改為: if(i==1){String str="abc"; list.add(str);}  11.慎用異常,異常對性能不利。 拋出異常首先要創建一個新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地方法,fillInStackTrace()方法檢查棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用棧,因為在處理過程中創建了一個新的對象。異常只能用于錯誤處理,不應該用來控制程序流程。 12.不要在循環中使用Try/Catch語句,應把Try/Catch放在循環最外層。 Error是獲取系統錯誤的類,或者說是虛擬機錯誤的類。不是所有的錯誤Exception都能獲取到的,虛擬機報錯 Exception就獲取不到,必須用Error獲取。13.通過StringBuffer的構造函數來設定他的初始化容量,可以明顯提升性能。 StringBuffer的默認容量為16,當StringBuffer的容量達到最大容量時,她會將自身容量增加到當前的2倍+2,也就是2*n+2。無論何時,只要StringBuffer到達她的最大容量,她就不得不創建一個新的對象數組,然后復制舊的對象數組,這會浪費很多時間。所以給StringBuffer設置一個合理的初始化容量值,是很有必要的!14.合理使用java.util.Vector。 Vector 與StringBuffer類似,每次擴展容量時,所有現有元素都要賦值到新的存儲空間中。Vector的默認存儲能力為10個元素,擴容加倍。 vector.add(index,obj) 這個方法可以將元素obj插入到index位置,但index以及之后的元素依次都要向下移動一個位置(將其索引加 1)。 除非必要,否則對性能不利。同樣規則適用于remove(int index)方法,移除此向量中指定位置的元素。將所有后續元素左移(將其索引減 1)。返回此向量中移除的元素。所以刪除vector最后一個元素要比刪除第1個元素開銷低很多。刪除所有元素最好用 removeAllElements()方法。如果要刪除vector里的一個元素可以使用 vector.remove(obj);而不必自己檢索元素位置,再刪除,如int index = indexOf(obj);vector.remove(index);15.當復制大量數據時,使用 System.arraycopy(); 16.代碼重構,增加代碼的可讀性。 17.不用new關鍵字創建對象的實例。 用 new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable接口,我們可以調用她的clone() 方法。clone()方法不會調用任何類構造函數。下面是Factory模式的一個典型實現。 public static Credit getNewCredit()   {       return new Credit();   }  改進后的代碼使用clone() 方法, private static Credit BaseCredit = new Credit();   public static Credit getNewCredit()   {       return (Credit)BaseCredit.clone();   }  18. 乘除法如果可以使用位移,應盡量使用位移,但最好加上注釋,因為位移操作不直觀,難于理解。19.不要將數組聲明為:public static final。 20.HaspMap的遍歷。 Map<String, String[]> paraMap = new HashMap<String, String[]>();   for( Entry<String, String[]> entry : paraMap.entrySet() )   {       String appFieldDefId = entry.getKey();       String[] values = entry.getValue();   }  利用散列值取出相應的Entry做比較得到結果,取得entry的值之后直接取key和 value。 21.array(數組)和ArrayList的使用。 array 數組效率最高,但容量固定,無法動態改變,ArrayList容量可以動態增長,但犧牲了效率。 22.單線程應盡量使用 HashMap, ArrayList,除非必要,否則不推薦使用HashTable,Vector,她們使用了同步機制,而降低了性能。23.StringBuffer,StringBuilder 的區別在于:java.lang.StringBuffer 線程安全的可變字符序列。一個類似于String的字符串緩沖區,但不能修改。StringBuilder與該類相比,通常應該優先使用 StringBuilder類,因為她支持所有相同的操作,但由于她不執行同步,所以速度更快。為了獲得更好的性能,在構造StringBuffer或 StringBuilder時應盡量指定她的容量。當然如果不超過16個字符時就不用了。相同情況下,使用StringBuilder比使用 StringBuffer僅能獲得10%~15%的性能提升,但卻要冒多線程不安全的風險。綜合考慮還是建議使用StringBuffer。24. 盡量使用基本數據類型代替對象。 25.用簡單的數值計算代替復雜的函數計算,比如查表方式解決三角函數問題。 26.使用具體類比使用接口效率高,但結構彈性降低了,但現代IDE都可以解決這個問題。 27.考慮使用靜態方法, 如果你沒有必要去訪問對象的外部,那么就使你的方法成為靜態方法。她會被更快地調用,因為她不需要一個虛擬函數導向表。這同事也是一個很好的實踐,因為她告訴你如何區分方法的性質,調用這個方法不會改變對象的狀態。28.應盡可能避免使用內在的GET,SET方法。 android編程中,虛方法的調用會產生很多代價,比實例屬性查詢的代價還要多。我們應該在外包調用的時候才使用get,set方法,但在內部調用的時候,應該直接調用。29. 避免枚舉,浮點數的使用。 30.二維數組比一維數組占用更多的內存空間,大概是10倍計算。 31.SQLite數據庫讀取整張表的全部數據很快,但有條件的查詢就要耗時30-50MS,大家做這方面的時候要注意,盡量少用,尤其是嵌套查找!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品无人区乱码1区2区3区在线| 亚洲人成77777在线观看网| 中文字幕在线亚洲| 国产成人精品久久亚洲高清不卡| 亚洲精品日韩激情在线电影| 国产精品亚洲视频在线观看| 欧美日韩中文在线观看| 亚洲国产精品va在线看黑人动漫| 欧美大片在线看| 26uuu久久噜噜噜噜| 在线日韩欧美视频| 国产欧美日韩精品在线观看| 91理论片午午论夜理片久久| 久久91精品国产| 亚洲福利影片在线| 日韩av影片在线观看| 亚洲一区二区三区在线免费观看| 97香蕉超级碰碰久久免费软件| 欧美成年人视频网站| 国产性猛交xxxx免费看久久| 国产欧美va欧美va香蕉在线| 欧美乱大交做爰xxxⅹ性3| 成人淫片在线看| 91久久久久久久久| 亚洲精品短视频| 久久艳片www.17c.com| 久久九九热免费视频| 国产精品美乳在线观看| 国产精品视频网站| 色综合天天综合网国产成人网| 国产视频在线观看一区二区| 欧美黄网免费在线观看| 国产午夜精品视频免费不卡69堂| 久久久久国产视频| 欧美色xxxx| 国产精品久久久久久久久久东京| 欧美午夜激情在线| 日本一区二区三区四区视频| 日韩成人黄色av| 亚洲欧美一区二区三区久久| 欧美精品一区二区三区国产精品| 国产一区二区三区丝袜| 在线电影欧美日韩一区二区私密| 91成人在线播放| 午夜精品一区二区三区在线视| 久久久久久久国产| 91日本在线视频| 亚洲国产另类久久精品| 中文字幕亚洲一区在线观看| 欧美专区在线视频| 亚洲国产精品大全| 国产精品欧美日韩久久| 欧美电影在线观看| 日韩网站免费观看高清| 国产一区二区动漫| 国产精品看片资源| 色先锋久久影院av| 97碰碰碰免费色视频| 久久精品免费播放| 日韩精品在线看| 日韩激情av在线免费观看| 91精品国产沙发| 欧美大片免费观看在线观看网站推荐| 国产精品丝袜视频| 日韩在线观看免费高清| 国产亚洲人成网站在线观看| 日韩精品视频在线观看免费| 亚洲欧美一区二区精品久久久| 国产精品亚洲аv天堂网| 日韩欧美极品在线观看| 亚洲热线99精品视频| 精品国产区一区二区三区在线观看| 久久久噜噜噜久久中文字免| 精品动漫一区二区三区| 亚洲成人1234| 日韩亚洲欧美中文在线| 在线播放国产一区中文字幕剧情欧美| 九九热精品视频国产| 亚洲国产欧美一区二区丝袜黑人| 美日韩在线视频| 国产男人精品视频| 精品毛片三在线观看| 国产精品主播视频| 亚洲高清不卡av| 久久久久久亚洲精品中文字幕| 色噜噜久久综合伊人一本| 午夜精品久久久久久99热| 亚洲一区二区三区四区在线播放| 人九九综合九九宗合| 最近2019免费中文字幕视频三| 深夜福利91大全| 亚洲性线免费观看视频成熟| 91免费版网站入口| 国产精品xxx视频| 欧美日韩中文字幕在线| 性欧美长视频免费观看不卡| 欧美精品激情在线观看| 欧美精品videofree1080p| 成人黄色在线观看| 亚洲乱码一区av黑人高潮| 亚洲成人久久一区| 亚洲精品第一页| 日韩av免费在线看| 91av国产在线| 最近2019免费中文字幕视频三| 亚洲人成网7777777国产| 日韩电影大片中文字幕| 亚洲欧洲日韩国产| 欧美最猛性xxxxx亚洲精品| 国产亚洲精品91在线| 欧美大片免费看| 亚洲偷欧美偷国内偷| 欧美日韩国产麻豆| 日本一区二三区好的精华液| 91高潮在线观看| 国产精品中文久久久久久久| 欧美日韩一区免费| 国产精品久久久久久久午夜| 成人免费网站在线观看| 久久久久久久亚洲精品| 4388成人网| 美女视频黄免费的亚洲男人天堂| 欧美一级在线播放| 日韩av综合中文字幕| 亚洲精品国精品久久99热| 国产日韩欧美另类| 最新国产成人av网站网址麻豆| 亚洲欧美在线看| 尤物tv国产一区| 色噜噜狠狠狠综合曰曰曰88av| 欧美一级淫片aaaaaaa视频| 亚洲自拍偷拍第一页| 亚洲欧美另类在线观看| 97在线视频免费| 久久99国产精品久久久久久久久| 国产精品一区二区久久久| 国内精品久久久久影院 日本资源| 黄网动漫久久久| 国产一区二区日韩| 欧美丰满少妇xxxxx| 国内揄拍国内精品少妇国语| 亚洲国产婷婷香蕉久久久久久| 成人深夜直播免费观看| 国产视频精品在线| 亚洲最大激情中文字幕| 狠狠躁夜夜躁人人爽天天天天97| 久久精品国产91精品亚洲| 一区二区欧美在线| yellow中文字幕久久| 亚洲乱码一区av黑人高潮| 亚洲欧美日韩在线高清直播| 欧美一级淫片播放口| 福利视频导航一区| 亚洲色图50p| 日韩福利在线播放| 成人97在线观看视频| 国产伦精品免费视频| 欧美黑人巨大精品一区二区| 97国产精品久久| 午夜剧场成人观在线视频免费观看| 日韩成人在线网站| 国产成人免费av| 亚洲japanese制服美女| 51久久精品夜色国产麻豆|