javaSe基礎(chǔ)總結(jié)

、6一、基本知識

1.?JDK和JRE的區(qū)別

答:JDK是java語言開發(fā)工具包,包含JRE和開發(fā)工具(javac.exe等);JRE是java語言的運行環(huán)境,包含JVM和核心類庫;JVM是java虛擬機,保證了java的跨平臺性。

2.?JVM跨平臺嗎?

答:JVM不具有跨平臺性,不同的操作系統(tǒng)所對應(yīng)的JVM不一樣。正是因為JVM的不跨平臺,才能夠使java語言具有跨平臺性。

3.保留字是什么?

答:保留字是還未使用的關(guān)鍵字,可能在java以后的版本中使用。有g(shù)oto和const。

4.?java語言的特點?

答:完全面向?qū)ο螅缙脚_性,開源,簡單易學(xué),安全可靠,高性能,分布式處理,多線程,健壯性,多態(tài)。

5.?main是關(guān)鍵字嗎?

答:不是的。main是主函數(shù)的名字,能夠被虛擬機識別,是程序執(zhí)行的入口。

6.?path和classpath的區(qū)別?

答:path環(huán)境變量配置的是可執(zhí)行文件.exe的執(zhí)行路徑;能夠在不同盤符下訪問path路徑下的可執(zhí)行文件。Classpath配置的java語言編譯后生成的字節(jié)碼文件的執(zhí)行路徑。

7.計算機最基本的存儲單位是:字節(jié)(byte)

計算機能直接識別的進制是:二進制

8進行運算的時,變量和常量有什么區(qū)別?

答:變量在運算過程中的值是變化的,可以被多次賦值。常量則是固定的。

9標識符的組成?以及命名規(guī)則?

答:標識符有26個字母的大小寫,0到9,_和$組成。

命名規(guī)則:不能使用關(guān)鍵字,不能數(shù)字開頭,嚴格區(qū)分大小寫,要見名知義。

函數(shù)名和變量名如果是多個單詞組成,第一個單詞的首字母小寫,其余首字母大寫。

類名和接口名如果是多個單詞組成,首字母全部大寫。

包名全部小寫。

常量名全部大寫,如果是多個單詞,用_隔開。

10.變量數(shù)據(jù)類型分為哪幾種?如何使用變量?

答:基本數(shù)據(jù)類型:整形:包括byte、short、int、long。浮點型:包括float、doble。

字符型;char;布爾型:boolean。

引用數(shù)據(jù)類型:數(shù)組、類、接口。

變量需要先定義,再賦值,才能使用。

11.常量分為哪幾種?

答:自定義常量和字面值常量。自定義常量是我們自己通過final修飾定義的常量。字面值常量包括整數(shù)、小數(shù)、布爾、字符、字符串。

12.byte的范圍多少?char的范圍多少?

答:byte范圍-128到127 。 ??char范圍0到65535.

13. ASCII碼表中 字符 '0' ?, 'a' , 'A' 分別對應(yīng)int類型的值是多少.

答:0在表中對應(yīng)的值是48,a對應(yīng)的是97;A對應(yīng)的是65.

14.long是8個字節(jié),float是4個字節(jié),為什么long 比 float小?

答:底層采用的運算規(guī)則不一樣。

15.以取值范圍的大小排列數(shù)據(jù)的基本類型.

答:double>float>long>int>char>short>byte

16.+=、-=、這些運算符內(nèi)隱含了強制類型轉(zhuǎn)換。

17.++和—的使用?

答:單獨使用的時候,在前在后都一樣。

參與運算的時候,在前是先自加或者自減,然后再用這個結(jié)果參與運算。在后是先參與運算,再進行自加或者自減。

18.邏輯或" | " 和 短路或 " || "有什么區(qū)別?

答:|不管前面的結(jié)果是真是假后面的都會運算,||前面為真后面的不參與運算。但是結(jié)果是一樣的。

19.邏輯與" & " 和 短路與 " && " 由什么區(qū)別?

答:&不管前面的結(jié)果是真是假后面的都會運算,&&前面為假后面的不參與運算。但是結(jié)果是一樣的。

20.Math.round原理是什么?

答:先加0.5,然后再取floor值。

21.生成隨機數(shù)的方法?

答:第一種:Random類中的方法;第二種Math.random()方法,生成的是0.0和1.0范圍直接的小數(shù)。

22.if…else..和三元表達的區(qū)別

答:能用三元表達式寫的就能用if語句寫,但是能用if語句寫的,三元表達式不一定能寫。三元表達式必須要有一個結(jié)果。

23.while、do while 、for的區(qū)別?

答:do while語句是先性后判斷,while和for先判斷后執(zhí)行。

for循環(huán)結(jié)束后,其中定義的初始化條件不能再使用。

24.if和switch區(qū)別?

答:if1.對具體的值進行判斷。2.對區(qū)間判斷。3.對運算結(jié)果是boolean類型的表達式進行判斷。

switch: 1.對具體的值進行判斷。2.值的個數(shù)通常是固定的

25.switch語句的表達式可以放什么?

答:byte、short、int、char。JDK1.5以后可以使用枚舉,1.7之后可以使用String。

26.死循環(huán)的兩種寫法.

答:while(true) ?和 ?for(;;)

27.break和continue的區(qū)別

答:break是完全跳出循環(huán),不再執(zhí)行循環(huán)體的代碼。也可以用在switch語句中。Continue是提前結(jié)束本次循環(huán),進入下次循環(huán)。Return是結(jié)束方法。

28.switch中break可以省略嗎?default可以省略嗎?

答:break在最后一個可以省略,其他的不要省略。Default可以省略。

29:方法重載和方法重寫的區(qū)別?

答:方法重載是在同一個類中出現(xiàn)同名方法,參數(shù)列表不同,與返回值類型無關(guān)。

方法重寫是在子父類間,子類出現(xiàn)和父類聲明完全相同的方法時,就成為方法重寫。重寫要求返回值必須相同或者有子父類關(guān)系。

30.方法的注意事項:

答:要明確方法的返回值類型,明確方法的參數(shù)列表。

31.方法的調(diào)用?

答:有返回值時可以單獨調(diào)用,但是沒有意義;也可以放在輸出語句中;可以賦值給變量。無返回值直接調(diào)用即可。

32.數(shù)組的定義格式?

答:int[] arr =new int[5];int arr[]= new int[5];

int[] arr = new int[]{1,5,6,7,…} int[] arr = {23,6,8,9…}

二維數(shù)組

String[][] arr = new String[3][];

Syso(arr[0]) ?打印的結(jié)果是null。

33.數(shù)組的默認值?

答;整形的默認值是0,引用數(shù)據(jù)類型是null;boolean型的是false。

34.棧內(nèi)存和堆內(nèi)存?

答:棧內(nèi)存用于存儲局部變量和代碼的執(zhí)行,堆內(nèi)存中都是new出來的。

35.數(shù)組和集合的區(qū)別:

(1)長度區(qū)別:數(shù)組長度是固定的;集合長度可變。

(2)存儲內(nèi)容:一個數(shù)組只能存儲同一種數(shù)據(jù)類型的元素;集合可以存儲不同數(shù)據(jù)類型的元素。

(3)數(shù)據(jù)類型:數(shù)組能夠存儲基本數(shù)據(jù)類型,也能夠存儲引用數(shù)據(jù)類型;集合只能存儲引用數(shù)組類型。

36.數(shù)組和集合的轉(zhuǎn)換?

