国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

大三Java后端暑期實習面經(jīng)總結(jié)

共 30533字,需瀏覽 62分鐘

 ·

2021-05-28 10:58

點擊上方藍色字體,選擇“標星公眾號”

優(yōu)質(zhì)文章,第一時間送達

  作者 |  Baret-H

來源 |  urlify.cn/6RVNRr

1. JDK、JRE、JVM的區(qū)別和聯(lián)系


JDK(java程序開發(fā)包)=JRE +Tools

JRE=JVM(虛擬機)+API


2. 采用字節(jié)碼的好處

Java中引入了jvm,即在機器和編譯程序之間加了一層抽象的虛擬機器,這臺機器在任何平臺上都提供給編譯程序一個共同的接口。

  • 編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然后由解釋器來將虛擬機代碼轉(zhuǎn)換為特定系統(tǒng)的機器碼來執(zhí)行。在Java中,這種供虛擬機理解的代碼叫做字節(jié)碼(.class),它不面向任何特定的處理器,只面向虛擬機

  • 每一種平臺的解釋器是不同的,但是實現(xiàn)的虛擬機是相同的。Java源程序通過編譯器進行編譯后轉(zhuǎn)換為字節(jié)碼,字節(jié)碼在虛擬機上執(zhí)行,虛擬機將每一條要執(zhí)行的字節(jié)碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然后在特定的機器上運行。這也解釋了Java的編譯與解釋共存的特點。

Java源代碼-->編譯器-->jvm可執(zhí)行的java字節(jié)碼-->jvm中解釋器-->機器可執(zhí)行的二進制機器碼-->程序運行

Java語言采用字節(jié)碼的方式,一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低(運行需要解釋環(huán)境,速度比編譯的要慢,占用資源也要多一些)的問題,同時又保留了解釋型語言可移植的特點,所以Java程序運行時很高效,此外,由于字節(jié)碼不針對一種特定的機器,因此Java源程序無需重新編譯即可在不同的計算機上運行,實現(xiàn)一次編譯,多次運行


3. 接口和抽象類的區(qū)別

1?? 從語法上來說

  • 抽象類可以存在普通成員函數(shù),而接口中只能存在public abstract方法。

  • 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的。

  • 抽象類只能繼承一個,接口可以實現(xiàn)多個

2?? 從設(shè)計目的來說

  • 接口是用來對

    類的形為進行約束

    。也就是提供了一種機制,可以強制要求所有的類具有相同的形為,只約束了行為的有無,不限制形為的具體實現(xiàn)

  • 抽象類是為了

    代碼復用

    。當不同的類具有相同的行為A,且其中一部分形為B的實現(xiàn)方式一致時,可以讓這些類都派生于一個抽象類,這個抽象類中實現(xiàn)了B,避免讓所有的子類來實現(xiàn)B,以此來達到代碼復用的目的。而A-B的部分,交給各個子類自己實現(xiàn),正是由于這里A-B的行為沒有實現(xiàn),所以抽象類不允許實例化

3?? 從本質(zhì)上來說

  • 接口是

    對行為的抽象

    ,表達的是like a的關(guān)系,比如 Bird like a Aircraft(鳥像飛行器一樣可以飛);接口的核心是定義行為,即接口的實現(xiàn)類可以做什么,至于實現(xiàn)類如何實現(xiàn),主體是誰,接口并不關(guān)心

  • 抽象類是 

    對類本質(zhì)的抽象

    ,表達的是is a的關(guān)系,比如 BaoMa is a Car(寶馬是一輛車);抽象類包含并實現(xiàn)子類的通用特性,將子類存在差異化的特性進行抽象,交給子類去實現(xiàn)

總結(jié)

  • 當你關(guān)注一個事物的本質(zhì)的時候,用抽象類;當你關(guān)注一個操作的時候,用接口。

  • 抽象類的功能要遠超過接口,但是,定義抽象類的代價高。因為高級語言來說(從實際設(shè)計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然接口在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現(xiàn)多個接口。在設(shè)計階段會降低難度


4. 面向?qū)ο蟮乃拇筇匦?/span>

1?? 抽象

將一類對象的共同特征總結(jié)出來構(gòu)造類的過程

2?? 封裝

將過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過特定的接口(例如私有變量的get/set方法)

3?? 繼承

從現(xiàn)有類派生出新類的過程

4?? 多態(tài)

  • 編譯時多態(tài):同一方法可根據(jù)對象的不同產(chǎn)生不同的效果,也就是 方法的重載

  • 運行時多態(tài):父類的引用指向子類對象,一個對象的實際類型確定,但是指向其的引用類型可以有很多


5. 面向?qū)ο蠛兔嫦蜻^程

面向過程(Procedure Oriented)和面向?qū)ο?Object Oriented,OO)都是對軟件分析、設(shè)計和開發(fā)的一種思想,它指導著人們以不同的方式去分析、設(shè)計和開發(fā)軟件。早期先有面向過程思想,隨著軟件規(guī)模的擴大,問題復雜性的提高,面向過程的弊端越來越明顯的顯示出來,出現(xiàn)了面向?qū)ο笏枷氩⒊蔀槟壳爸髁鞯姆绞?。兩者都貫穿于軟件分析、設(shè)計和開發(fā)各個階段,對應(yīng)面向?qū)ο缶头謩e稱為面向?qū)ο蠓治?OOA)、面向?qū)ο笤O(shè)計(OOD)和面向?qū)ο缶幊?OOP)。C語言是一種典型的面向過程語言,Java是一種典型的面向?qū)ο笳Z言。

面向?qū)ο蠛兔嫦蜻^程是兩種不同的處理問題角度

  • 面向過程注重事情的每一步以及順序

  • 面向過程諸眾事情有哪些參與者(對象),以及各自需要做什么

比如:洗衣機洗衣服

  • 面向過程會將任務(wù)拆解成一系列的步驟(函數(shù)):

    1、打開洗衣機–>2、放衣服–>3、放洗衣粉–>4、清洗–>5、烘干

  • 面向?qū)ο髸鸪鋈撕拖匆聶C兩個對象:

    人:打開洗衣機放衣服放洗衣粉

    洗衣機:清洗烘干

由此可見,面向過程比較直接高效,而面向?qū)ο蟾子趶陀?、擴展和維護

面向?qū)ο蠛兔嫦蜻^程的總結(jié)

  1. 都是解決問題的思維方式,都是代碼組織的方式。

  2. 解決簡單問題可以使用面向過程

  3. 解決復雜問題:宏觀上使用面向?qū)ο蟀盐眨⒂^處理上仍然是面向過程。

  4. 面向?qū)ο缶哂腥筇卣鳎悍庋b性、繼承性和多態(tài)性,而面向過程沒有繼承性和多態(tài)性,并且面向過程的封裝只是封裝功能,而面向?qū)ο罂梢苑庋b數(shù)據(jù)和功能。所以面向?qū)ο髢?yōu)勢更明顯


6. 靜態(tài)綁定&動態(tài)綁定

在Java方法調(diào)用的過程中,JVM是如何知道調(diào)用的是哪個類的方法源代碼呢?這就涉及到程序綁定,程序綁定指的是一個方法的調(diào)用與方法所在的類(方法主體)關(guān)聯(lián)起來。

對Java來說,綁定分為靜態(tài)綁定動態(tài)綁定,或者叫做前期綁定和后期綁定。

1?? 靜態(tài)綁定

針對Java,可以簡單地理解為程序編譯期的綁定。

這里特別說明一點,Java當中的方法只有final,static,private構(gòu)造方法是靜態(tài)綁定。