答:數(shù)組轉(zhuǎn)為集合:Arrays.asList(數(shù)組),轉(zhuǎn)為集合后不能添加、刪除元素。但是可以修改元素。把基本類型的數(shù)組轉(zhuǎn)為集合,把這個數(shù)組作為對象存入集合中。

集合轉(zhuǎn)為數(shù)組:list.toArray().

二、面向?qū)ο?/p>

37.局部變量和成員變量的區(qū)別:

(1)定義位置不同:成員變量定義在類中方法外,局部變量定義在方法內(nèi)。

(2)作用范圍不同:成員變量在整個類中有效,局部變量在所在的方法有效。

(3)內(nèi)存位置不同:成員變量隨著對象的創(chuàng)建存放在堆內(nèi)存中,局部變量存放在棧內(nèi)存中。

(4)初始化值不同:成員變量是有默認的初始化的值的;局部變量不賦值不能用。

(5)生命周期不同:成員變量隨著對象的存在而存在,隨著對象的消失而消失;局部變量隨著方法的調(diào)用而存在,方法調(diào)用完畢而消失。

38.變量的使用順序?

答:就近原則。先在局部找,局部找不到在本類中找,本類找不到就去父類找,找不到就編譯失敗。

39.類和對象的關(guān)系?

答:類是具有相同或相似一類事物的抽象;對象是類的實例化。

40.java描述事物最基本的單位?

答:類

41.什么叫面向?qū)ο螅?/p>

答:面向?qū)ο笫且环N思想,它是基于面向過程的,強調(diào)的是具備功能的對象,讓對象調(diào)用方法解決問題。在開發(fā)中,要完成特定的功能就去尋找相應(yīng)的對象,如果找不到就創(chuàng)建對象,使用對象,維護完善對象。

自己舉例說明:廚師做飯,女朋友洗衣服。。。。。

思想特點:1.讓復(fù)雜的事情簡單化;2,更符合人類的思維需求;3.角色從執(zhí)行者到指揮者。

三大特征:封裝,繼承,多態(tài)。

42.什么是封裝?封裝的原則?好處?

答:封裝就是把不需要對外暴露的狀態(tài)信息隱藏在對象內(nèi)部,不允許外部程序直接訪問對象的信息,而是通過該類對外提供公共的訪問方式對其訪問和操作。

原則:(1)將不需要對外暴露的信息隱藏;(2)對外提供公共的訪問方式。

好處:將變化隔離;提高了安全性;便于使用,提高了重用性。

43.封裝就是私有,對嗎?為什么?

答:private是封裝的一種體現(xiàn)形式。方法也是封裝。

44.Java中參數(shù)傳遞的問題:

答:如果是基本數(shù)據(jù)類型,傳遞的參數(shù)要和形參的類型一致;如果是引用數(shù)據(jù)類型,那么傳遞的參數(shù)類型和形參的一致,或者是他的子類。

45.構(gòu)造方法,set方法都可以給成員變量賦值,這兩種賦值方式有什么區(qū)別?

答:構(gòu)造方法主要作用是用來給對象初始化,賦值只是他的兼職工作,也可以不用賦值。

Set方法只能用來賦值,在原有對象的基礎(chǔ)上賦值。

46.static關(guān)鍵字的特點?注意事項是什么?有什么好處和弊端?

答:(1)被static修飾的變量和方法隨著類的加載而加載(2)優(yōu)于對象存在(3)能夠被類名直接調(diào)用(4)資源共享。

注意事項:靜態(tài)方法中不可以定義this、super關(guān)鍵字,因為靜態(tài)優(yōu)先于對象存在,靜態(tài)只能覆蓋靜態(tài)。

好處:static能夠被類名直接調(diào)用,定義的是對象的共性內(nèi)容,不用每個對象單獨定義,節(jié)省空間。弊端:生命周期過長。

47.類變量和實例變量的區(qū)別?

答:(1)所屬不同:類變量屬于類,是對象的共性內(nèi)容;實例變量屬于對象,是特性內(nèi)容。

(2)存儲位置不同:類變量隨著類的加載存儲于方法區(qū);實例變量隨著對象的創(chuàng)建存儲于堆內(nèi)存中。

(3)生命周期不同:類變量隨著類的加載而存在,隨著類的消失而消失;實例變量隨著對象的存在而存在,隨著對象的消失而消失。

(4)調(diào)用方式不同:類變量能夠被類名直接調(diào)用,有對象的時候也能被對象調(diào)用;實例變量只能被對象調(diào)用。

48.構(gòu)造方法能不能重載?

答:可以,在同一個類中,參數(shù)列表不同,與返回值無關(guān)。

49.靜態(tài)代碼塊和構(gòu)造代碼塊的區(qū)別?

答:(1)靜態(tài)代碼塊屬于類,給類進行初始化,類一加載就會執(zhí)行,只執(zhí)行一次,經(jīng)常用于加載驅(qū)動。

(2)構(gòu)造代碼塊給對象進行統(tǒng)一初始化,每創(chuàng)建一次就會執(zhí)行一次。

50.什么是繼承?

答:當多個類中有很多共性的內(nèi)容時,我們可以把這些共性內(nèi)容抽取出來封裝成一個類,讓這些類與這個封裝的類產(chǎn)生關(guān)系。這種關(guān)系就是繼承。

51.繼承的的特點和好處,弊端?

答:特點:java只支持單繼承,但是能夠多層次繼承;接口能夠單繼承,也能夠多繼承。

好處:(1)提高了代碼的復(fù)用性(2)提高了代碼的維護性(3)提高了代碼的擴展性。(4)讓類與類產(chǎn)生了關(guān)系,是多態(tài)的前提。

弊端:增強了類與類的耦合性。

52.this和super 的區(qū)別?

答:this代表對象的引用,super代表當前對象父類的引用。

53.Super()和this()在構(gòu)造方法能同時使用嗎?

答:不能,super調(diào)用的是父類的構(gòu)造,要放在構(gòu)造函數(shù)的第一行;this調(diào)用的是本類的構(gòu)造,也要放在第一行。

Super關(guān)鍵字和this關(guān)鍵字能否在構(gòu)造函數(shù)中共存?

答:能。

54.為什么每個構(gòu)造函數(shù)中第一行都有默認的super()?

用于子類對象訪問父類前,對父類數(shù)據(jù)進行初始化。

55.為什么默認的super()都是空參的呢?

因為Object類是所有 類的父類,Object中只有一個空參構(gòu)造。

56.構(gòu)造方法的特點?

答:(1)方法名和類名相同(2)沒有返回值,連viod都沒有。(3)不用寫return,可以有return;

57.this的作用?

答:(1)區(qū)別局部變量和成員變量(2)代表本類對象的引用(3)也可以用于構(gòu)造方法的調(diào)用。

58.子父類都有靜態(tài)代碼塊,構(gòu)造代碼塊,構(gòu)造方法的執(zhí)行順序?

答:父類的靜態(tài)代碼塊先執(zhí)行,再執(zhí)行子類中的靜態(tài)代碼塊;接著執(zhí)行父類的構(gòu)造代碼塊和父類的構(gòu)造方法,最后執(zhí)行子類的構(gòu)造代碼塊和構(gòu)造方法。

59.final修飾的變量的初始化時機:

答:a.未被static關(guān)鍵字修飾

* 可以顯示初始化

* 可以在構(gòu)造方法中初始化

b.被static修飾

* 可以顯示初始化

* 可以在靜態(tài)代碼塊中初始化

* 不能在構(gòu)造方法中初始化

60. final如果修飾局部變量,會發(fā)生什么事情?

答:基本類型,是值不能被改變,引用類型,是地址值不能被改變,對象中的屬性可以改變。

61.什么是多態(tài)?多態(tài)的體現(xiàn),前提,好處和弊端分別是什么?

答:同一事物在不同時刻表現(xiàn)出來的不同狀態(tài)。

體現(xiàn):父類引用指向子類對象,父類引用作為參數(shù)可以接收其子類對象,接口引用作為參數(shù)可以接收其實現(xiàn)類對象。

前提:(1)類與類之間要有關(guān)系,要么繼承,要么實現(xiàn)(2)要有方法重寫(3)父類或者接口引用指向子類對象。

好處:(1)提高了代碼的維護性(2)提高了代碼的擴展性,父類引用指向子類對象

弊端:父類引用只能調(diào)用父類的方法,不能調(diào)用子類特有的方法和屬性。

*向上轉(zhuǎn)型:父類或者父接口指向子類對象。

*向下轉(zhuǎn)型:把那個引用強制轉(zhuǎn)為子類對象。

62.多態(tài)中成員方法和變量的特點?

答:(1)一般方法:編譯看左邊,運行看右邊。(2)靜態(tài)方法:編譯看左邊,運行看左邊。(3)變量:編譯看左邊,運行看左邊。

63.抽象類和抽象方法的特點,有什么關(guān)系?

答:抽象類不能創(chuàng)建對象,需要子類繼承;抽象方法沒有方法體,需要子類去實現(xiàn)。抽象類不一定含有抽象方法,抽象方法一定在抽象類中。

64.抽象類中的抽象方法和非抽象方法的區(qū)別?

答:抽象方法要求子類必須重寫,完成相應(yīng)的功能;非抽象方法讓子類繼承,提高代碼的復(fù)用性。

65.abstract不能和哪些關(guān)鍵字共同存在?

答:private:私有的方法是不可見的,無法被復(fù)寫

final:被final修飾的方法是最終方法,無法被復(fù)寫

static:被static修飾的方法,要隨類加載到方法區(qū),由于抽象方法沒有方法體所以不能加載

66.final修飾的變量、方法、和類有什么特點?

答:final修飾的變量只能賦值一次,不能發(fā)生改變,如果修飾的基本類型,是其值不能發(fā)生改變,如果修飾的引用數(shù)據(jù)類型,是地址值不能發(fā)生改變;final修飾的方法不能被重寫;final修飾的類不能被繼承,也稱最終類。

67.final、finally、finalized的區(qū)別?

答:(1)final是一個關(guān)鍵字,是用來修飾類,成員變量,成員方法的,

它修飾的類不能被繼承,但是可以繼承其他類,

它修飾的成員變量是一個常量,只能賦值一次

它修飾的成員方法不能被子類重寫

(2)finally是 try-catch-finally語句的一個模塊,正常情況下里邊的代碼永遠會執(zhí)行,一般是用來釋放資源的

(3)finalize是Object類中的方法,當對象變成垃圾的時候,由GC(Java中的垃圾回收機制)來調(diào)用該類的finalize()方法回收垃圾。

68.接口中的成員的特點?

答:都是常量,public static final ;方法都是抽象方法,public abstract;沒有構(gòu)造方法。

69、類與類、類與接口、接口與接口的關(guān)系?

答:類只能單繼承類,但是能夠多層次繼承;類實現(xiàn)接口,能同時實現(xiàn)多個接口,能在繼承類的同時實現(xiàn)接口;接口可以單繼承接口,也能多繼承。

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

(1)成員的特點:抽象類可以有變量、常量、構(gòu)造方法、一般方法、抽象方法;接口有且只能有常量和抽象方法。

(2)關(guān)系特點:類與類支持單繼承,不能多繼承,但是能夠多層次繼承,類與接口是實現(xiàn)關(guān)系,一個類能實現(xiàn)多個接口,一個類繼承類一個類的同時能實現(xiàn)多個接口;接口與接口之間能單繼承,也能多繼承;

(3)設(shè)計理念:抽象類定義的是該繼承體系的共性功能,是is a的關(guān)系。接口定義的是該體系的拓展功能,是like a的關(guān)系。

71.接口的思想特點?

(1)對外暴露的規(guī)則(2)接口是程序?qū)ν獾墓δ芡卣梗?)接口是用來多實現(xiàn)的(4)接口的出現(xiàn)降低了類與類之間的耦合性。

72.什么是內(nèi)部類,特點是什么?

答:在類中定義的類就是內(nèi)部類。特點(1)能夠直接訪問所在類的成員,包括私有的。(2)外部類訪問內(nèi)部類需要創(chuàng)建內(nèi)部類的對象。

73.成員內(nèi)部類是什么?

答:成員內(nèi)部類是定義在成員位置的類。能夠被私有、靜態(tài)修飾。

74.內(nèi)部類的方法如果訪問局部變量,內(nèi)部類的成員變量,外部類的成員變量?

答:局部變量可以直接訪問;內(nèi)部類的成員變量this. ??;外部類的成員變量:外部類名.this.

75.局部內(nèi)部類訪問的局部變量為什么要用final修飾?

答:因為當調(diào)用這個方法時,局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當方法彈棧,這個局部變量也會消失,那么如果局部內(nèi)部類對象還沒有馬上消失想用這個局部變量,就沒有了,如果用final修飾會在類加載的時候進入常量池,即使方法彈棧,常量池的常量還在,也可以繼續(xù)使用。但是JDK1.8以后取消了這個特性,會默認加上final的。

76.什么是匿名內(nèi)部類?

答:匿名內(nèi)部類就是沒有名字的內(nèi)部類,是內(nèi)部類的簡化形式。匿名內(nèi)部類必須繼承或?qū)崿F(xiàn)一個接口,在使用的時候直接用父類的名字創(chuàng)建一個子類對象并實現(xiàn)其中的方法,匿名內(nèi)部類的實質(zhì)是一個繼承了該類或者實現(xiàn)該接口的匿名的子類對象。

前提:必須繼承一個類或?qū)崿F(xiàn)一個接口。

規(guī)則:(1)不能是抽象的,因為它的本質(zhì)是一個子類對象。(2)不能定義構(gòu)造方法,因為沒有類名。

使用:(1)當接口中的只有一個抽象方法時,并對方法調(diào)用一次的時候(2)傳遞參數(shù)的時候,如果參數(shù)是接口或抽象類,其實需要的就是實現(xiàn)類對象或者子類對象,這個時候使用匿名內(nèi)部類。

77、匿名對象何時使用?

答:(1)當對對象方法調(diào)用一次的時候(2)可以作為實際參數(shù)進行傳遞。

78適配器模式?

當一個接口有多個抽象方法時,而我們只使用其中的一個或兩個方法時,每次使用的時候我們都要重寫這些方法,比較麻煩。我們可以定義一個類去實現(xiàn)這個接口,并重寫里面的方法,只是方法體為空,并把這個類定義為抽象類,我們使用的時候繼承這個類重寫需要的方法就就可以了。

79.四種權(quán)限修飾符的比較?

答:public的權(quán)限最大,同一類中,同一個包中,不同包中(子類),不同包中(無關(guān)類)都可以訪問。給大家使用

Protected同一類中,同一個包中,不同包中(子類),可以訪問。強調(diào)的是子類

默認同一類中,同一個包中可以訪問。強調(diào)的是同一個包

Private ??同一類中訪問。強調(diào)的是自己

80.package在第一行,只能有一個;然后是import導(dǎo)包;最后是class。

81.代碼塊的分類:

局部代碼塊:讓變量盡早的消失,節(jié)約資源,提高效率。