# 關(guān)于final,static,private和構(gòu)造方法是前期綁定的理解:
 對于private的方法,首先一點它不能被繼承,既然不能被繼承那么就沒辦法通過它子類的對象來調(diào)用,而只能通過這個類自身的對象來調(diào)用。因此就可以說private方法和定義這個方法的類綁定在了一起。
 final方法雖然可以被繼承,但不能被重寫(覆蓋),雖然子類對象可以調(diào)用,但是調(diào)用的都是父類中所定義的那個final方法,(由此我們可以知道將方法聲明為final類型,一是為了防止方法被覆蓋,二是為了有效地關(guān)閉java中的動態(tài)綁定)。
 構(gòu)造方法也是不能被繼承的(網(wǎng)上也有說子類無條件地繼承父類的無參數(shù)構(gòu)造函數(shù)作為自己的構(gòu)造函數(shù),不過個人認為這個說法不太恰當,因為我們知道子類是通過super()來調(diào)用父類的無參構(gòu)造方法,來完成對父類的初始化, 而我們使用從父類繼承過來的方法是不用這樣做的,因此不應(yīng)該說子類繼承了父類的構(gòu)造方法),因此編譯時也可以知道這個構(gòu)造方法到底是屬于哪個類。
 對于static方法,具體的原理我也說不太清。不過根據(jù)網(wǎng)上的資料和我自己做的實驗可以得出結(jié)論:static方法可以被子類繼承,但是不能被子類重寫(覆蓋),但是可以被子類隱藏。(這里意思是說如果父類里有一個static方法,它的子類里如果沒有對應(yīng)的方法,那么當子類對象調(diào)用這個方法時就會使用父類中的方法。而如果子類中定義了相同的方法,則會調(diào)用子類的中定義的方法。唯一的不同就是,當子類對象上轉(zhuǎn)型為父類對象時,不論子類中有沒有定義這個靜態(tài)方法,該對象都會使用父類中的靜態(tài)方法。因此這里說靜態(tài)方法可以被隱藏而不能被覆蓋。這與子類隱藏父類中的成員變量是一樣的。隱藏和覆蓋的區(qū)別在于,子類對象轉(zhuǎn)換成父類對象后,能夠訪問父類被隱藏的變量和方法,而不能訪問父類被覆蓋的方法)
 由上面我們可以得出結(jié)論,如果一個方法不可被繼承或者繼承后不可被覆蓋,那么這個方法就采用的靜態(tài)綁定。

2?? 動態(tài)綁定

在運行時根據(jù)具體對象的類型進行綁定。也就是說,編譯器此時依然不知道對象的類型,但方法調(diào)用機制能自己去調(diào)查,找到正確的方法主體

動態(tài)綁定的過程

  1. 虛擬機提取對象的實際類型的方法表;

  2. 虛擬機搜索方法簽名

  3. 調(diào)用方法


7. 重載和重寫

重寫:發(fā)生在父子類中,方法名、參數(shù)列表必須相同;子類的返回值范圍小于等于父類,拋出異常范圍小于等于父類,訪問修飾符范圍大于等于父類;如果父類方法訪問修飾符為private則子類不能重寫該方法。

重載:發(fā)生在同一個類中,參數(shù)類型不同、個數(shù)不同、順序不同都可以構(gòu)成重載;

  • 重載方法的返回值可以不同,但是不能僅僅返回值不同,否則編譯時報錯


  • 重載方法的訪問控制符也可以不同,但是不能僅僅訪問控制符不同,否則編譯時報錯



8. Java異常體系

Java中的所有異常都來自頂級父類Throwable,Throwable有兩個子類ExceptionError

  • Error是程序無法處理的錯誤,一旦出現(xiàn)錯誤,則程序?qū)⒈黄韧V惯\行

  • Exception不會導致程序停止,又分為RunTimeExceptionCheckedException

  • //除0錯誤:ArithmeticException
    //錯誤的強制類型轉(zhuǎn)換錯誤:ClassCastException
    //數(shù)組索引越界:ArrayIndexOutOfBoundsException
    //使用了空對象:NullPointerException

  • CheckedException常常發(fā)生在程序編譯過程中,會導致程序編譯不通過

          例如:打開不存在的文件

9. final關(guān)鍵字

1.作用

  • 修飾類:表示類不可被繼承

  • 修飾方法:表示方法不可被子類覆蓋,但是可以重載

  • 修飾變量:表示變量一旦被賦值就不可以更改它的值

2.修飾不同變量的區(qū)別

1?? 修飾成員變量

  • 如果final修飾的是類變量,只能在靜態(tài)初始化塊中指定初始值或者聲明該類變量時指定初始值。

  • 如果final修飾的是成員變量,可以在非靜態(tài)初始化塊、聲明該變量或者構(gòu)造器中執(zhí)行初始值。

2?? 修飾局部變量

系統(tǒng)不會為局部變量進行初始化,局部變量必須由程序員顯示初始化。因此使用final修飾局部變量時,即可以在定義時指定默認值(后面的代碼不能對變量再賦值),也可以不指定默認值,而在后面的代碼中對final變量賦初值(僅一次)

3?? 修飾基本數(shù)據(jù)類型和引用類型數(shù)據(jù)

  • 如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改

  • 如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。但是引用的值可變。

2.為什么局部內(nèi)部類和匿名內(nèi)部類只能訪問局部final變量

局部內(nèi)部類或匿名內(nèi)部類編譯之后會產(chǎn)生兩個class文件:Test.classTest$1.class,一個是類class,一個是內(nèi)部類class

局部內(nèi)部類:

首先需要知道的一點是:內(nèi)部類和外部類是處于同一個級別的,內(nèi)部類不會因為定義在方法中就會隨著方法的執(zhí)行完畢就被銷毀。

這里就會產(chǎn)生問題:當外部類的方法結(jié)束時,局部變量就會被銷毀了,但是內(nèi)部類對象可能還存在(只有沒有人再引用它時,才會死亡),這里就出現(xiàn)了一個矛盾:內(nèi)部類對象訪問了一個不存在的變量。為了解決這個問題,就將局部變量復制了一份作為內(nèi)部類的成員變量,這樣當局部變量死亡后,內(nèi)部類仍可以訪問它,實際訪問的是局部變量的"copy".這樣就好像延長了局部變量的生命周期

將局部變量復制為內(nèi)部類的成員變量時,必須保證這兩個變量是一樣的,也就是如果我們在內(nèi)部類中修改了成員變量,方法中的局部變量也得跟著改變,怎么解決問題呢?

就將局部變量設(shè)置為final,對它初始化后,我就不讓你再去修改這個變量,就保證了內(nèi)部類的成員變量和方法的局部變量的一致性。這實際上也是一種妥協(xié)。使得局部變量與內(nèi)部類內(nèi)建立的拷貝保持一致。


10. String、StringBuilder、StringBuffer

  • String底層是final修飾的char[]數(shù)組,不可變,每次操作都會產(chǎn)生新的String對象

  • StringBuffer和StringBuilder都是在原對象上操作

  • StringBuffer線程安全(所有方法都用synchronized修飾),StringBuilder線程不安全

性能:StringBuilder>StringBuffer>String

使用場景:經(jīng)常需要改變字符串內(nèi)容時使用后面兩個,優(yōu)先使用 StringBuilder,多線程使用共享變量時使用 StringBuffer


11. 單例模式

徹底玩轉(zhuǎn)單例模式


12. 工廠模式和建造者模式的區(qū)別

  • 工廠模式一般都是創(chuàng)建一個產(chǎn)品,注重的是把這個產(chǎn)品創(chuàng)建出來,而不關(guān)心這個產(chǎn)品的組成部分。從代碼上看,工廠模式就是一個方法,用這個方法來生產(chǎn)出產(chǎn)品

  • 建造者模式也是創(chuàng)建一個產(chǎn)品,但是不僅要把這個產(chǎn)品創(chuàng)建出來,還要關(guān)心這個產(chǎn)品的組成細節(jié),組成過程。從代碼上看,建造者模式在創(chuàng)建產(chǎn)品的時候,這個產(chǎn)品有很多方法,建造者模式會根據(jù)這些相同的方法按不同的執(zhí)行順序建造出不同組成細節(jié)的產(chǎn)品


13. 深拷貝和淺拷貝

  • 淺拷貝:復制對象時只復制對象本身,包括基本數(shù)據(jù)類型的屬性,但是不會復制引用數(shù)據(jù)類型屬性指向的對象,即拷貝對象的與原對象的引用數(shù)據(jù)類型的屬性指向同一個對象

    淺拷貝沒有達到完全復制,即原對象與克隆對象之間有關(guān)系,會相互影響

  • 深拷貝:復制一個新的對象,引用數(shù)據(jù)類型指向?qū)ο髸截愋碌囊环?,不再指向原有引用對象的地?/span>

    深拷貝達到了完全復制的目的,即原對象與克隆對象之間不會相互影響


14. 泛型知識

Java泛型深度解析以及面試題_周將的博客-CSDN博客