構(gòu)造代碼塊:用于給對象初始化;

靜態(tài)代碼塊兒:給類進行初始化,用于加載驅(qū)動。

同步代碼塊:為了防止CPU高速切換出現(xiàn)安全問題。

三、API

81.==和equals的區(qū)別?

答:“==”是比較運算符,既能比較基本數(shù)據(jù)類型,又能比較引用數(shù)據(jù)類型。基本數(shù)據(jù)類型比較的是數(shù)值,引用數(shù)據(jù)類型比較的是地址值。

equals是一個方法,只能比較引用數(shù)據(jù)類型。所有的類都會繼承Object的equals方法。重寫equals方法比較的是對象的內(nèi)容,如果沒有重寫將調(diào)研Object的equals方法,比較的是地址值。

82.String str = null 和String str = “”的區(qū)別?

答:String str = null只是聲明了引用,但是沒有創(chuàng)建對象,沒有為其開辟空間,不能操作方法。String = “”是創(chuàng)建了一個長度為0的字符串,并在內(nèi)存中分配了空間。

83.String s1=?“abc”, String s2= new String(“abc”),s1==s2結(jié)果是什么?s1.equals(s2)結(jié)果是什么?

答:s1==s2結(jié)果為false。s1指向的常量池中的對象,s2指向的是堆內(nèi)存中的對象,兩者的地址值不同。s1.equals(s2)結(jié)果是true。String重寫了equals方法,比較的是內(nèi)容。

84.String,StringBuffer、StringBuilder的區(qū)別?

答: String是一個特殊的引用數(shù)據(jù)類型,是一個長度不可變的字符序列,沒有緩沖區(qū),一旦創(chuàng)建就不會發(fā)生變化了。即使重新賦值不是在原來對象的基礎(chǔ)上改變的,而是創(chuàng)建了一個新的對象,將引用指向這個新的對象,浪費空間,效率比較低。

StringBuffer、StringBuilder是容器,是可變的字符串序列。StringBuffer是JDK1.0版本的,線程是安全的,效率比較低。StringBuilder是JDK1.5出現(xiàn)的,線程不安全,效率高。

85.StringBuilder的底層是什么?

答:底層是字符數(shù)組,原始長度為16。通過append添加元素的時候,會自動擴容,擴容規(guī)則:大字符串的長度= 小數(shù)組長度*2+2.

86.為什么出現(xiàn)基本數(shù)據(jù)類型包裝類?

答:將基本數(shù)據(jù)類型封裝為對象的好處能在對象中封裝更多的功能操作數(shù)據(jù)。

87.String 和int直接的轉(zhuǎn)換?

答:將int類型轉(zhuǎn)為String類型的方法:(1)基本數(shù)據(jù)類型+“”(2)Integer.toString(int num)(3)String.valueOf(int ?i)

將String轉(zhuǎn)為int:Integer.parseInt(String s)

88.基本數(shù)據(jù)類型包裝類的自動拆裝箱是什么?

答:是JDK1.5版本出現(xiàn)的新特性,自動裝箱就是把基本數(shù)據(jù)類型轉(zhuǎn)為為包裝類型。拆箱就是把包裝類轉(zhuǎn)換為基本數(shù)據(jù)類型。

89.Object類中的常見方法有哪些?

答:hashCode():返回值是int,是該對象的哈希瑪值。

equals():返回值是boolean,比較的是地址值。

toString():返回該對象的字符串表現(xiàn)形式。

getClass():返回值類型是Class。返回的是創(chuàng)建該對象所屬類對應(yīng)的字節(jié)碼文件。

這些方法都需要對象調(diào)用,在開發(fā)的過程中要重寫。

地址值的組成:類名@十六進制的哈希值。

90.獲取當前時間毫秒值有哪幾種方式?

答:(1)new Date().getTime();(2)System.currentTimeMillis()(3)Calendar.getInstance().getTimeInMillis()

91.正則表達式常用的;

\d 數(shù)字:[0-9]

\w 單詞字符:[a-zA-Z_0-9]

(X)表示分組

\\1表示和前面的相同

.任何字符

X? ,一次或一次也沒有

X* ,零次或多次

X+ ,一次或多次

X{n} ,恰好 n 次

X{n,} ,至少 n 次

X{n,m} ,至少 n 次,但是不超過 m 次

92.日歷類和日期類相互轉(zhuǎn)換:

Calendar c = Calendar.getInstance();??c.setTime(date);??c.getTime()

93.Date和String類型的轉(zhuǎn)換?

Date類型轉(zhuǎn)為String 是格式化:format

String轉(zhuǎn)Date是解析;parse

三、集合

94.簡述集合體系?

答:集合分為單列集合和雙列集合。

單列集合的頂層是Collection接口,包括List和Set集合。

(1.1)List集合的特點是元素可重復(fù),有序,有索引,能夠有角標操作集合,有特有的迭代方式ListIterator。包括ArrayList、LinkedList和Vector。

ArrayList集合底層采用的是數(shù)組數(shù)據(jù)結(jié)構(gòu),查詢速度比較快,因為數(shù)組有索引,在內(nèi)存中分配的空間是連續(xù)的,但是增刪比較慢。線程不同步,效率高。初始容量為10。

LinkedList集合的底層采用的是鏈表數(shù)據(jù)結(jié)構(gòu),增刪速度比較快,查詢速度比較慢。線程不同步。

Vector底層數(shù)據(jù)結(jié)構(gòu)也是數(shù)組數(shù)據(jù)結(jié)構(gòu),但是線程同步,效率低,特有取出元素的方式是枚舉。因為效率低,逐步被ArrayList替代。

(1.2) Set集合的特點元素是無序的(存入和取出的順序不一致),元素不可以重復(fù)。包括HashSet和TreeSet。

HashSet的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,線程不同步,效率高。保證元素的唯一性額有的依據(jù)是元素的hashCode和equals方法。如果hashCode不同,不調(diào)用equals方法。如果hashCode相同,才會調(diào)用equals方法判斷元素是否相同。

TreeSet的底層數(shù)據(jù)結(jié)構(gòu)是二叉樹,線程不同步,效率高。能夠給元素進行排序。保證元素唯一性的依據(jù)是compareTo和return0。排序的兩種方式:第一種元素自身實現(xiàn)Comparable接口,重寫compareTo()方法。這種排序方式叫元素的自熱排序,也叫默認排序。第二種是當元素自身不具備比較性或者具備的比較性不是所需要的,這時就讓集合自身具備比較性,當集合初始化時就有了比較性。定義一個比較器實現(xiàn)Comparator接口,重寫compare方法,定義集合的時候?qū)⒈容^器作為參數(shù)傳遞給TreeSet的構(gòu)造函數(shù),這樣集合就具有了比較性。

(2)Map是雙列集合的頂層接口,該集合存儲的是鍵值對,一對一對的往里存,而且要保證鍵的唯一性。包括Hashtable、HashMap、TreeMap。

Hashtable的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,不可以存儲null鍵和null值,線程同步,效率低。JDK1.0.

HashMap的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,可以存儲null鍵和null值,線程不同步,將Hashtable替代,JDK1.2效率高。保證鍵的唯一性的 依據(jù)是hashCode和equals方法。

TreeMap的底層數(shù)據(jù)結(jié)構(gòu)是二叉樹,線程不安全,能夠給集合中的鍵排序。

95.什么時候使用什么集合?

答:(1)首先要看是單列還是雙列,是單列的話就用Collection,雙列就用Map。

(2)要是單列的話看元素是不是要求重復(fù),元素重復(fù)的話使用List,看查詢多還是增刪多,查詢多的話用ArrayList,增刪多的話用LinkedList,不確定的話用ArrayList。不重復(fù)的話使用Set,看是否要求排序,排序的話用TreeSet,不需要排序用HashSet。不確定的話用HashSet。

(3)要是雙列的話,看是否要求排序,要求排序用TreeMap,不要求排序用HashMap,不確定的話用HashMap。

96.Collection(單列)和(Map)雙列的區(qū)別?

答:Collection是單列集合,Map是雙列集合。Map的鍵是唯一的,Collection體系中的Set集合中的元素是唯一的。Map集合的數(shù)據(jù)結(jié)構(gòu)針對鍵有效,Collection的底層數(shù)據(jù)結(jié)構(gòu)針對元素有效。

100.遍歷集合的方式有哪些?

答:遍歷List集合的方式有普通for、增強for、迭代器Iterator、列表迭代器ListIterator。

遍歷Set集合的方式有增強for、迭代器Iterator。

遍歷map集合的方式有keySet(),entrySet()。然后通過增強for、迭代器Iterator遍歷。

101.用迭代器和增強for遍歷集合,能否用集合的方法操作集合?

答:不能,會出現(xiàn)并發(fā)修改異常,ConcurrentModificationException。

并發(fā)修改異常就是在用普通迭代器的時候用集合的方法增加、刪除元素。可以用列表迭代器。

102.泛型是什么?有什么好處?

答:簡單的說一種標簽,不確定的類型,用戶使用的時候確定類型,是JDK1.5出現(xiàn)的新特性,用于解決安全問題,是一種類型安全機制。

好處:(1)將運行時期會可能出現(xiàn)的異常轉(zhuǎn)移到編譯期(2)提高了安全性。(3)避免了強制類型轉(zhuǎn)換的麻煩。

103、上限和下限?

?super E: ?E、E的父類,固定下邊界。

?extends E: E、E的子類 ?固定的上邊界。

104.字典排序,自然排序和比較器排序是什么?

答:字典排序按照字典上的順序排序。

自然排序是對強制對實現(xiàn)Comparable接口的類進行排序,實現(xiàn)Comparable接口,重寫compareTo()方法,根據(jù)返回值進行排序。

比較器排序是實現(xiàn)Comparator方法,重寫compare()方法,根據(jù)返回值進行排序。

105.TreeSet的兩種排序方式有什么區(qū)別?

答:TreeSet的構(gòu)造方法中不傳參數(shù),會按照類的Comparable排序,沒有的話就會報錯。TreeSet傳入比較器,會按照比較器排序。

106.Map有哪些取出元素的方式?原理是什么?

答:keySet():將Map集合中的鍵取出放在Set集合,然后通過遍歷Set集合取出里面的鍵,再用map的get(key)方法取出對應(yīng)的值。

entrySet()將Map集合中的鍵值對關(guān)系取出放在Set集合,然后通過遍歷Set集合取出里面的鍵值對關(guān)系,然后通過entry的getKey()和getValue()方法取出元素。

107.Collections 和 collection的區(qū)別?

答:Collections是用來操作集合的工具類,它是個類;collection是單列集合的頂層接口。

108:

*棧和隊列:

隊列結(jié)構(gòu):先進先出的規(guī)則

棧結(jié)構(gòu):先進后出規(guī)則

*鏈表和數(shù)組的區(qū)別:

數(shù)組:一塊連續(xù)的存儲區(qū)域

鏈表結(jié)構(gòu):每個元素指向下一個元素

四、異常

109.異常體系概述?

答:Throwable類

|--Error:無法通過處理解決的錯誤

|--Exception:

|--編譯時異常:就是在編譯程序生成.class文件時產(chǎn)生的異常,這種異常必須處理,要么拋出,要么捕獲,否則編譯無法通過

|--運行時異常:編譯時期不會出現(xiàn),只有在運行時才產(chǎn)生,這種異常,可以處理,也可以不處理,可以聲明,也可以不聲明

110.異常處理有哪些方式?

答(1)捕獲處理try{}catch{} ???try{}catch{}finally{} ???try{}finally{}

(2)聲明拋出

111.運行異常和編譯異常的區(qū)別?

答:所有的RumtimeException類及其子類的實例是運行異常,其他異常時編譯異常。編譯異常必須顯式處理,否則會編譯失敗。運行時異常可以不處理,可以通過編譯。

112.throw和throws的區(qū)別?

答:throws是在方法聲明后面,用來聲明異常,后面跟的異常類名;可以跟多個異常類名,用逗號隔開;表示拋出異常,需要由調(diào)用者處理。

Throw定義在方法體內(nèi),跟的異常對象名;只能跟一個異常對象。

113.子父類間異常的注意事項?

答:(1)子類繼承父類時,父類方法拋出了異常,子類重寫該方法時只能拋出相同的異常或者該異常的子類。

(2)如果父類拋出了多個異常,子類在重寫方法時只能拋出相同的異常或者他的子集,不能拋出父類沒有的異常。

(3)如果父類沒有拋出異常,子類重寫該方法時不能拋出異常。如果子類出現(xiàn)了異常,只能進行try處理,不能拋出。

114.異常處理的注意事項:

(1)子類不能出現(xiàn)父類沒有的異常

(2)如果父類沒有拋出異常,子類重寫該方法時不能拋出異常。如果子類出現(xiàn)了異常,只能進行try處理,不能拋出。

(3)功能內(nèi)部如果出現(xiàn)異常,如果內(nèi)部可以處理,就用try。如果功能內(nèi)部處理不了,就必須聲明出來,讓調(diào)用者處理。

116.JVM是如何處理異常的?

先自己處理,處理不了交給調(diào)用者處理。

五、IO

117.遞歸的注意事項?

答:1.遞歸必須要有出口,否則是死遞歸,造成棧內(nèi)存溢出。2.遞歸不能多層次調(diào)用,否則會造成棧內(nèi)存溢出。3.構(gòu)造方法不能遞歸調(diào)用。

117.路徑的分類?

答:分為相對路徑和絕對路徑。絕對路徑是相對盤符而言的;相對路徑相對的是工程。

118.集合的頂層是什么?IO的頂層是什么?

答:集合的頂層是接口。IO的頂層的是抽象類。

119.什么IO流?

用來在硬盤和內(nèi)存直接交換數(shù)據(jù)的。

120:簡述IO的分類?

答:按照流向分輸入流和輸出流。

按照操作分為字節(jié)流和子字符流。

字節(jié)流能操作任意類型的文件,如果操作文本,可能會出現(xiàn)亂碼。分為字節(jié)輸出流和字節(jié)輸入流。

字符流只能操作純文本文件,分為字符輸入流和字符輸出流。

121.為什么read()方法返回值是int類型?

答:為了防止中間出現(xiàn)11111111(-1的反碼)這樣的數(shù)據(jù),后面的內(nèi)容就讀不到了。

122.字符流通往字節(jié)流的橋梁是什么?字節(jié)流通往字符的橋梁是什么?

答:字符流通往字節(jié)流的橋梁是OutputStreamWriter;字節(jié)流通往字符流的橋梁是InputstreamReader。

123.標準輸入流和輸出流是什么?

答:標準輸入流的是System.in。標準輸出流是System.out.

124.高效字符流的方法?

ReadLine()讀不到\r\n

newline()針對當前操作系統(tǒng)換行

125.字節(jié)輸入流read()一次讀取的一個字節(jié),返回的字節(jié)的對應(yīng)的ASCII值。