Java泛型是在JDK5引入的新特性,它提供了編譯時類型安全檢測機制。該機制允許程序員在編譯時檢測到非法的類型,泛型的本質(zhì)是參數(shù)類型。

1?? 使用泛型的好處

  1. 泛型可以增強編譯時錯誤檢測,減少因類型問題引發(fā)的運行時異常。

  2. 泛型可以避免類型轉(zhuǎn)換。

  3. 泛型可以泛型算法,增加代碼復用性。

2?? Java中泛型的分類

  1. 泛型類:它的定義格式是class name<T1, T2, ..., Tn>,如下, 返回一個對象中包含了code和一個data, data是一個對象,我們不能固定它是什么類型,這時候就用T泛型來代替,大大增加了代碼的復用性。



  2. public class Result<T> {
        private T data;
        private int code;

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }
    }

  3. 泛型接口:和泛型類使用相似

  4. 泛型方法:它的定義是[public] [static] <T> 返回值類型 方法名(T 參數(shù)列表),只有在前面加<T>這種的才能算是泛型方法,比如上面的setData方法雖然有泛型,但是不能算泛型方法

3?? 常見的泛型參數(shù)

  • K 鍵

  • V 值

  • N 數(shù)字

  • T 類型

  • E 元素

  • S, U, V 等,泛型聲明的多個類型

4?? 鉆石運算符Diamond

鉆石操作符是在 java 7 中引入的,可以讓代碼更易讀,但它不能用于匿名的內(nèi)部類。在 java 9 中, 它可以與匿名的內(nèi)部類一起使用,從而提高代碼的可讀性。

  • JDK7以下版本需要 Box<Integer> box = new Box<Integer>();

  • JDK7及以上版本 Box<Integer> integerBox1 = new Box<>();

5?? 受限類型參數(shù)

  • 它的作用是對泛型變量的范圍作出限制,格式:

    單一限制:<U extends Number>

    多種限制:<U extends A & B & C>

  • 多種限制的時候,類必須寫在第一個

6?? 通配符

通配符用?標識,分為受限制的通配符和不受限制的通配符,它使代碼更加靈活,廣泛運用于框架中。

比如List<Number>List<Integer>是沒有任何關(guān)系的。如果我們將print方法中參數(shù)列表部分的List聲明為List<Number> list, 那么編譯是不會通過的,但是如果我們將List定義為List<? extends Number> list或者List<?> list,那么在編譯的時候就不會報錯了

  • 受限制的通配符:語法為<? extends XXX>,它可以擴大兼容的范圍(XXX以及它的子類)

    比如上面例子中print中如果改為List<Number>,雖然它能存儲Integer和Double等類型的元素,但是作為參數(shù)傳遞的時候,它只能接受List<Number>這一種類型。如果聲明為List<? extends Number> list就不一樣了,相當于擴大了類型的范圍,使得代碼更加的靈活,代碼復用性更高。

    <? super T>和extends一樣,只不過extends是限定了上限,而super是限定了下限

  • 非受限制的通配符:不適用關(guān)鍵字extends或者super。比如上面print參數(shù)列表聲明為List<?> list也可以解決問題。?代表了未知類型。所以所有的類型都可以理解為List<?>的子類。它的使用場景一般是泛型類中的方法不依賴于類型參數(shù)的時候,比如list.size(), 遍歷集合等,這樣的話并不關(guān)心List中元素的具體類型。

7?? 泛型中的PECS原則

PECS原則的全拼是"Producer Extends Consumer Super"。

  • 當需要

    頻繁取值,而不需要寫值

    則使用上界通配符? extends T作為數(shù)據(jù)結(jié)構(gòu)泛型。=

  • 相反,當需要

    頻繁寫值,而不需要取值

    則使用下屆通配符? super T作為數(shù)據(jù)結(jié)構(gòu)泛型。

案例分析:創(chuàng)建Apple,F(xiàn)ruit兩個類,其中Apple是Fruit的子類

public class PECS {

    ArrayList<? extends Fruit> exdentFurit;
    ArrayList<? super Fruit> superFurit;
    Apple apple = new Apple();

    private void test() {
        Fruit a1 = exdentFurit.get(0);
        Fruit a2 = superFurit.get(0); //Err1

        exdentFurit.add(apple); //Err2
        superFurit.add(apple);
    }
}


其中Err1和Err2行處報錯,因為這些操作并不符合PECS原則,逐一分析:

  • Err1
    使用
    ? super T規(guī)定泛型的數(shù)據(jù)結(jié)構(gòu),其存儲的值是T的父類,而這里superFruit.get()的對象為Fruit的父類對象,而指向該對象的引用類型為Fruit,父類缺少子類中的一些信息,這顯然是不對的,因此編譯器直接禁止在使用? super T泛型的數(shù)據(jù)結(jié)構(gòu)中進行取值,只能進行寫值,正是開頭所說的CS原則。

  • Err2
    使用
    ? extends T規(guī)定泛型的數(shù)據(jù)結(jié)構(gòu),其存儲的值是T的子類,這里exdentFruit.add()也就是向其中添加Fruit的子類對象,而Fruit可以有多種子類對象,因此當我們進行寫值時,我們并不知道其中存儲的到底是哪個子類,因此寫值操作必然會出現(xiàn)問題,所以編譯器接禁止在使用? extends T泛型的數(shù)據(jù)結(jié)構(gòu)中進行寫,只能進行取值,正是開頭所說的PE原則。

8?? 類型擦除

  • 類型擦除作用:因為Java中的泛型實在JDK1.5之后新加的特性,為了兼容性,在虛擬機中運行時是不存在泛型的,所以Java泛型是一種偽泛型,類型擦除就保證了泛型不在運行時候出現(xiàn)。

  • 場景:編譯器會把泛型類型中所有的類型參數(shù)替換為它們的上(下)限,如果沒有對類型參數(shù)做出限制,那么就替換為Object類型。因此,編譯出的字節(jié)碼僅僅包含了常規(guī)類,接口和方法。

    • 在必要時插入類型轉(zhuǎn)換以保持類型安全。

    • 生成橋方法以在擴展泛型時保持多態(tài)性

  • Bridge Methods 橋方法
    當編譯一個擴展參數(shù)化類的類,或一個實現(xiàn)了參數(shù)化接口的接口時,編譯器有可能因此要創(chuàng)建一個合成方法,名為橋方法。它是類型擦除過程中的一部分。下面對橋方法代碼驗證一下:


  • public class Node<T> {
        T t;
        public Node(T t) {
            this.t = t;
        }
        public void set(T t) {
            this.t = t;
        }
    }

    class MyNode extends Node<String> {
        public MyNode(String s) {
            super(s);
        }
        @Override
        public void set(String s) {
            super.set(s);


  • 上面Node<T>是一個泛型類型,沒有聲明上下限,所以在類型擦除后會變?yōu)镺bject類型。而MyNode類已經(jīng)聲明了實際類型參數(shù)為String類型,這樣在調(diào)用父類set方法的時候就會出現(xiàn)不匹配的情況,所以虛擬機在編譯的時候為我們生成了一個橋方法,我們通過javap -c MyNode.class查看字節(jié)碼文件,看到確實為我們生成了一個橋方法


15. Java泛型的原理?什么是泛型擦除機制?

  • Java的泛型是JDK5新引入的特性,為了向下兼容,虛擬機其實是不支持泛型,所以Java實現(xiàn)的是一種偽泛型機制,也就是說Java在編譯期擦除了所有的泛型信息,這樣Java就不需要產(chǎn)生新的類型到字節(jié)碼,所有的泛型類型最終都是一種原始類型,在Java運行時根本就不存在泛型信息。

  • 類型擦除其實在類常量池中保存了泛型信息,運行時還能拿到信息,比如Gson的TypeToken的使用。

  • 泛型算法實現(xiàn)的關(guān)鍵:利用受限類型參數(shù)。


16. Java編譯器具體是如何擦除泛型的

  1. 檢查泛型類型,獲取目標類型

  2. 擦除類型變量,并替換為限定類型

    • 如果泛型類型的類型變量沒有限定,則用Object作為原始類型

    • 如果有限定,則用限定的類型作為原始類型

    • 如果有多個限定(T extends Class1&Class2),則使用第一個邊界Class1作為原始類

  3. 在必要時插入類型轉(zhuǎn)換以保持類型安全

  4. 生成橋方法以在擴展時保持多態(tài)性


17. Array數(shù)組中可以用泛型嗎?

不能,簡單的來講是因為如果可以創(chuàng)建泛型數(shù)組,泛型擦除會導致編譯能通過,但是運行時會出現(xiàn)異常。所以如果禁止創(chuàng)建泛型數(shù)組,就可以避免此類問題。


18. PESC原則&限定通配符和非限定通配符

  • 如果你只需要從集合中獲得類型T , 使用<? extends T>通配符

  • 如果你只需要將類型T放到集合中, 使用<? super T>通配符

  • 如果你既要獲取又要放置元素,則不使用任何通配符。例如List<String>

  • <?> 非限定通配符既不能存也不能取, 一般使用非限定通配符只有一個目的,就是為了靈活的轉(zhuǎn)型。其實List<?> 等于 List<? extends Object>。


19. Java中List<?>和List<Object>的區(qū)別

雖然他們都會進行類型檢查,實質(zhì)上卻完全不同。List<?> 是一個未知類型的List,而List<Object>其實是任意類型的List。你可以把List<String>, List<Integer>賦值給List<?>,卻不能把List<String>賦值給List<Object>。


20. for循環(huán)和forEach效率問題

== 遍歷ArrayList測試==

這里向ArrayList中插入10000000條數(shù)據(jù),分別用for循環(huán)和for each循環(huán)進行遍歷測試

package for循環(huán)效率問題;

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            arrayList.add(i);
        }
        int x = 0;
        //for循環(huán)遍歷        
        long forStart = System.currentTimeMillis();
        for (int i = 0; i < arrayList.size(); i++) {
            x = arrayList.get(i);
        }
        long forEnd = System.currentTimeMillis();
        System.out.println("for循環(huán)耗時" + (forEnd - forStart) + "ms");
        //for-each遍歷        
        long forEachStart = System.currentTimeMillis();
        for (int i : arrayList) {
            x = i;
        }
        long forEachEnd = System.currentTimeMillis();
        System.out.println("foreach耗時" + (forEachEnd - forEachStart) + "ms");
    }
}