126.字符緩沖流和字節(jié)緩沖流的緩沖區(qū)的默認大小是多少?

答:字符緩沖流緩沖區(qū)默認的大小是8192個字符,16kb。

字節(jié)緩沖流緩沖區(qū)默認的大小是8192個字節(jié),8kb。

Writer的2kb。

127.close()和flush()的區(qū)別:

答:flush()方法是來刷新緩沖區(qū)的,刷新之后還可以再次寫出。

Close()是用來關(guān)閉流釋放資源的,如果是帶緩沖區(qū)的流對象關(guān)閉流之前還會刷新緩沖區(qū),關(guān)閉之后無法寫出。

六、網(wǎng)絡(luò)編程

128.什么是網(wǎng)絡(luò)編程?

答:網(wǎng)絡(luò)編程又叫套接字編程,Socket編程,就是用來實現(xiàn)網(wǎng)絡(luò)互連的不同計算機上運行程序之間可以進行數(shù)據(jù)的交換。大白話來講:就是用java語言來實現(xiàn)網(wǎng)絡(luò)上不同計算機的通信。

129.網(wǎng)絡(luò)編程的三要素?

答:IP地址、端口、協(xié)議。

IP的組成網(wǎng)關(guān)和主機地址。127.0.0.1回環(huán)地址 ??255.255.255.255廣播地址

130.端口的范圍是什么?哪個范圍的端口不能用,為什么?

答:端口的范圍是0——65535. ??0——1024這個范圍的端口不能使用,因為已經(jīng)被系統(tǒng)占用或者作為保留端口。

131.TCP和UDP協(xié)議的區(qū)別?

答:TCP是面向有連接的,三次握手機制;傳輸?shù)臄?shù)據(jù)無大小限制;安全(可靠)協(xié)議;效率低;區(qū)分客戶端和服務(wù)器。

UDP是面向無連接的,發(fā)送的數(shù)據(jù)是通過數(shù)據(jù)報包的形式,不超過64k;不安全(可靠)協(xié)議,效率高;不區(qū)分客戶端和服務(wù)器。(叫發(fā)送端和接收端)

132.Socket通信的原理是是什么?

答:通信的兩端都有獨有的Socket,Socket通信就是使用TCP或者UDP協(xié)議通過IO流在兩個Socket間進行通信。

七、多線程

133.繼承和線程?

進程是一個正在執(zhí)行中的程序,每一個程序都至少有一個執(zhí)行順序,該順序是一個路徑,或者叫一個控制單元。

線程是進程中的一個獨立的控制單元,線程在控制著進程的執(zhí)行,是進程的執(zhí)行路徑。

進程:正在運行的程序

線程:進程的執(zhí)行單元,執(zhí)行路徑。

多線程:進程有多條執(zhí)行路徑,每個執(zhí)行路徑就是線程。

134.多線程并發(fā)和多線程并行是什么呢?

答:兩個或者多個任務(wù)發(fā)送請求時,CPU只能執(zhí)行一個,就會安排這些任務(wù)交替執(zhí)行,由于CPU做著高速的切換,間隔的時間比較短,我們看起來像同時執(zhí)行的,這就是多線程并發(fā)。

并行是兩個或多個任務(wù)同時執(zhí)行,前提是多核CPU。

135.多線程的執(zhí)行原理?

答:CPU在做著高速的切換。

136. 線程的執(zhí)行具有隨機性和延遲性。

137.線程的默認命名規(guī)則?

答:Thread-編號,編號是從0開始的。

138.線程的優(yōu)先級的范圍是多少?默認的優(yōu)先級是?

答:線程的優(yōu)先級范圍是1——10。默認的優(yōu)先級是5.

139.Java程序的啟動原理?

答:JVM啟動一個主線程,再由主線程調(diào)用某個類的main方法。

140.Java程序是多線程的嗎?

答:是的,至少開啟了一個主線程和負責(zé)垃圾回收的線程。

141.線程的優(yōu)先級越高,代表這個線程一定是第一個執(zhí)行的嗎?

答:不是的,線程的優(yōu)先級越高代表著在一定程度上讓該線程獲取更多的執(zhí)行機會。

142.線程的兩種實現(xiàn) 方式的區(qū)別?

答:繼承Thread類:好處是:因為是繼承,代碼簡單,能夠直接使用Thread類的方法。確定是:擴展性比較差,因為繼承了Thread類,不能再繼承其他的類。

實現(xiàn)Runnable接口:好處是擴展性比較強。缺點時:代碼比較冗余,因為不是繼承Thread類,無法直接使用thread中的方法。

143.同步代碼塊和同步方法的鎖是誰?

答;同步代碼塊的鎖可以是任意類型的對象;非靜態(tài)同步方法的鎖是this;靜態(tài)方法的鎖是該類的字節(jié)碼文件。

144.實現(xiàn)Runnable和Callable的區(qū)別?

答:實現(xiàn)Runnable接口的run方法沒有返回值,不能拋異常;而實現(xiàn)Callable接口的call方法可以拋異常,有返回值。

Runnable接口的實現(xiàn)類對象既可以作為參數(shù)傳遞給Thread的構(gòu)造方法,也可以用線程池submit的參數(shù);Callable接口的實現(xiàn)類對象只適應(yīng)于線程池。

145.線程的生命周期(線程的五種狀態(tài))是什么?

答:新建、就緒、運行(運行的時候可能阻塞)、死亡。

線程的六種狀態(tài):新建、就緒、運行(運行的時候可能阻塞或者等待)、死亡。

146.sleep和wait的區(qū)別?

答:(1)sleep是讓線程睡眠,必須給相應(yīng)的睡眠時間,不需要喚醒,時間到了會自動醒來,休眠時不放棄Cpu的執(zhí)行權(quán)。

(2)wait的是讓線程等待,可以傳參也可以不傳參,傳參是在指定的時間后等待,需要被喚醒。等待的時候放棄cpu的執(zhí)行權(quán)。

147.什么時候會出現(xiàn)安全性?

多線程,并發(fā),操作同一數(shù)據(jù)。

148.為什么wait()和notify()定義在Object中?

答:因為鎖對象可以是任意類型的對象。

149.什么情況下需要同步?

當多線程并發(fā), 有多段代碼同時執(zhí)行時, 我們希望某一段代碼執(zhí)行的過程中CPU不要切換到其他線程工作. 這時就需要同步.

如果兩段代碼是同步的, 那么同一時間只能執(zhí)行一段, 在一段代碼沒執(zhí)行結(jié)束之前, 不會執(zhí)行另外一段代碼.

八、模擬湯姆貓服務(wù)器

150.BS結(jié)構(gòu)和CS的區(qū)別?

答:CS結(jié)構(gòu)是指客戶端和服務(wù)器端,開發(fā)比較容易,因為用戶的應(yīng)用程序都在客戶端,降低了系統(tǒng)通壓力,但是維護比較困難。

BS結(jié)構(gòu)是指瀏覽器服務(wù)器端,開發(fā)比較困難,因為應(yīng)用程序基本都在服務(wù)器端,維護比較方便。

151. 靜態(tài)資源和動態(tài)資源是什么?

答:靜態(tài)資源是Web頁面給人們看到的數(shù)據(jù)是始終不變的,例如html。

動態(tài)資源是Web頁面給人們看的數(shù)據(jù)是系統(tǒng)自動生成的,隨時變化的。例如JSP/Servlet、ASP、PHP

在JAVA,動態(tài)Web資源開發(fā)技術(shù)通稱Javaweb。

152.常用的狀態(tài)碼你知道哪些?