根據(jù)執(zhí)行結(jié)果,可以看到for循環(huán)速度更快一點,但是差別不太大

我們反編譯class文件看看

package for循環(huán)效率問題;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
    public Test() {    
    }    
    
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList();
        int x;        
        for(x = 0; x < 10000000; ++x) {            
            arrayList.add(x);        
        }        
        int x = false;        
        long forStart = System.currentTimeMillis();        
        for(int i = 0; i < arrayList.size(); ++i) {            
            x = (Integer)arrayList.get(i);        
        }        
        long forEnd = System.currentTimeMillis();        
        System.out.println("for循環(huán)耗時" + (forEnd - forStart) + "ms");        
        long forEachStart = System.currentTimeMillis();        
        int i;        
        for(Iterator var9 = arrayList.iterator(); 
            var9.hasNext(); 
            i = (Integer)var9.next()) {        
        }        
        long forEachEnd = System.currentTimeMillis();        
        System.out.println("foreach耗時" + (forEachEnd - forEachStart) + "ms");    
    }
}


可以看到增強for循環(huán)本質(zhì)上就是使用iterator迭代器進行遍歷

== 遍歷LinkedList測試==

這里向LinkedList中插入測試10000條數(shù)據(jù)進行遍歷測試,實驗中發(fā)現(xiàn)如果循環(huán)次數(shù)太大,for循環(huán)直接卡死;

package for循環(huán)效率問題;

import java.util.LinkedList;

public class Test2 {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        for (int i = 0; i < 10000; i++) {
            linkedList.add(i);
        }
        int x = 0;
        //for循環(huán)遍歷 
        long forStart = System.currentTimeMillis();
        for (int i = 0; i < linkedList.size(); i++) {
            x = linkedList.get(i);
        }
        long forEnd = System.currentTimeMillis();
        System.out.println("for循環(huán)耗時" + (forEnd - forStart) + "ms");
        //for-each遍歷
        long forEachStart = System.currentTimeMillis();
        for (int i : linkedList) {
            x = i;
        }
        long forEachEnd = System.currentTimeMillis();
        System.out.println("foreach耗時" + (forEachEnd - forEachStart) + "ms");
    }
}


根據(jù)結(jié)果可以看到,遍歷LinkedList時for each速度遠遠大于for循環(huán)速度

反編譯class文件的源碼

 Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//
package for循環(huán)效率問題;

import java.util.Iterator;
import java.util.LinkedList;

public class Test2 {
    public Test2() {
    }

    public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList();
        int x;
        for (x = 0; x < 10000; ++x) {
            linkedList.add(x);
        }
        int x = false;
        long forStart = System.currentTimeMillis();
        for (int i = 0; i < linkedList.size(); ++i) {
            x = (Integer) linkedList.get(i);
        }
        long forEnd = System.currentTimeMillis();
        System.out.println("for循環(huán)耗時" + (forEnd - forStart) + "ms");
        long forEachStart = System.currentTimeMillis();
        int i;
        for (Iterator var9 = linkedList.iterator(); var9.hasNext(); i = (Integer) var9.next()) {
        }
        long forEachEnd = System.currentTimeMillis();
        System.out.println("foreach耗時" + (forEachEnd - forEachStart) + "ms");
    }
}


== 總結(jié) ==

1?? 區(qū)別

  • for 循環(huán)就是按順序遍歷,隨機訪問元素

  • for each循環(huán)本質(zhì)上是使用iterator迭代器遍歷,順序鏈表訪問元素;

2?? 性能比對

  • 對于arraylist底層為數(shù)組類型的結(jié)構(gòu),使用for循環(huán)遍歷比使用foreach循環(huán)遍歷稍快一些,但相差不大

  • 對于linkedlist底層為單鏈表類型的結(jié)構(gòu),使用for循環(huán)每次都要從第一個元素開始遍歷,速度非常慢;使用foreach可以直接讀取當前結(jié)點,速度比for快很多

3?? 原理接釋

  • ArrayList數(shù)組類型結(jié)構(gòu)對隨機訪問比較快,而for循環(huán)中的get()方法,采用的即是隨機訪問的方法,因此在ArrayList里,for循環(huán)較快


  • # 順序表a[3]
    - 用for循環(huán),從a[0]開始直接讀到元素,接著直接讀a[1](順序表的優(yōu)點,隨機訪問)
    - 用foreach,得到a[0]-a[2]的全部地址放入隊列,按順序取出隊里里的地址來訪問元素


  • LinkedList鏈表形結(jié)構(gòu)對順序訪問比較快,iterator中的next()方法,采用的即是順序訪問的方法,因此在LinkedList里,使用iterator較快


    # 單鏈表b[3]
    - 用for循環(huán),從a[0]開始讀元素、然后通過a[0]的next讀到a[1]元素、通過a[0]的next的next讀到a[2]元素,以此類推,性能影響較大,慎用!
    - 用foreach,得到a[0]-a[2]的全部地址放入隊列,按順序取出隊里里的地址來訪問元素;



16. NIO、BIO、AIO

(1條消息) Netty_youthlql的博客-CSDN博客

尚硅谷Netty教程(B站最火,人氣最高,好評如潮)_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili

阻塞IO 和 非阻塞IO

IO操作分為兩個部分,即發(fā)起IO請求和實際IO操作,阻塞IO和非阻塞IO的區(qū)別就在于第二個步驟是否阻塞

  • 若發(fā)起IO請求后請求線程一直等待實際IO操作完成,則為阻塞IO

  • 若發(fā)起IO請求后請求線程返回而不會一直等待,則為非阻塞IO

同步IO 和 異步IO

IO操作分為兩個部分,即發(fā)起IO請求和實際IO操作,同步IO和異步IO的區(qū)別就在于第一個步驟是否阻塞

  • 若實際IO操作阻塞請求進程,即請求進程需要等待或輪詢查看IO操作是否就緒,則為同步IO

  • 若實際IO操作不阻塞請求進程,而是由操作系統(tǒng)來進行實際IO操作并將結(jié)果返回,則為異步IO

NIO、BIO、AIO

BIO表示同步阻塞式IO,服務(wù)器實現(xiàn)模式為一個連接一個線程,即客戶端有連接請求時服務(wù)器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。