答:200 ?請求成功;404 ?請求的資源不存在;500 ?服務(wù)器發(fā)生未知的錯誤。

153.GET請求和POST請求的區(qū)別?

答:GET請求會將請求信息置于地址欄,不安全,適合小數(shù)據(jù)的傳輸。

POST請求將請求信息置于請求體,相對安全,適合大數(shù)據(jù)的傳輸。

154.客戶端向服務(wù)器發(fā)送請求request,服務(wù)器對客戶端的請求做出響應(yīng)response。

http協(xié)議是互聯(lián)網(wǎng)的通用協(xié)議(規(guī)則),客戶端和服務(wù)端都要遵循這個協(xié)議。默認端口號是80.

155.請求信息包括什么?響應(yīng)信息包括什么?

答:請求頭和請求體。請求頭又包括請求行和頭信息。

響應(yīng)信息包括響應(yīng)頭和響應(yīng)體。

九.數(shù)據(jù)庫

156.為什么要有數(shù)據(jù)庫?常見的數(shù)據(jù)你知道哪些?

答:為了永久存儲數(shù)據(jù),并且能夠操作數(shù)據(jù)。

MySQLSQL ServerOracle

157.數(shù)據(jù)庫的本質(zhì)是什么?

答;數(shù)據(jù)庫的本質(zhì)是一個文件系統(tǒng)。

158.數(shù)據(jù)庫以什么為單位存儲數(shù)據(jù)?

數(shù)據(jù)庫中以表為組織單位存儲數(shù)據(jù)。

159.常用的SQL語句?

create ?database 數(shù)據(jù)庫名; ????創(chuàng)建數(shù)據(jù)庫

show databases; ???????????????查看所有數(shù)據(jù)庫

use 數(shù)據(jù)庫名; ????????????????使用指定數(shù)據(jù)庫

create table 表名( ???????????創(chuàng)建表

列名1 ?數(shù)據(jù)類型 約束,

列名2 ?數(shù)據(jù)類型,

列名3 ?數(shù)據(jù)類型,

...

列名n ?數(shù)據(jù)類型 ???--不加,

insert into 表名(列名1,列名2,.列名n) values (值1,值2...);添加數(shù)據(jù)

delete from 表名 where 條件刪除指定條件的數(shù)據(jù)

update 表名 set 字端1 = 值1,字端2=值2 ?where 條件; 修改指定數(shù)據(jù)

select 字段1,字段2,...from 表名; ?????按照表中的字段名查詢:

select * from 表名;查詢表中所有字段

order by ??排序

group by ??分組:

160.聚合函數(shù)?

count、sum、max、min、avg

161.JDBC的核心功能是什么?

答:連接數(shù)據(jù)庫;向數(shù)據(jù)庫發(fā)送SQL語句;操作SQL語句的返回結(jié)果。

162.DBUtils能否創(chuàng)建數(shù)據(jù)庫和表?

答:不能,只能操作數(shù)據(jù)庫里面的數(shù)據(jù)。

163.SQL語言的分類?

答:SQL語言是JAVA操作數(shù)據(jù)庫的語言。分為DDL(Data Definition Language)數(shù)據(jù)定義語言;DML(Data manipulation Language)數(shù)據(jù)操作語言(增刪覆蓋);DCL(Data Control Language)數(shù)據(jù)控制語言;DQL(Data Query Language)數(shù)據(jù)查詢語言。

164.SQL注入的問題產(chǎn)生原因和解決方法?

答:SQL注入是因為客戶輸入的是SQL語句。可以使用PreparedStatement接口的子類對象。

165.連接池?

答:數(shù)據(jù)庫連接的建立和關(guān)閉都是極其消耗資源的。數(shù)據(jù)庫連接池的解決方案是當應(yīng)用程序啟動時,系統(tǒng)主動創(chuàng)建足夠的數(shù)據(jù)庫連接,并將這些連接組成一個連接池,每次使用的時候無序重新創(chuàng)建聯(lián)系,直接從連接池中取出已有的連接使用,使用完后不再關(guān)閉數(shù)據(jù)庫連接,而是直接歸還到連接池。通過連接池,將極大的提高了程序的運行效率。

1、面向?qū)ο蟮睦斫?/p>

面向?qū)ο笫腔诿嫦蜻^程的。在開發(fā)過程中,要完成特定的功能就去找相應(yīng)的對象,如果找不到就創(chuàng)建相應(yīng)的對象,使用對象,維護完善對象。

2、面向?qū)ο蠛兔嫦蜻^程的區(qū)別

面向過程強調(diào)的是功能行為;

面向?qū)ο髮⒐δ芊庋b成對象,強調(diào)的是具備功能的對象

3、abstract與哪些關(guān)鍵字不能共存為什么

private:私有的方法是不可見的,無法被復(fù)寫

final:被final修飾的方法是最終方法,無法被復(fù)寫

static:被static修飾的方法,要隨類

加載到方法區(qū),由于抽象方法沒有方法體所以不能加載

4、static的特點

隨著類的加載而加載;優(yōu)先于對象存在;被所有對象所共享;可以直接被類名所調(diào)用。

靜態(tài)方法只能訪問靜態(tài)成員,非靜態(tài)方法既可以訪問靜態(tài)也可訪問非靜態(tài)

靜態(tài)方法中不可以定義this、super關(guān)鍵字,因為靜態(tài)優(yōu)先于對象存在,所以靜態(tài)方法中不可以出現(xiàn)this;

5、類與類、類與接口、接口與接口的關(guān)系

繼承,繼承或?qū)崿F(xiàn),繼承

6、final、finally、finalize的區(qū)別

final:可以修飾類、方法和變量,被final修飾的類無法被繼承,方法無法被復(fù)寫,變量為常量只能賦值一次

finally:異常處理trycatch時使用,可以添加也可以不添加,用于執(zhí)行一些必須執(zhí)行的代碼,如關(guān)閉資源等

finalize:Object類中的方法,其中定義了對象要被垃圾收集器回收之前要做的相關(guān)的清理工作

7、什么是多態(tài),多態(tài)的好處和弊端

多態(tài)可以理解為事物存在的多種體現(xiàn)形態(tài)。父類的引用指向了自己的子類對象;父類的引用也可以接收自己子類的對象。

好處:提高了代碼的擴展性

弊端:父類的引用只能訪問父類中有的成員(父類引用無法調(diào)用子類中特有的方法)

8、wait()和sleep()的區(qū)別

(1)wait是Object類中的方法,sleep是Thread類中的方法

(2)sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

(3)wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用

(4)sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

9、網(wǎng)絡(luò)編程的三要素

(1)IP:網(wǎng)絡(luò)中設(shè)備的標識

(2)端口:用于標識設(shè)備中接收數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用程序具體是哪一個,有效端口0~65535,0~1024為系統(tǒng)端口及保留端口

(3)傳輸協(xié)議:UDP和TCP協(xié)議,信息通訊的規(guī)則

10、UDP和TCP的區(qū)別

UDP:不需要建立連接,是不可靠協(xié)議,將數(shù)據(jù)及源和目的封裝到數(shù)據(jù)報中,每個數(shù)據(jù)報限制在64k以內(nèi),發(fā)送數(shù)據(jù)較少,速度快

TCP:通過三次握手建立連接通路,是可靠協(xié)議,可進行大量的數(shù)據(jù)傳輸,效率較低

11、什么是暴力反射

我們知道java的特性之一就是封裝,將對象的屬性和具體實現(xiàn)隱藏起來,只對外提供公共方法訪問,private修飾的內(nèi)部屬性和方法對我們是不可見的。

我們通過正常的方法是無法獲取以及修改的,可是通過反射卻可以強制獲取并做一些修改,這就破壞了封裝性,這就是所謂的暴力反射

12、反射獲取字節(jié)碼對象方式、創(chuàng)建對象的兩種方式

獲取字節(jié)碼方式三種:

(1)類名.class,例如:System.class

(2)對象.getClass(),例如:new Date().getClass();

(3)Class.forName("類名"),例如:Class.forName("java.util.Date");

創(chuàng)建對象的兩種方式:

(1)直接用字節(jié)碼創(chuàng)建對象,只能調(diào)用默認的構(gòu)造方法:字節(jié)碼.newInstance();

(2)獲取構(gòu)造方法Constructor,然后調(diào)用構(gòu)造方法創(chuàng)建,可以通過參數(shù)不同調(diào)用不同的構(gòu)造方式

13、怎么理解反射,反射的應(yīng)用

反射就是把Java類中的各種成分映射成相應(yīng)的Java類。

一般情況下我們要解決某個問題,先找到相關(guān)的類,創(chuàng)建該類的對象,然后通過該對象調(diào)用對應(yīng)的方法來解決問題。

反射是一個正好相反的過程,開始可能并沒有類可以解決這個問題,而我們卻先用一個當時可能并不存在的方法解決了這個問題,后來才有的這個類。

這其實就是框架的原理,現(xiàn)有的框架再有的解決問題的類。框架描述了整體,制訂了功能方法的規(guī)范,具體的實現(xiàn)之后按照這個規(guī)范編寫。這些都需要靠反射來完成。

使用框架有良好的擴展性,某部分功能的優(yōu)化不需要涉及程序整體,只需要修改特定的部分就好了,然后通過配置文件,獲取對應(yīng)的類名,就可以了。

14、對匿名內(nèi)部類的理解

匿名內(nèi)部類其實是內(nèi)部類的簡寫形式。

內(nèi)部類是定義在類中的類,就好比我們?nèi)祟悾覀內(nèi)祟惗加行呐K,而心臟又有自己獨特組成,可以把心臟也抽象成一個類。

這個心臟類就是人類的內(nèi)部類。如果要研究某一種心臟疾病,需要一個實例時,我們不需要知道這個患病的心臟到底是誰的,那找到的這個就是匿名的。

匿名內(nèi)部類必須要繼承一個類或?qū)崿F(xiàn)一個接口,在使用時直接父類或接口的名稱創(chuàng)建了一個子類對象并實現(xiàn)其中的方法,匿名內(nèi)部類其實是一個匿名的子類對象。

15、IO體系

字節(jié)流InputStream/OutputStream

|--FileInputStream/FileOutputStream:文件字節(jié)流,用于文件的讀寫操作

|--BufferedInputStream/BufferedOutputStream:加緩沖區(qū)的字節(jié)流,用于提高效率

字符流Reader/Writer

|--FileReader/FileWriter:文件字符流,用于文本文件的讀寫操作

|--BufferedReader/BufferedWrite:加緩沖區(qū)的字符流,用于提高效率

轉(zhuǎn)換流InputStreamReader/OutputStreamWriter:是字節(jié)流和字符流之間的橋梁

配置文件Properties

16、集合體系

|--Collection

|--List:元素是有序的,元素允許重復(fù),因為該集合體系都具有索引

|--ArrayList:底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢速度快,增刪操作較慢,線程不同步

|--LinkedList:底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢效率較低,增刪操作快,線程不同步

|--Vector:功能同ArrayList類似,底層也是數(shù)組,不同是線程是同步的,效率較低

|--Set:元素是無序的,元素不允許重復(fù),底層用到了Map

|--HashSet:底層hash表,存儲的對象最好復(fù)寫hashCode和equals方法,保證元素不會重復(fù)

|--TreeSet:底層二叉樹,存儲的對象具備比較性,有兩種方法

|--Map:數(shù)據(jù)是以鍵值對的形式存儲的,有的元素存在映射關(guān)系就可以使用該集合,元素不允許重復(fù)

|--HashMap:允許有null鍵或值,線程不同步

|--TreeMap

|--HashTable:類似HashMap,不允許有null鍵或值,線程同步

17、線程的創(chuàng)建方式,進程線程的理解繼承Thread或?qū)崿F(xiàn)Runnable

兩種:進程是一個執(zhí)行中的程序,每一個程序都至少有一個執(zhí)行順序,該順序是一個路徑,或者叫一個控制單元。

線程是進程中的一個獨立的控制單元,線程在控制著進程的執(zhí)行。

18、局部變量和成員變量區(qū)別

成員變量:作用于整個類中,隨對象存儲在堆內(nèi)存中,生命周期跟對象一樣

局部變量:作用于方法或語句中,方法或語句結(jié)束則生命周期結(jié)束,存放在棧內(nèi)存中。

19、同步函數(shù)與同步代碼塊的區(qū)別

它們的作用都是封裝多條操作共享數(shù)據(jù)的語句,只能讓一個線程都執(zhí)行完,在執(zhí)行過程中,其他線程不可參與進來。

同步代碼塊:位置比較靈活,封裝了操作共享數(shù)據(jù)的語句,多個線程中只有持有鎖的才可以操作共享數(shù)據(jù),需要指定一個對象作為鎖

同步方法:聲明方法時加synchronized關(guān)鍵字修飾,同步函數(shù)使用的鎖是this,持有鎖的線程調(diào)用這個方法時其他線程無法調(diào)用。

20、數(shù)組和集合的區(qū)別

數(shù)組可以存儲基本數(shù)據(jù)類型和對象,它是一個線性的序列,可以快速的訪問其中的元素。數(shù)組創(chuàng)建之后,容量就固定了,而且在其生命周期里是不能改變的

集合只用于存儲對象,集合的長度是可變的,集合可以存儲不同類型的對象。集合的長度并不是固定的,可以便捷的添加刪除。能夠更加便捷的操作元素,功能更加強大

21、StringBuffer和StringBuilder的區(qū)別

StringBuffer是線程安全的,StringBuilder是線程不安全的,所以效率比起來StringBuilder要比StringBuffer快。

一般單線程的程序使用StringBuilder比較好,多線程的情況下可以自己加鎖,也可以直接使用StringBuffer

22、String和StringBuffer區(qū)別

String對象一經(jīng)創(chuàng)建就不會發(fā)生變化了,即便是賦新值也不是在原對象的基礎(chǔ)上改變,而是創(chuàng)建一個新的字符串對象,將引用指向這個新的對象,會造成空間的浪費,效率較低

StringBuffer只創(chuàng)建一個對象,是在同一個實例的基礎(chǔ)之上追加,效率更高,當需要用到String的時候toString就可以了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,764評論 18 399
  • 前言:最近感冒的不太想去面試,在家就對Java se的基礎(chǔ)做了一些小總結(jié) 1.JDK和JRE的區(qū)別 一 基礎(chǔ)知識 ...
    AntCode閱讀 1,140評論 0 1
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,687評論 0 11
  • 生命里有很多事和人自己不曾遇見,五天四晚的三峽游輪之旅讓我感受到了生活的絢爛。 我們乘坐的“凱娜號”游輪是美國...
    飛馳的風(fēng)閱讀 586評論 4 2
  • 有故事的背影 今天周五,馬上周末了上午路過通州西上園附近遇到這兩位女孩我問女孩兒能不能拍攝幾張背影并請她們伸出5跟...
    修車師傅老胡閱讀 274評論 0 0