NIO表示同步非阻塞IO,服務(wù)器實現(xiàn)模式為一個請求一個線程,即客戶端發(fā)送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。

AIO表示異步非阻塞IO,服務(wù)器實現(xiàn)模式為一個有效請求一個線程,客戶端的I/O請求都是由操作系統(tǒng)先完成IO操作后再通知服務(wù)器應(yīng)用來啟動線程進行處理。


17. 什么是反射

反射是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為 Java 語言的反射機制。

反射實現(xiàn)了把java類中的各種結(jié)構(gòu)法、屬性、構(gòu)造器、類名)映射成一個個的Java對象

優(yōu)點:可以實現(xiàn)動態(tài)創(chuàng)建對象和編譯,體現(xiàn)了很大的靈活性

缺點:對性能有影響,使用反射本質(zhì)上是一種接釋操作,慢于直接執(zhí)行java代碼

應(yīng)用場景

  1. JDBC中,利用反射動態(tài)加載了數(shù)據(jù)庫驅(qū)動程序。

  2. Web服務(wù)器中利用反射調(diào)用了Sevlet的服務(wù)方法。

  3. Eclispe等開發(fā)工具利用反射動態(tài)刨析對象的類型與結(jié)構(gòu),動態(tài)提示對象的屬性和方法。

  4. 很多框架都用到反射機制,注入屬性,調(diào)用方法,如Spring。


18. 序列化&反序列化

Java基礎(chǔ)學習總結(jié)——Java對象的序列化和反序列化 - 孤傲蒼狼 - 博客園 (cnblogs.com)

1?? 什么是序列化?

序列化是指將Java對象轉(zhuǎn)化為字節(jié)序列的過程,而反序列化則是將字節(jié)序列轉(zhuǎn)化為Java對象的過程

2?? 為什么需要序列化?

我們知道不同線程/進程進行遠程通信時可以相互發(fā)送各種數(shù)據(jù),包括文本圖片音視頻等,Java對象不能直接傳輸,所以需要轉(zhuǎn)化為二進制序列傳輸,所以需要序列化

3?? 序列化的用途

  1. 把對象的字節(jié)序列永久地保存到硬盤上,通常存放在一個文件中

    在很多應(yīng)用中,需要對某些對象進行序列化,讓它們離開內(nèi)存空間,入住物理硬盤,以便長期保存。比如最常見的是Web服務(wù)器中的Session對象,當有10萬用戶并發(fā)訪問,就有可能出現(xiàn)10萬個Session對象,內(nèi)存可能吃不消,于是Web容器就會把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對象還原到內(nèi)存中

  2. 在網(wǎng)絡(luò)上傳送對象的字節(jié)序列

    當兩個進程在進行遠程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個Java對象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復為Java對象

4?? JDK類庫中的序列化API

  • java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數(shù)指定的obj對象進行序列化,把得到的字節(jié)序列寫到一個目標輸出流中

  • java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節(jié)序列,再把它們反序列化為一個對象,并將其返回

只有實現(xiàn)了SerializableExternalizable接口的類的對象才能被序列化。Externalizable接口繼承自Serializable接口,實現(xiàn)Externalizable接口的類完全由自身來控制序列化的行為,而僅實現(xiàn)Serializable接口的類可以 采用默認的序列化方式

對象序列化包括如下步驟:

  1. 創(chuàng)建一個對象輸出流,它可以包裝一個其他類型的目標輸出流,如文件輸出流

  2. 通過對象輸出流的writeObject()方法寫對象

對象反序列化的步驟如下:

  1. 創(chuàng)建一個對象輸入流,它可以包裝一個其他類型的源輸入流,如文件輸入流

  2. 通過對象輸入流的readObject()方法讀取對象

5?? serialVersionUID的作用

serialVersionUID: 字面意思上是序列化的版本號,凡是實現(xiàn)Serializable接口的類都有一個表示序列化版本標識符的靜態(tài)變量

如果實現(xiàn)Serializable接口的類如果類中沒有添加serialVersionUID,那么就會出現(xiàn)警告提示

serialVersionUID有兩種生成方式:

  1. 采用Add default serial version ID方式生成的serialVersionUID是1L,例如:


    private static final long serialVersionUID = 1L;


2.采用Add generated serial version ID這種方式生成的serialVersionUID是根據(jù)類名,接口名,方法和屬性等來生成的,例如:


private static final long serialVersionUID = 4603642343377807741L;



19. 動態(tài)代理是什么?有哪些應(yīng)用?

當想要給實現(xiàn)了某個接口的類中的方法,加一些額外的處理。比如說加日志,加事務(wù)等??梢越o這個類創(chuàng)建一個代理,故名思議就是創(chuàng)建一個新的類,這個類不僅包含原來類方法的功能,而且還在原來的基礎(chǔ)上添加了額外處理的新類。這個代理類并不是定義好的,是動態(tài)生成的。具有解耦意義,靈活,擴展性強。

應(yīng)用

  • Spring的AOP

  • 加事務(wù)

  • 加權(quán)限

  • 加日志


20. 怎么實現(xiàn)動態(tài)代理

在java的java.lang.reflect包下提供了一個Proxy類和一個InvocationHandler接口,通過這個類和這個接口可以生成JDK動態(tài)代理類和動態(tài)代理對象

  • java.lang.reflect.Proxy是所有動態(tài)代理的父類。它通過靜態(tài)方法newProxyInstance()來創(chuàng)建動態(tài)代理的class對象和實例。

  • 每一個動態(tài)代理實例都有一個關(guān)聯(lián)的InvocationHandler。通過代理實例調(diào)用方法,方法調(diào)用請求會被轉(zhuǎn)發(fā)給InvocationHandler的invoke方法。

  1. 首先定義一個IncocationHandler處理器接口實現(xiàn)類,實現(xiàn)其invoke()方法

  2. 通過Proxy.newProxyInstance生成代理類對象

package demo3;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyInvocationHandler implements InvocationHandler {
    //定義真實角色
    private Rent host;

    //真實角色set方法
    public void setHost(Rent host) {
        this.host = host;
    }

    /**
     生成代理類方法
     1. 類加載器,為當前類即可
     2. 代理類實現(xiàn)的接口
     3. 處理器接口對象
    **/
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                host.getClass().getInterfaces(), this);
    }

    //處理代理實例,并返回結(jié)果
    //方法在此調(diào)用
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //調(diào)用真實角色方法,相當于調(diào)用rent()方法
        Object result = method.invoke(host, args);
        //附加方法
        seeHouse();
        contract();
        fare();
        return result;
    }

    //看房
    public void seeHouse() {
        System.out.println("中介帶你看房");
    }

    //簽合同
    public void contract() {
        System.out.println("租賃合同");
    }

    //收中介費
    public void fare() {
        System.out.println("收中介費");
    }
}


package demo3;

public class Client {
    public static void main(String[] args) {
        //真實角色:房東
        Host host = new Host();
        //處理器接口對象
        ProxyInvocationHandler handler = new ProxyInvocationHandler();
        //設(shè)置要代理的真實角色
        handler.setHost(host);
        //動態(tài)生成代理類
        Rent proxy = (Rent) handler.getProxy();
        //調(diào)用方法
        proxy.rent();
    }
}



21. 如何實現(xiàn)對象克隆?

有兩種方式:

         1.、實現(xiàn)Cloneable接口并重寫Object類中的clone()方法;

  1. protected Object clone() throws CloneNotSupportedException {
        test_paper paper = (test_paper) super.clone();
        paper.date = (Date) date.clone();
        return paper;
    }

  2. 2、實現(xiàn)Serializable接口,通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)真正的深度克隆


  3. import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.Date;

    @SuppressWarnings("all")
    public class Client {
        public static void main(String[] args) throws Exception {
            Date date = new Date();
            String name = "zsr";
            test_paper paper1 = new test_paper(name, date);
            //通過序列化和反序列化來實現(xiàn)深克隆
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream obs = new ObjectOutputStream(bos);
            obs.writeObject(paper1);
            byte a[] = bos.toByteArray();
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(a));
            test_paper paper3 = (test_paper) ois.readObject();//獲取到新對象
            paper3.getDate().setDate(1000);//改變非基本類型屬性
            System.out.println(paper1);
            System.out.println(paper3);
        }
    }








瀏覽 90
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产成人秘免费观看一区二区三区 | 欧美黄色成人视频| 高清无码激情| 久操视频一区二区三区| 懂色av懂色av粉嫩av| 91精品免费| 无码高清| 国产精品久久久久无码AV| 蜜桃av秘无码一区二区三欧| 久久一做爱| 性免费网站| 日韩性爱AV| 色999在线播放视频| 日韩欧美群交| 日韩午夜精品| 国产女人18| 精品少妇一区| 欧美无人区码suv| 欧美大黄视频| 日韩五月天| 国产精品三级在线| 精品无码一区二区三区免费| 久草视频免费在线观看| 亚洲免费观看高清完| 日韩精品一区在线观看| 亚洲国产剧情| 亚洲国产激情视频| 91精品人妻| 成人免费黄色网| 怡红院男人天堂| 超碰二区| 午夜成人鲁丝片午夜精品| 欧美自拍性爱视频| 91视频在| 黄色视频| 成人网站www污污污网站公司| 无码AV在线播放| 大荫蒂精品另类| 亚洲无码精品在线观看| 性爱无码AV| 中国免费一级无码成人片| 在线无码视频| 亚洲精品视频免费在线观看| 一级无码毛片| 91无码人妻精品1国产四虎| 特级西西人体大胆无码| 人人操人人妻人人看| 亚洲成人视频在线| 超碰在线观看免费版| 狠狠操狠狠撸| 精品成人Av一区二区三区| 欧美日韩在线电影| www.wuma| 欧美V| 国产毛片18水真多18精品| 黄色视频免费播放| se婷婷| 99热er| 日操操| www| 国产三级偷拍| 日韩无码二区| 欧美熟妇另类久久久久久不卡| 三级三级久久三级久久18| 午夜免费无码视频| 安徽妇搡BBB搡BBBB户外老太太| 日韩人妻无码一区二区三区七区| 91精品无码视频| 日韩在线欧美在线| 大香蕉精品在线视频| 亚洲成人a片| 东京热在线免费观看| 黄色性爱网址| 欧美综合激情| 色欲av网站| 久久久成人网| 99视频| 成人国产片女人爽到高潮| 91在线无码精品秘国产| 亚洲成人无码片| 国产精品秘麻豆免费版现看视频 | 日本韩国叼嘿片| 伊人性爱网| 国产精品无码毛片| 中文无码日本一级A片久久影视 | 亚洲午夜无码精品专区| 亚洲色图一区二区三区| 91亚洲影院| 黄色直播在线观看| 午夜AV在线播放| 欧美久久精品| 免费在线观看黄片| 无码区一区二区三区| 很很撸在线视频| 成人免费网站黄| 成人一级电影| 99精品视频免费在线观看| 国产一级婬片A片| 特一级A片| 欧美熟女18| 日韩久久婷婷| 无码一二区| 午夜综合网| 久久老熟女| 欧美日韩免费视频| 亚洲AV无码一区毛片AV| 丰满岳乱妇一区二区三区| 欧美激情中文字幕| 日本中文字幕电影| 人人超碰在线| 亚洲小说图片AV在线| 在线A视频| 福利黄色片:片| 国产资源在线观看| 黄色三级片视频| 一区不卡| 日韩群交视频| 小泽玛利亚一区二区免费| 成人丁香五月| 亚洲激情网站| 蜜臀av在线观看| 日韩无码你懂的| 国产三级片网站| 色婷婷亚洲婷婷| 欧美成人精品三级网站| 在线观看高清无码中文字幕| 日本精品二区| 欧美日韩免费在线| 中文字幕北条麻妃| 海滩AV黑人| 五月天国产精品| 中文字幕第11页| 四川揉BBB搡BBB| 97色综合| 中文字幕一区二区三区四区五区六区| 人操人碰| 97黄色| 日韩无码电影网| 免费一级A毛片夜夜看| 九久热| 黄色免费高清视频| 91人妻人人澡人人爽| 狠狠操狠狠操狠狠操| 亚洲vs无码秘蜜桃| 手机看片1024久久| 午夜福利高清在线观看| 91精品久久香蕉国产线看观看| 亚洲精品中文字幕乱码三区91 | 日本黄色视频官网| 国产精品婷婷| 国产午夜无码视频在线观看| 黄色视频免费国产| 日韩第一色| 亚州一级成人片| 黑人av在线| 少妇bbw搡bbbb搡bbbb| 国产成人免费看| 动漫人物插画动漫人物的视频软件| 中文字幕免费在线看一区七区| 亚洲av中文| 黄片99| 亚洲AV无码成人精品区在线欢看| 人人人人摸| 亚洲成人少妇老妇a视频在线 | 午夜久操| 成人在线视频免费观看| 日韩免费网站| 91麻豆精品国产| 欧美激情区| 亚洲熟妇在线观看| 欧美色啪| 久久精彩偷拍视频| 国产又爽又黄在线看视频| 亚洲婷婷五月天| 国产日韩二区| 天堂中文8资源在线8| 亚洲国产精品一区二区三区| 人人草人人摸| 国产一级AAAAA片免费| 欧美日韩一区在线| 黃色级A片一級片| 日韩区一中文字幕a∨| 天堂网2025| 婷婷五月亚洲精品AAA片在| 蝌蚪窝在线免费观看视频| 日本无码在线| 全国最大成人网站| 久久久久久亚洲AV无码专区| 国产在线无码视频| 日韩无码操逼视频| AV黄色片| 亚洲视频,中文字幕| 国产无码AV| 一级A毛片| 国产高清精品在线| 成人免费福利| 中文字字幕中文字幕乱码| 日韩在线免费视频| 国产三级网站| 亚洲在线视频观看| 中文字幕Av在线| 欧美激情性爱网站| 亚洲网站在线观看| 91久色| 天天干天天操天天干| 丁香婷婷一区二区三区| 亚洲无码一级片| 一级片成人| 精品尤物| 丁香社区五月天| 色欲91| 久久婷婷国产综合| 2019国产精品| 一级午夜福利| 性九九九九九九| 9热在线视频| 天堂在线观看av| 亚洲天堂网在线观看视频| 国产无码高清在线| 亚洲AV无码成人精品区久| 99熟女| 国产精品久久久久久久久久二区三区 | 91精品国产乱码香蕉黄瓜草莓| av婷婷五月天| 少妇激情av| ThePorn-成人网站入口| 精品蜜桃秘一区二区三区在线播放 | 99热思思| 一本色道久久88综合无码 | 三级成人网站| 天天射天天干| 韩国午夜电影| 亚洲成人69| 91人妻一区| 欧美视频A| 天天干天天在线观看| 大香蕉久久久久久久| 黄色视频在线观看大全| 精品日韩AV| 懂色av蜜臀av粉嫩av分| 久久精品波多野结衣| 久久久久久伊人| 三级片亚洲无码| 精品无码人妻一区二区媚黑| 蜜芽成人网站| 久久精品女人| 老司机av| 三级网站在线播放| 热久久免费视频| 露脸偷拍AV2025| 中国一级黄色A片| 欧美性爱动态| 黄色视频在线观看| 中文字幕第23页| 影音先锋国产av| 亚洲国产毛片| 亚洲日韩av在线| 丰满欧美熟妇免费视频| 国产成人精品AV| 懂色成人视频在线观看| 国产成人精品片| 免费无码国产在线| 久久aaaa| 黄片免费播放| 福利久久| 国产三级网站| 日韩在线观看AV| 亚洲av大片| 另类视频在线| 91成人大片| a片在线视频| a视频在线| 狠狠躁夜夜躁人人爽人妻| 日韩五月婷婷| 亚洲国产一| 日韩日韩日韩日韩| 欧美三级大片| 精产国品一区二区区别| 99草自拍| V片免费看| 色婷婷久久综合| 三级片网站视频| 人妻精品一区二区三区| 亚洲福利在线观看| 亚洲成人性爱在线| 三级无码在线观看| 麻豆视频一区| 少妇搡BBBB搡BBBB毛多多| 欧美色图视频网站| 婷婷五月亚洲精品AAA片在| 亚洲GV成人无码久久精品| 午夜精东影业传媒在线观看| 91亚洲视频在线观看| 超碰乱交av在线| 影音先锋婷婷| 骚逼影视| 天天色色综合| 午夜小电影| 国产精品尤物| 日本电影一区二区| 一级a一级a免费观看视频Al明星 | 丰臀肥逼高清视频电影播放| 亚洲欧洲精品成人久久曰影片| www俺来也com| 国产草逼视频| 91视频在线观看网| 九色丨蝌蚪丨老版熟女| 国产精品V日韩精品V在线观看| 免费欧美A片| 黄片免费看| 国产欧美一区二区三区国产幕精品| 欧美级黑寡妇毛片app| 无码探花| 日韩三级毛片| 亚洲a在线视频| 99天天操| av无码网站| 免费黄色大片网站| 日韩一级免费在线观看| 亚洲无码黄片| 国产日韩欧美综合精品在线观看 | 无码人妻一区二区三区免水牛视频| 99精品人妻| 成人av网站在线播放| 伊人精品大香蕉| 国产成人影视在线观看| 午夜性福利| 色欧美亚洲| 国产成人精品免费看视频| 丝袜足交视频| 91黄在线观看| 午夜成人中文字幕| 青青草原AV| 成人精品永久免费视频99久久精品| 成人精品秘免费波多野结衣| 久久久网| 中文字幕亚洲观看| 欧美精品在线观看视频| 免费无码成人片在线观看在线 | 巨乳国产一区| 亚洲污污| 91成人精品视频| 精品视频久久久久久| 青青草在线免费视频| 在线无码一区| 影音先锋av网| 国产不卡一区| 欧美性猛交一区二区三区精品| 怡春院院成人免费视频| 国产天堂在线| 四川性BBB搡BBB爽爽爽小说 | 午夜黄色视频| 国产小黄片在线| 色哟哟一区二区三区| 色欲成人AV| 高清无码黄| 中文av在线播放| 中文字幕日韩欧美在线| 色色热热| 久久电影五月天| 人人cao| 亚洲日韩视频在线观看| 北条麻妃九九九在线视频| 亚洲日韩一级片| 五月丁香激情六月| 狠狠色婷婷777| 日本高清版色视频| 日本中文字幕中文翻译歌词| 大鸡巴导航| 成年人视频免费| 五十路在线视频| 久久2| 蜜桃AV在线| 免费AV网站在线| 日韩色综合| 欧美干干| 三级亚洲| 国产精品夜夜爽3000| avwww| 婷婷激情五月天丁香| 熟女视频91| 亚洲福利一区二区| 四虎在线观看一区网址| 99精品视频免费观看| 91AV在线免费观看| 亚洲资源在线| 一插菊花综合视频| 91国产精品| BBB搡BBB搡BBB搡BBB| 一见钟情的韩国电影| 天天天天天天天天操| 国产欧美一区二区三区视频 | 免费黄色A片| 国产综合久久久777777色胡同| 手机免费AV| 51亚洲精品| 99热99在线| 高清无码一区二区在线| 波多野结衣亚洲无码| 亚洲中文字幕成人| 97欧美精品人妻系列| 牛牛在线精品视频| 大香蕉视频在线观看| 你懂的视频在线播放| 亚洲在线| 欧美成人免费A级在线观看| 日韩99在线观看| 黄片在线免费播放| 日韩人妻精品一区二区| 久草福利在线视频| 亚洲AV毛片成人精品网站| 黄网站免费看| 色婷婷在线综合| 成人小说视频在线社区| 中文字幕乱码中文字幕电视剧| 国产乱子伦-区二区| 亚洲精品大片| 在线男人天堂| 白浆四溢av| 啪啪啪免费| 人妖和人妖互交性XXXX视频 | 97人人精品| 西西444WWW无码视频软件功能介绍 | 亚洲AV永久无码国产精品久久| 成人A片免费| 国产Av影视| 搡BBBB搡BBB搡五十粉嫩| av在线资源网| 91吴梦梦无码一区二区| 日韩无码三级片| 久久精品91| 大香蕉一级红色片青青河边草| 岛国无码破解AV在线播放| 国产91在线拍揄自揄拍无码九色| 午夜AV在线| 天天爽天天爽成人A片影院| 国产传媒AV| 日韩免费高清无码| 欧美精产国品一二三区别| 色色一级| 性色网| 日本中文字幕网站| AV青青草原| 99在线免费观看| 欧美午夜成人一区二区三区| 欧美日韩国产在线| yw在线观看| 免费一级A片在线播放| 欧美+日韩+国产+成人+在线| 高清无码一区| 欧美亚洲日韩中文字幕| 天天日天天| 欧美视频综合| 成人三级av| 懂色av蜜臀av粉嫩av分| 大香蕉一级红色片青青河边草| 香蕉网址| 久久精品999| 国模无码在线| 黄色大片网站| 激情国产av| 久热re| 国产精品自拍一区| 最新一区二区| 人人摸人人色| 亚洲一级二级三级片| 老妇bbw| 久久99九九| 91欧美在线| 国产又粗又猛又爽又黄91精品| 大香蕉美女视频| 日韩免费AV| 免费精品视频| 久久久青草| 一本久久综合亚洲鲁鲁五月天| 国产激情艹逼| 超碰成人在线观看| 亚洲无码视频一区二区| 色欲熟妇| 在线不卡无码| 日本一节片在线播放| 尤物无码| 黄片大全免费看| 亚洲最新无码| 日韩AⅤ无码一区二区三区| 猫咪视频大全视频| 日本天堂网| 亚洲日韩成人电影| 91蜜桃传媒在线观看| 亚洲成人视频网| 操骚B| 黄色电影免费在线观看| 最新中文字幕在线视频| 午夜爽爽爽| 337P粉嫩大胆噜噜噜55569| 欧美大胆a| AV性爱社区| 操逼免费| 国产一区二区三区免费播放| 一级黄色电影免费观看| 伊人五月天| 在线观看中文字幕网站| 精品人妻一区二区乱码一区二区 | 欧美操逼大全| 这里只有精品91| 久久99九九| 成人AV免费在线观看| 超碰人人插| 欧美日韩成人在线观看| 日逼网站视频| 日韩亚洲在线视频| 伊人色色| 欧美aaa| 五月色婷婷撸| 黄色福利| 国产视频网| 天天操综合| 欧美精品人妻| 亚欧三级| 影音先锋麻豆| 91久久人澡人妻人人做人人爽97| 精品成人在线观看| 无码观看视频| 蜜桃传媒在线| 久久久久久久三级片| 色人阁人妻中文字幕| 国产午夜福利电影| 国产免费一区二区三区最新不卡| 国内免费av| 国产综合精品久久久久成人AV| 大香蕉中文网| 国内精品一区二区三区| 影音先锋国产av| aa在线| 免费视频一二区| jizz免费视频| 亚洲啊v| 日逼一级| 国产av一二三区| 色94色.欧美.setu| 2019中文字幕在线免费观看| 久久精品| 97精品视频| 无码高清在线| 人人爱人人摸| 色婷婷丁香五月| 18禁网址| 五月天婷婷乱伦| 日韩无码中文字幕| 精品九九九| 巨い巨乳の少妇あジed2k| 五月婷婷六月丁香| 日皮做爱视频网站| 久久电影五月天| 强奸校花到高潮| 少妇在厨房| 午夜国产精品AV| 香蕉成人视频| 小早川怜子精品一区二区| 爱爱高清视频| 中文字幕一级片| 亚洲Av无码午夜国产精品色软件| 免费在线a视频| 国产成人激情| 日韩一区二区三区无码电影| 国产ts在线观看| 天天色天天色| 中文字幕+乱码+中文乱码91在线观看 | 四虎操逼| 超碰成人97| 大香蕉做爱| 国产操逼视频网站| eeuss一区| 亚洲无码三区| 一级片免费观看| 亚洲不卡| 亚洲高清无码免费在线观看 | 亚洲AV综合网| 成年女人免费视频| 九九操逼| 中国一级A片| 99精品久久| 国产一级a片| 午夜免费播放观看在线视频| 中文字幕免费一区| 99热99re6国产线播放| 国产成人AV一区二区三区在线观看| 大香蕉大香蕉网| 天天日天天日天天干| 欧美亚洲日韩中文字幕| 精品91海角乱| 91人妻无码| 超碰老熟女| 专肏老妇人大逼| 国产乱子伦一区二区三| 日韩成人免费观看| 午夜福利影片| AA黄色片| 久久国产精品波多野结衣AV| 高清色色女网站| 91在线无码精品秘软件| 一区二区三区在线视频观看| 88AV在线视频| 国产午夜无码视频在线观看| 久久人妻中文字幕| 国产欧美一区二区三区视频| 日本一级片中文字幕| 国产乱子伦精品久久| 人妻丝袜无码视频专区| AV在线免费观看网站| 五月天婷婷丁香| 国内成人自拍| 日韩人妻久久| 不卡视频一区二区三区| 麻豆视频国产| 大香蕉操逼| 乱子伦一区二区三区视频在线观看 | 91视频第一页| 岛国av免费看| 九九热精品视频在线播放| 大香蕉伊人| 丰满大爆乳波霸奶| 久久er99| 成人三级片免费| 91狠狠色丁香婷婷综合久久| 精品福利在线观看| 怡红院爽妇网| 作爱网站| 青春草在线视频观看| 五月丁香在线观看| 一级操逼大片| 中文字幕黄色| 免费成人黄色网址| 亚洲午夜视频| 亚洲操操操操| 亚洲黄色视频网站在线观看 | 色欲一区二区| 中文字幕伊人| 国产高清无码免费视频| 九色蝌蚪视频| 人人色在线| 亚洲视频一区| 99色天堂| 午夜福利影视| jizzjizz国产| 97人人操人人干| 日本亚洲精品秘入口A片| 欧美婷婷综合| 成人无码www在线看免费| 久久天堂影院| 日韩黄色一级| 俺来也俺就去www色情网| 亚洲草片| 天天看天天爽| 国产黄色视频免费| 白浆四溢av| 国产真实乱婬A片久久久老牛| 国产插逼视频| 天堂在线视频| 搡BBB搡BBBB搡BBBB'| 国产啊啊啊啊| 国产无码一区二区| 人妻无码中文字幕蜜桃| 午夜久久久久久久久久久久91| 亚洲AV无码乱码| 国产农村乱婬片A片AAA图片| AV中文字幕在线播放| 少妇爆射| 亚洲天堂在线视频播放| 日逼黄色| 日本三级久久| 99黄片| 亚洲骚妇| 西欧超碰在线| 无码国产视频| 熟女人妻一区二区三区| 久久九九热| 男人的天堂在线视频| 台湾色综合| 成年人A片| 在线免费看AV片| 欧美黄色性爱| 无码人妻丰满熟妇bbbb| 男人午夜网站| 人人草人人看| 国产免费激情视频| 九九久热| 亚洲三级在线观看| 成熟的国模冰莲[2]| 婷婷日韩中文字幕| 成人久久久久久| 亚洲精品第一页| 精品逼| 杨门女将婬乱史1—6| 五月影院| 亚洲系列中文字幕| 亚洲在线免费观看| 亚洲成人电影一区| 日本三级在线| 国产精品囯产三级囯产AV野外| 日本黄色小视频| 免费18蜜桃久久19| 草榴在线视频| 免费超碰| 日本狠狠干| 国产熟女乱伦| 亚洲性无码| 欧美在线视频99| 人人人人人人人人操| www.黄| 永久AV免费网站| 黄色一级大片| 夜夜骚av.一区二区三区四区| 欧美操B| 在线播放国产精品| 99中文字幕| 国产精品综合| 51黄片| 国产av一区二区三区四区| 高清无码免费| 蜜臀AV在线播放| 暗呦罗莉精品一区二区| 在线欧美亚洲| 91牛视频| 黑巨茎大战欧美白妞小说| 中文无码日本高潮喷水| 色婷婷在线无码精品秘人口传媒| 鸭子av| 久久无码高清视频| 久久久久久久久久久久国产精品| 成人四区| 亚洲色视频在线| 影音先锋国产资源| 俺也去网av| 99热这里只有精品99| 动漫精品一区二区| 激情99| 99视频| 亚洲精品天堂无码| 亚洲精品456| 日韩AV大片| 五月丁香在线观看| 亚洲无码在线播放视频| 中文无码精品欧美日韩| 国产激情视频在线播放| 精品久久久无码| 午夜无码电影| 俺来俺也去www色在线观看| 六月丁香五月| 久久区| 亚洲最新AV网站| 天堂中文在线观看| 国产一级a毛一级a毛视频在线网站) | 操国产美女| 91在线无码精品秘入口| 天堂aaa| 免费做爱视频网站| 无码一区二区视频| 国产一级a免一级a免费| 人人色人人操| 99热在线观看精品免费| 91人妻人人澡人人爽人人DVD| 91无码人妻传媒tv| 精品国产偷拍| 一区二区三区麻豆| 91人人爽| 精品无码一区二区三区的天堂| 亚洲精品成人无码熟妇在线| 东京热男人的天堂| 国产男女视频| 色情片在线播放| 欧美日韩卡一卡二在线播放视频| 日韩爱爱免费视频| 亚洲日本中文字幕在线| 麻豆乱伦| 国产一区二区三区在线视频| 51福利导航| 天天看天天干| 综合国产| 刘玥一级婬片A片AAA| A区性愛社区| 91精品国自产在线观看| 又黄又湿的视频| 岛国av无码免费| 丁香五月欧美| 特级婬片AAAAAAA级| 猛男大粗猛爽h男人味| 69久久久久久久久久| 韩国高清无码视频| 强开小嫩苞一区二区三区网站| 欧美后门菊门交4| 色色色综合| 逼特逼视频在线观看| 99草在线视频| 爆操视频| 在线观看黄| 日韩色综合| 91九色TS另类国产人妖| 99久久人妻精品免费二区| 亚洲成人一区二区| 精品午夜福利| 日韩欧美成人在线观看| 国产无码电影网| 国内成人精品网站| 久久99免费视频| 欧美精品一级片| 国产aaaaaaaaaa| 中文字幕成人av| 西西4444WWW大胆无视频| 香蕉网址| 福利视频一区二区三区| 一区二区三区四区无码在线| 91麻豆免费看| 婷婷五月花| 国产黄片免费在线观看| 人人爽人人操人人| 欧美一区在线视频| 五月亚洲六月婷婷| 亚洲一级黄色电影| 麻豆人妻换人妻好紧| 青青草原网址| 日本亲子乱婬一级A片| 国产区视频| 最新中文字幕观看| 欧美日韩一区二区三区| 亚洲日韩中文无码| 成年人黄色电影| 爱草在线| 超碰97人人爱| 国产高清AV无码| 爱爱帝国综合社区| 亚洲免费高清| 久久国产劲爆∧v内射| 婷婷爱五月| 久久精品国产亚洲AV成人婷婷| 欧美成人网址在线观看| 操逼基地| 日韩视频免费观看高清完整版在线观 | 无码电影在线播放| 日日综合网| 日本高清视频网站| 殴美亚洲一流| 国产大鸡吧| 成人无码区免费AV片| 亚洲欧美日韩综合| 成年人黄色电影| 亚州免费视频| 亚洲第一中文字幕| 国产一级特黄大片| 日日夜夜草| 444444免费高清在线观看电视剧的注意| 精品无码产区一区二| 日逼视频免费观看| 青青草无码成人天堂免费| 国产又色又爽又黄又免费| 欧美黄色网址| 三个黑人猛躁我一晚上| 一本一本久久a久久精品牛牛影视| 国产成人无码一区二区在线播放| 天天视频入口| 成人免费爱爱视频| 亚洲免费观看高清完整| 蜜桃传媒在线| 伊人婷婷久久| 国产乱国产乱老熟300视频| av字幕网| 97人妻精品黄网站| 99电影网手机在线观看| 北条麻妃无码| 91热| 国产无码一区二区| 九九无码| 亚洲视屏| 人人爱人人摸| 欧美一区二区三区婷婷五月| 国产美女裸体网站| 成人无码免费毛片A片| 日韩操逼片| 天天色图| 亚洲天天干| 日韩在线不卡| 巨乳国产一区| 日韩免费高清在线视频| 国产精品免费久久影院| 国产无码AV大片| 美女黄色视频永费在线观看网站 | 黄色AV免费观看| 人成在线视频| A片在线免费| 日韩欧美黄色电影| 99久re热视频精品98| 人人爽人人操人人| 一级片学生妹| 亚洲成人影片在线观看| 三级片网站视频| 五月天婷婷基地| 91AV| 欧美成人无码A片免费| 国产午夜无码福利视频| 天天干天天日天天干|