前言:最近感冒的不太想去面試,在家就對(duì)Java se的基礎(chǔ)做了一些小總結(jié)
1.JDK和JRE的區(qū)別
一 基礎(chǔ)知識(shí)
答:JDK是java語(yǔ)言開(kāi)發(fā)工具包,包含JRE和開(kāi)發(fā)工具(javac.exe等);JRE是java語(yǔ)言的運(yùn)行環(huán)境,包含JVM和核心類庫(kù);JVM是java虛擬機(jī),保證了java的跨平臺(tái)性。
2.JVM跨平臺(tái)嗎?
答:JVM不具有跨平臺(tái)性,不同的操作系統(tǒng)所對(duì)應(yīng)的JVM不一樣。正是因?yàn)镴VM的不跨平臺(tái),才能夠使java語(yǔ)言具有跨平臺(tái)性。
3.保留字是什么?
答:保留字是還未使用的關(guān)鍵字,可能在java以后的版本中使用。有g(shù)oto和const。
4.java語(yǔ)言的特點(diǎn)?
答:完全面向?qū)ο螅缙脚_(tái)性,開(kāi)源,簡(jiǎn)單易學(xué),安全可靠,高性能,分布式處理,多線程,健壯性,多態(tài)。
5.main是關(guān)鍵字嗎?
答:不是的。main是主函數(shù)的名字,能夠被虛擬機(jī)識(shí)別,是程序執(zhí)行的入口。
6.path和classpath的區(qū)別?
答:path環(huán)境變量配置的是可執(zhí)行文件.exe的執(zhí)行路徑;能夠在不同盤(pán)符下訪問(wèn)path路徑下的可執(zhí)行文件。Classpath配置的java語(yǔ)言編譯后生成的字節(jié)碼文件的執(zhí)行路徑。
7.計(jì)算機(jī)最基本的存儲(chǔ)單位是:字節(jié)(byte)
計(jì)算機(jī)能直接識(shí)別的進(jìn)制是:二進(jìn)制
8進(jìn)行運(yùn)算的時(shí),變量和常量有什么區(qū)別?
答:變量在運(yùn)算過(guò)程中的值是變化的,可以被多次賦值。常量則是固定的。
9標(biāo)識(shí)符的組成?以及命名規(guī)則?
答:標(biāo)識(shí)符有26個(gè)字母的大小寫(xiě),0到9,_和$組成。
命名規(guī)則:不能使用關(guān)鍵字,不能數(shù)字開(kāi)頭,嚴(yán)格區(qū)分大小寫(xiě),要見(jiàn)名知義。
函數(shù)名和變量名如果是多個(gè)單詞組成,第一個(gè)單詞的首字母小寫(xiě),其余首字母大寫(xiě)。
類名和接口名如果是多個(gè)單詞組成,首字母全部大寫(xiě)。
包名全部小寫(xiě)。
常量名全部大寫(xiě),如果是多個(gè)單詞,用_隔開(kāi)。
10.變量數(shù)據(jù)類型分為哪幾種?如何使用變量?
答:基本數(shù)據(jù)類型:整形:包括byte、short、int、long。浮點(diǎn)型:包括float、doble。
字符型;char;布爾型:boolean。
引用數(shù)據(jù)類型:數(shù)組、類、接口。
變量需要先定義,再賦值,才能使用。
11.常量分為哪幾種?
答:自定義常量和字面值常量。自定義常量是我們自己通過(guò)final修飾定義的常量。字面值常量包括整數(shù)、小數(shù)、布爾、字符、字符串。
12.byte的范圍多少?char的范圍多少?
答:byte范圍-128到127。char范圍0到65535.
13. ASCII碼表中字符'0', 'a' , 'A'分別對(duì)應(yīng)int類型的值是多少.
答:0在表中對(duì)應(yīng)的值是48,a對(duì)應(yīng)的是97;A對(duì)應(yīng)的是65.
14.long是8個(gè)字節(jié),float是4個(gè)字節(jié),為什么long比f(wàn)loat小?
答:底層采用的運(yùn)算規(guī)則不一樣。
15.以取值范圍的大小排列數(shù)據(jù)的基本類型.
答:double>float>long>int>char>short>byte
16.+=、-=、這些運(yùn)算符內(nèi)隱含了強(qiáng)制類型轉(zhuǎn)換。
17.++和—的使用?
答:?jiǎn)为?dú)使用的時(shí)候,在前在后都一樣。
參與運(yùn)算的時(shí)候,在前是先自加或者自減,然后再用這個(gè)結(jié)果參與運(yùn)算。在后是先參與運(yùn)算,再進(jìn)行自加或者自減。
18.邏輯或" | "和 短路或" || "有什么區(qū)別?
答:|不管前面的結(jié)果是真是假后面的都會(huì)運(yùn)算,||前面為真后面的不參與運(yùn)算。但是結(jié)果是一樣的。
19.邏輯與"&"和 短路與"&&"由什么區(qū)別?
答:&不管前面的結(jié)果是真是假后面的都會(huì)運(yùn)算,&&前面為假后面的不參與運(yùn)算。但是結(jié)果是一樣的。
20.Math.round原理是什么?
答:先加0.5,然后再取floor值。
21.生成隨機(jī)數(shù)的方法?
答:第一種:Random類中的方法;第二種Math.random()方法,生成的是0.0和1.0范圍直接的小數(shù)。
22.if…else..和三元表達(dá)的區(qū)別
答:能用三元表達(dá)式寫(xiě)的就能用if語(yǔ)句寫(xiě),但是能用if語(yǔ)句寫(xiě)的,三元表達(dá)式不一定能寫(xiě)。三元表達(dá)式必須要有一個(gè)結(jié)果。
23.while、do while、for的區(qū)別?
答:do while語(yǔ)句是先性后判斷,while和for先判斷后執(zhí)行。
for循環(huán)結(jié)束后,其中定義的初始化條件不能再使用。
24.if和switch區(qū)別?
答:if?1.?對(duì)具體的值進(jìn)行判斷,?2.?對(duì)區(qū)間判斷,3.?對(duì)運(yùn)算結(jié)果是boolean類型的表達(dá)式進(jìn)行判斷。
switch:?1.?對(duì)具體的值進(jìn)行判斷。2.?值的個(gè)數(shù)通常是固定的
25.switch語(yǔ)句的表達(dá)式可以放什么?
答:byte、short、int、char。JDK1.5以后可以使用枚舉,1.7之后可以使用String。
26.死循環(huán)的兩種寫(xiě)法.
答:while(true)和for(;;)
27.break和continue的區(qū)別
答:
ch語(yǔ)句中。Continue是提前結(jié)束本次循環(huán),進(jìn)入下次循環(huán)。Return是結(jié)束方法。
28.switch中break可以省略嗎?default可以省略嗎?
答:break在最后一個(gè)可以省略,其他的不要省略。Default可以省略。
29:方法重載和方法重寫(xiě)的區(qū)別?
答:方法重載是在同一個(gè)類中出現(xiàn)同名方法,參數(shù)列表不同,與返回值類型無(wú)關(guān)。
方法重寫(xiě)是在子父類間,子類出現(xiàn)和父類聲明完全相同的方法時(shí),就成為方法重寫(xiě)。重寫(xiě)要求返回值必須相同或者有子父類關(guān)系。
30.方法的注意事項(xiàng):
答:要明確方法的返回值類型,明確方法的參數(shù)列表。
31.方法的調(diào)用?
答:有返回值時(shí)可以單獨(dú)調(diào)用,但是沒(méi)有意義;也可以放在輸出語(yǔ)句中;可以賦值給變量。無(wú)返回值直接調(diào)用即可。
32.數(shù)組的定義格式?
答:int[] arr =newint[5];int arr[]= new int[5];
int[] arr = newint[]{1,5,6,7,…} int[] arr = {23,6,8,9…}
二維數(shù)組
String[][] arr = new String[3][];
Syso(arr[0])打印的結(jié)果是null。
33.數(shù)組的默認(rèn)值?
答;整形的默認(rèn)值是0,引用數(shù)據(jù)類型是null;boolean型的是false。
34.棧內(nèi)存和堆內(nèi)存?
答:棧內(nèi)存用于存儲(chǔ)局部變量和代碼的執(zhí)行,堆內(nèi)存中都是new出來(lái)的。
35.數(shù)組和集合的區(qū)別:
(1)長(zhǎng)度區(qū)別:數(shù)組長(zhǎng)度是固定的;集合長(zhǎng)度可變。
(2)存儲(chǔ)內(nèi)容:一個(gè)數(shù)組只能存儲(chǔ)同一種數(shù)據(jù)類型的元素;集合可以存儲(chǔ)不同數(shù)據(jù)類型的元素。
(3)數(shù)據(jù)類型:數(shù)組能夠存儲(chǔ)基本數(shù)據(jù)類型,也能夠存儲(chǔ)引用數(shù)據(jù)類型;集合只能存儲(chǔ)引用數(shù)組類型。
36.數(shù)組和集合的轉(zhuǎn)換?
答:數(shù)組轉(zhuǎn)為集合:Arrays.asList(數(shù)組),轉(zhuǎn)為集合后不能添加、刪除元素。但是可以修改元素。把基本類型的數(shù)組轉(zhuǎn)為集合,把這個(gè)數(shù)組作為對(duì)象存入集合中。
集合轉(zhuǎn)為數(shù)組:list.toArray().
二、面向?qū)ο?/p>
37.局部變量和成員變量的區(qū)別:
(1)定義位置不同:成員變量定義在類中方法外,局部變量定義在方法內(nèi)。
(2)作用范圍不同:成員變量在整個(gè)類中有效,局部變量在所在的方法有效。
(3)內(nèi)存位置不同:成員變量隨著對(duì)象的創(chuàng)建存放在堆內(nèi)存中,局部變量存放在棧內(nèi)存中。
(4)初始化值不同:成員變量是有默認(rèn)的初始化的值的;局部變量不賦值不能用。
(5)生命周期不同:成員變量隨著對(duì)象的存在而存在,隨著對(duì)象的消失而消失;局部變量隨著方法的調(diào)用而存在,方法調(diào)用完畢而消失。
38.變量的使用順序?
答:就近原則。先在局部找,局部找不到在本類中找,本類找不到就去父類找,找不到就編譯失敗。
39.類和對(duì)象的關(guān)系?
答:類是具有相同或相似一類事物的抽象;對(duì)象是類的實(shí)例化。
40.java描述事物最基本的單位?
答:類
41.什么叫面向?qū)ο螅?/p>
答:面向?qū)ο笫且环N思想,它是基于面向過(guò)程的,強(qiáng)調(diào)的是具備功能的對(duì)象,讓對(duì)象調(diào)用方法解決問(wèn)題。在開(kāi)發(fā)中,要完成特定的功能就去尋找相應(yīng)的對(duì)象,如果找不到就創(chuàng)建對(duì)象,使用對(duì)象,維護(hù)完善對(duì)象。
自己舉例說(shuō)明:廚師做飯,女朋友洗衣服。。。。。
思想特點(diǎn):1.讓復(fù)雜的事情簡(jiǎn)單化;2,更符合人類的思維需求;3.角色從執(zhí)行者到指揮者。
三大特征:封裝,繼承,多態(tài)。
42.什么是封裝?封裝的原則?好處?
答:封裝就是把不需要對(duì)外暴露的狀態(tài)信息隱藏在對(duì)象內(nèi)部,不允許外部程序直接訪問(wèn)對(duì)象的信息,而是通過(guò)該類對(duì)外提供公共的訪問(wèn)方式對(duì)其訪問(wèn)和操作。
原則:(1)將不需要對(duì)外暴露的信息隱藏;(2)對(duì)外提供公共的訪問(wèn)方式。
好處:將變化隔離;提高了安全性;便于使用,提高了重用性。
43.封裝就是私有,對(duì)嗎?為什么?
答:private是封裝的一種體現(xiàn)形式。方法也是封裝。
44.Java中參數(shù)傳遞的問(wèn)題:
答:如果是基本數(shù)據(jù)類型,傳遞的參數(shù)要和形參的類型一致;如果是引用數(shù)據(jù)類型,那么傳遞的參數(shù)類型和形參的一致,或者是他的子類。
45.構(gòu)造方法,set方法都可以給成員變量賦值,這兩種賦值方式有什么區(qū)別?
答:構(gòu)造方法主要作用是用來(lái)給對(duì)象初始化,賦值只是他的兼職工作,也可以不用賦值。
Set方法只能用來(lái)賦值,在原有對(duì)象的基礎(chǔ)上賦值。
46.static關(guān)鍵字的特點(diǎn)?注意事項(xiàng)是什么?有什么好處和弊端?
答:(1)被static修飾的變量和方法隨著類的加載而加載(2)優(yōu)于對(duì)象存在(3)能夠被類名直接調(diào)用(4)資源共享。
注意事項(xiàng):靜態(tài)方法中不可以定義this、super關(guān)鍵字,因?yàn)殪o態(tài)優(yōu)先于對(duì)象存在,靜態(tài)只能覆蓋靜態(tài)。
好處:static能夠被類名直接調(diào)用,定義的是對(duì)象的共性內(nèi)容,不用每個(gè)對(duì)象單獨(dú)定義,節(jié)省空間。弊端:生命周期過(guò)長(zhǎng)。
47.類變量和實(shí)例變量的區(qū)別?
答:(1)所屬不同:類變量屬于類,是對(duì)象的共性內(nèi)容;實(shí)例變量屬于對(duì)象,是特性內(nèi)容。
(2)存儲(chǔ)位置不同:類變量隨著類的加載存儲(chǔ)于方法區(qū);實(shí)例變量隨著對(duì)象的創(chuàng)建存儲(chǔ)于堆內(nèi)存中。
(3)生命周期不同:類變量隨著類的加載而存在,隨著類的消失而消失;實(shí)例變量隨著對(duì)象的存在而存在,隨著對(duì)象的消失而消失。
(4)調(diào)用方式不同:類變量能夠被類名直接調(diào)用,有對(duì)象的時(shí)候也能被對(duì)象調(diào)用;實(shí)例變量只能被對(duì)象調(diào)用。
48.構(gòu)造方法能不能重載?
答:可以,在同一個(gè)類中,參數(shù)列表不同,與返回值無(wú)關(guān)。
49.靜態(tài)代碼塊和構(gòu)造代碼塊的區(qū)別?
答:(1)靜態(tài)代碼塊屬于類,給類進(jìn)行初始化,類一加載就會(huì)執(zhí)行,只執(zhí)行一次,經(jīng)常用于加載驅(qū)動(dòng)。
(2)構(gòu)造代碼塊給對(duì)象進(jìn)行統(tǒng)一初始化,每創(chuàng)建一次就會(huì)執(zhí)行一次。
50.什么是繼承?
答:當(dāng)多個(gè)類中有很多共性的內(nèi)容時(shí),我們可以把這些共性內(nèi)容抽取出來(lái)封裝成一個(gè)類,讓這些類與這個(gè)封裝的類產(chǎn)生關(guān)系。這種關(guān)系就是繼承。
51.繼承的的特點(diǎn)和好處,弊端?
答:特點(diǎn):java只支持單繼承,但是能夠多層次繼承;接口能夠單繼承,也能夠多繼承。
好處:(1)提高了代碼的復(fù)用性(2)提高了代碼的維護(hù)性(3)提高了代碼的擴(kuò)展性。(4)讓類與類產(chǎn)生了關(guān)系,是多態(tài)的前提。
弊端:增強(qiáng)了類與類的耦合性。
52.this和super的區(qū)別?
答:this代表對(duì)象的引用,super代表當(dāng)前對(duì)象父類的引用。
53.Super()和this()在構(gòu)造方法能同時(shí)使用嗎?
答 :不能,super調(diào)用的是父類的構(gòu)造,要放在構(gòu)造函數(shù)的第一行;this調(diào)用的是本類的構(gòu)造,也要放在第一行。
Super關(guān)鍵字和this關(guān)鍵字能否在構(gòu)造函數(shù)中共存?
答:能。
54.為什么每個(gè)構(gòu)造函數(shù)中第一行都有默認(rèn)的super()?
用于子類對(duì)象訪問(wèn)父類前,對(duì)父類數(shù)據(jù)進(jìn)行初始化。
55.為什么默認(rèn)的super()都是空參的呢?
因?yàn)镺bject類是所有類的父類,Object中只有一個(gè)空參構(gòu)造。
56.構(gòu)造方法的特點(diǎn)?
答:(1)方法名和類名相同(2)沒(méi)有返回值,連viod都沒(méi)有。(3)不用寫(xiě)return,可以有return;
57.this的作用?
答:(1)區(qū)別局部變量和成員變量(2)代表本類對(duì)象的引用(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修飾的變量的初始化時(shí)機(jī):
答:a.未被static關(guān)鍵字修飾
*可以顯示初始化
*可以在構(gòu)造方法中初始化
b.被static修飾
*可以顯示初始化
*可以在靜態(tài)代碼塊中初始化
*不能在構(gòu)造方法中初始化
60. final如果修飾局部變量,會(huì)發(fā)生什么事情?
答:基本類型,是值不能被改變,引用類型,是地址值不能被改變,對(duì)象中的屬性可以改變。
61.什么是多態(tài)?多態(tài)的體現(xiàn),前提,好處和弊端分別是什么?
答:同一事物在不同時(shí)刻表現(xiàn)出來(lái)的不同狀態(tài)。
體現(xiàn):父類引用指向子類對(duì)象,父類引用作為參數(shù)可以接收其子類對(duì)象,接口引用作為參數(shù)可以接收其實(shí)現(xiàn)類對(duì)象。
前提:(1)類與類之間要有關(guān)系,要么繼承,要么實(shí)現(xiàn)(2)要有方法重寫(xiě)(3)父類或者接口引用指向子類對(duì)象。
好處:(1)提高了代碼的維護(hù)性(2)提高了代碼的擴(kuò)展性,父類引用指向子類對(duì)象
弊端:父類引用只能調(diào)用父類的方法,不能調(diào)用子類特有的方法和屬性。
*向上轉(zhuǎn)型:父類或者父接口指向子類對(duì)象。
*向下轉(zhuǎn)型:把那個(gè)引用強(qiáng)制轉(zhuǎn)為子類對(duì)象。
62.多態(tài)中成員方法和變量的特點(diǎn)?
答:(1)一般方法:編譯看左邊,運(yùn)行看右邊。(2)靜態(tài)方法:編譯看左邊,運(yùn)行看左邊。(3)變量:編譯看左邊,運(yùn)行看左邊。
63.抽象類和抽象方法的特點(diǎn),有什么關(guān)系?
答:抽象類不能創(chuàng)建對(duì)象,需要子類繼承;抽象方法沒(méi)有方法體,需要子類去實(shí)現(xiàn)。抽象類不一定含有抽象方法,抽象方法一定在抽象類中。
64.抽象類中的抽象方法和非抽象方法的區(qū)別?
答:抽象方法要求子類必須重寫(xiě),完成相應(yīng)的功能;非抽象方法讓子類繼承,提高代碼的復(fù)用性。
65.abstract不能和哪些關(guān)鍵字共同存在?
答:private:私有的方法是不可見(jiàn)的,無(wú)法被復(fù)寫(xiě)
final:被final修飾的方法是最終方法,無(wú)法被復(fù)寫(xiě)
static:被static修飾的方法,要隨類加載到方法區(qū),由于抽象方法沒(méi)有方法體所以不能加載
66.final修飾的變量、方法、和類有什么特點(diǎn)?
答:final修飾的變量只能賦值一次,不能發(fā)生改變,如果修飾的基本類型,是其值不能發(fā)生改變,如果修飾的引用數(shù)據(jù)類型,是地址值不能發(fā)生改變;final修飾的方法不能被重寫(xiě);final修飾的類不能被繼承,也稱最終類。
67.final、finally、finalized的區(qū)別?
答:(1)final是一個(gè)關(guān)鍵字,是用來(lái)修飾類,成員變量,成員方法的,
它修飾的類不能被繼承,但是可以繼承其他類,
它修飾的成員變量是一個(gè)常量,只能賦值一次
它修飾的成員方法不能被子類重寫(xiě)
(2)finally是try-catch-finally語(yǔ)句的一個(gè)模塊,正常情況下里邊的代碼永遠(yuǎn)會(huì)執(zhí)行,一般是用來(lái)釋放資源的
(3)finalize是Object類中的方法,當(dāng)對(duì)象變成垃圾的時(shí)候,由GC(Java中的垃圾回收機(jī)制)來(lái)調(diào)用該類的finalize()方法回收垃圾。
68.接口中的成員的特點(diǎn)?
答:都是常量,public
static final ;方法都是抽象方法,public abstract;沒(méi)有構(gòu)造方法。
69、類與類、類與接口、接口與接口的關(guān)系?
答:類只能單繼承類,但是能夠多層次繼承;類實(shí)現(xiàn)接口,能同時(shí)實(shí)現(xiàn)多個(gè)接口,能在繼承類的同時(shí)實(shí)現(xiàn)接口;接口可以單繼承接口,也能多繼承。
70.接口和抽象類的區(qū)別?
(1)成員的特點(diǎn):抽象類可以有變量、常量、構(gòu)造方法、一般方法、抽象方法;接口有且只能有常量和抽象方法。
(2)關(guān)系特點(diǎn):類與類支持單繼承,不能多繼承,但是能夠多層次繼承,類與接口是實(shí)現(xiàn)關(guān)系,一個(gè)類能實(shí)現(xiàn)多個(gè)接口,一個(gè)類繼承類一個(gè)類的同時(shí)能實(shí)現(xiàn)多個(gè)接口;接口與接口之間能單繼承,也能多繼承;
(3)設(shè)計(jì)理念:抽象類定義的是該繼承體系的共性功能,是is a的關(guān)系。接口定義的是該體系的拓展功能,是like a的關(guān)系。
71.接口的思想特點(diǎn)?
(1)對(duì)外暴露的規(guī)則(2)接口是程序?qū)ν獾墓δ芡卣梗?)接口是用來(lái)多實(shí)現(xiàn)的(4)接口的出現(xiàn)降低了類與類之間的耦合性。
72.什么是內(nèi)部類,特點(diǎn)是什么?
答:在類中定義的類就是內(nèi)部類。特點(diǎn)(1)能夠直接訪問(wèn)所在類的成員,包括私有的。(2)外部類訪問(wèn)內(nèi)部類需要?jiǎng)?chuàng)建內(nèi)部類的對(duì)象。
73.成員內(nèi)部類是什么?
答:成員內(nèi)部類是定義在成員位置的類。能夠被私有、靜態(tài)修飾。
74.內(nèi)部類的方法如果訪問(wèn)局部變量,內(nèi)部類的成員變量,外部類的成員變量?
答:局部變量可以直接訪問(wèn);內(nèi)部類的成員變量this.;外部類的成員變量:外部類名.this.
75.局部?jī)?nèi)部類訪問(wèn)的局部變量為什么要用final修飾?
答:因?yàn)楫?dāng)調(diào)用這個(gè)方法時(shí),局部變量如果沒(méi)有用final修飾,他的生命周期和方法的生命周期是一樣的,當(dāng)方法彈棧,這個(gè)局部變量也會(huì)消失,那么如果局部?jī)?nèi)部類對(duì)象還沒(méi)有馬上消失想用這個(gè)局部變量,就沒(méi)有了,如果用final修飾會(huì)在類加載的時(shí)候進(jìn)入常量池,即使方法彈棧,常量池的常量還在,也可以繼續(xù)使用。但是JDK1.8以后取消了這個(gè)特性,會(huì)默認(rèn)加上final的。
76.什么是匿名內(nèi)部類?
答:匿名內(nèi)部類就是沒(méi)有名字的內(nèi)部類,是內(nèi)部類的簡(jiǎn)化形式。匿名內(nèi)部類必須繼承或?qū)崿F(xiàn)一個(gè)接口,在使用的時(shí)候直接用父類的名字創(chuàng)建一個(gè)子類對(duì)象并實(shí)現(xiàn)其中的方法,匿名內(nèi)部類的實(shí)質(zhì)是一個(gè)繼承了該類或者實(shí)現(xiàn)該接口的匿名的子類對(duì)象。
前提:必須繼承一個(gè)類或?qū)崿F(xiàn)一個(gè)接口。
規(guī)則:(1)不能是抽象的,因?yàn)樗谋举|(zhì)是一個(gè)子類對(duì)象。(2)不能定義構(gòu)造方法,因?yàn)闆](méi)有類名。
使用:(1)當(dāng)接口中的只有一個(gè)抽象方法時(shí),并對(duì)方法調(diào)用一次的時(shí)候(2)傳遞參數(shù)的時(shí)候,如果參數(shù)是接口或抽象類,其實(shí)需要的就是實(shí)現(xiàn)類對(duì)象或者子類對(duì)象,這個(gè)時(shí)候使用匿名內(nèi)部類。
77、匿名對(duì)象何時(shí)使用?
答:(1)當(dāng)對(duì)對(duì)象方法調(diào)用一次的時(shí)候(2)可以作為實(shí)際參數(shù)進(jìn)行傳遞。
78適配器模式?
當(dāng)一個(gè)接口有多個(gè)抽象方法時(shí),而我們只使用其中的一個(gè)或兩個(gè)方法時(shí),每次使用的時(shí)候我們都要重寫(xiě)這些方法,比較麻煩。我們可以定義一個(gè)類去實(shí)現(xiàn)這個(gè)接口,并重寫(xiě)里面的方法,只是方法體為空,并把這個(gè)類定義為抽象類,我們使用的時(shí)候繼承這個(gè)類重寫(xiě)需要的方法就就可以了。
79.四種權(quán)限修飾符的比較?
答:public的權(quán)限最大,同一類中,同一個(gè)包中,不同包中(子類),不同包中(無(wú)關(guān)類)都可以訪問(wèn)。給大家使用
Protected同一類中,同一個(gè)包中,不同包中(子類),可以訪問(wèn)。強(qiáng)調(diào)的是子類
默認(rèn)同一類中,同一個(gè)包中 可以訪問(wèn)。強(qiáng)調(diào)的是同一個(gè)包
Private同一類中訪問(wèn)。強(qiáng)調(diào)的是自己
80.package在第一行,只能有一個(gè);然后是import導(dǎo)包;最后是class。
81.代碼塊的分類:
局部代碼塊:讓變量盡早的消失,節(jié)約資源,提高效率。
構(gòu)造代碼塊:用于給對(duì)象初始化;
靜態(tài)代碼塊兒:給類進(jìn)行初始化,用于加載驅(qū)動(dòng)。
同步代碼塊:為了防止CPU高速切換出現(xiàn)安全問(wèn)題。
三、API
81.==和equals的區(qū)別?
答:“==”是比較運(yùn)算符,既能比較基本數(shù)據(jù)類型,又能比較引用數(shù)據(jù)類型?;緮?shù)據(jù)類型比較的是數(shù)值,引用數(shù)據(jù)類型比較的是地址值。
equals是一個(gè)方法,只能比較引用數(shù)據(jù)類型。所有的類都會(huì)繼承Object的equals方法。重寫(xiě)equals方法比較的是對(duì)象的內(nèi)容,如果沒(méi)有重寫(xiě)將調(diào)研Object的equals方法,比較的是地址值。
82.String str = null和String str =“”的區(qū)別?
答:String str = null只是聲明了引用,但是沒(méi)有創(chuàng)建對(duì)象,沒(méi)有為其開(kāi)辟空間,不能操作方法。String =“”是創(chuàng)建了一個(gè)長(zhǎ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指向的常量池中的對(duì)象,s2指向的是堆內(nèi)存中的對(duì)象,兩者的地址值不同。s1.equals(s2)結(jié)果是true。String重寫(xiě)了equals方法,比較的是內(nèi)容。
84.String,StringBuffer、StringBuilder的區(qū)別?
答: String是一個(gè)特殊的引用數(shù)據(jù)類型,是一個(gè)長(zhǎng)度不可變的字符序列,沒(méi)有緩沖區(qū),一旦創(chuàng)建就不會(huì)發(fā)生變化了。即使重新賦值不是在原來(lái)對(duì)象的基礎(chǔ)上改變的,而是創(chuàng)建了一個(gè)新的對(duì)象,將引用指向這個(gè)新的對(duì)象,浪費(fèi)空間,效率比較低。
StringBuffer、StringBuilder是容器,是可變的字符串序列。StringBuffer是JDK1.0版本的,線程是安全的,效率比較低。StringBuilder是JDK1.5出現(xiàn)的,線程不安全,效率高。
85.StringBuilder的底層是什么?
答:底層是字符數(shù)組,原始長(zhǎng)度為16。通過(guò)append添加元素的時(shí)候,會(huì)自動(dòng)擴(kuò)容,擴(kuò)容規(guī)則:大字符串的長(zhǎng)度=小數(shù)組長(zhǎng)度*2+2.
86.為什么出現(xiàn)基本數(shù)據(jù)類型包裝類?
答:將基本數(shù)據(jù)類型封裝為對(duì)象的好處能在對(duì)象中封裝更多的功能操作數(shù)據(jù)。
87.String和int直接的轉(zhuǎn)換?
答:將int類型轉(zhuǎn)為String類型的方法:(1)基本數(shù)據(jù)類型+“”(2)Integer.toString(int num)(3)String.valueOf(inti)
將String轉(zhuǎn)為int:Integer.parseInt(String s)
88.基本數(shù)據(jù)類型包裝類的自動(dòng)拆裝箱是什么?
答:是JDK1.5版本出現(xiàn)的新特性,自動(dòng)裝箱就是把基本數(shù)據(jù)類型轉(zhuǎn)為為包裝類型。拆箱就是把包裝類轉(zhuǎn)換為基本數(shù)據(jù)類型。
89.Object類中的常見(jiàn)方法有哪些?
答:hashCode():返回值是int,是該對(duì)象的哈?,斨?。
equals():返回值是boolean,比較的是地址值。
toString():返回該對(duì)象的字符串表現(xiàn)形式。
getClass():返回值類型是Class。返回的是創(chuàng)建該對(duì)象所屬類對(duì)應(yīng)的字節(jié)碼文件。
這些方法都需要對(duì)象調(diào)用,在開(kāi)發(fā)的過(guò)程中要重寫(xiě)。
地址值的組成:類名@十六進(jìn)制的哈希值。
90.獲取當(dāng)前時(shí)間毫秒值有哪幾種方式?
答:(1)new Date().getTime();(2)System.currentTimeMillis()(3)Calendar.getInstance().getTimeInMillis()
91.正則表達(dá)式常用的;
\d數(shù)字:[0-9]
\w單詞字符:[a-zA-Z_0-9]
(X)表示分組
\\1表示和前面的相同
.任何字符
X?,一次或一次也沒(méi)有
X*,零次或多次
X+,一次或多次
X{n},恰好n次
X{n,},至少n次
X{n,m},至少n次,但是不超過(guò)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.簡(jiǎn)述集合體系?
答:集合分為單列集合和雙列集合。
單列集合的頂層是Collection接口,包括List和Set集合。
(1.1)List集合的特點(diǎn)是元素可重復(fù),有序,有索引,能夠有角標(biāo)操作集合,有特有的迭代方式ListIterator。包括ArrayList、LinkedList和Vector。
ArrayList集合底層采用的是數(shù)組數(shù)據(jù)結(jié)構(gòu),查詢速度比較快,因?yàn)閿?shù)組有索引,在內(nèi)存中分配的空間是連續(xù)的,但是增刪比較慢。線程不同步,效率高。初始容量為10。
LinkedList集合的底層采用的是鏈表數(shù)據(jù)結(jié)構(gòu),增刪速度比較快,查詢速度比較慢。線程不同步。
Vector底層數(shù)據(jù)結(jié)構(gòu)也是數(shù)組數(shù)據(jù)結(jié)構(gòu),但是線程同步,效率低,特有取出元素的方式是枚舉。因?yàn)樾实?,逐步被ArrayList替代。
(1.2)Set集合的特點(diǎn)元素是無(wú)序的(存入和取出的順序不一致),元素不可以重復(fù)。包括HashSet和TreeSet。
HashSet的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,線程不同步,效率高。保證元素的唯一性額有的依據(jù)是元素的hashCode和equals方法。如果hashCode不同,不調(diào)用equals方法。如果hashCode相同,才會(huì)調(diào)用equals方法判斷元素是否相同。
TreeSet的底層數(shù)據(jù)結(jié)構(gòu)是二叉樹(shù),線程不同步,效率高。能夠給元素進(jìn)行排序。保證元素唯一性的依據(jù)是compareTo和return0。排序的兩種方式:第一種元素自身實(shí)現(xiàn)Comparable接口,重寫(xiě)compareTo()方法。這種排序方式叫元素的自熱排序,也叫默認(rèn)排序。第二種是當(dāng)元素自身不具備比較性或者具備的比較性不是所需要的,這時(shí)就讓集合自身具備比較性,當(dāng)集合初始化時(shí)就有了比較性。定義一個(gè)比較器實(shí)現(xiàn)Comparator接口,重寫(xiě)compare方法,定義集合的時(shí)候?qū)⒈容^器作為參數(shù)傳遞給TreeSet的構(gòu)造函數(shù),這樣集合就具有了比較性。
(2)Map是雙列集合的頂層接口,該集合存儲(chǔ)的是鍵值對(duì),一對(duì)一對(duì)的往里存,而且要保證鍵的唯一性。包括Hashtable、HashMap、TreeMap。
Hashtable的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,不可以存儲(chǔ)null鍵和null值,線程同步,效率低。JDK1.0.
HashMap的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,可以存儲(chǔ)null鍵和null值,線程不同步,將Hashtable替代,JDK1.2效率高。保證鍵的唯一性的 依據(jù)是hashCode和equals方法。
TreeMap的底層數(shù)據(jù)結(jié)構(gòu)是二叉樹(shù),線程不安全,能夠給集合中的鍵排序。
95.什么時(shí)候使用什么集合?
答:(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)針對(duì)鍵有效,Collection的底層數(shù)據(jù)結(jié)構(gòu)針對(duì)元素有效。
100.遍歷集合的方式有哪些?
答:遍歷List集合的方式有普通for、增強(qiáng)for、迭代器Iterator、列表迭代器ListIterator。
遍歷Set集合的方式有增強(qiáng)for、迭代器Iterator。
遍歷map集合的方式有keySet(),entrySet()。然后通過(guò)增強(qiáng)for、迭代器Iterator遍歷。
101.用迭代器和增強(qiáng)for遍歷集合,能否用集合的方法操作集合?
答:不能,會(huì)出現(xiàn)并發(fā)修改異常,ConcurrentModificationException。
并發(fā)修改異常就是在用普通迭代器的時(shí)候用集合的方法增加、刪除元素??梢杂昧斜淼鳌?/p>
102.泛型是什么?有什么好處?
答:簡(jiǎn)單的說(shuō)一種標(biāo)簽,不確定的類型,用戶使用的時(shí)候確定類型,是JDK1.5出現(xiàn)的新特性,用于解決安全問(wèn)題,是一種類型安全機(jī)制。
好處:(1)將運(yùn)行時(shí)期會(huì)可能出現(xiàn)的異常轉(zhuǎn)移到編譯期(2)提高了安全性。(3)避免了強(qiáng)制類型轉(zhuǎn)換的麻煩。
103、上限和下限?
?super E:E、E的父類,固定下邊界。
?extends E:E、E的子類固定的上邊界。
104.字典排序,自然排序和比較器排序是什么?
答:字典排序按照字典上的順序排序。
自然排序是對(duì)強(qiáng)制對(duì)實(shí)現(xiàn)Comparable接口的類進(jìn)行排序,實(shí)現(xiàn)Comparable接口,重寫(xiě)compareTo()方法,根據(jù)返回值進(jìn)行排序。
比較器排序是實(shí)現(xiàn)Comparator方法,重寫(xiě)compare()方法,根據(jù)返回值進(jìn)行排序。
105.TreeSet的兩種排序方式有什么區(qū)別?
答:TreeSet的構(gòu)造方法中不傳參數(shù),會(huì)按照類的Comparable排序,沒(méi)有的話就會(huì)報(bào)錯(cuò)。TreeSet傳入比較器,會(huì)按照比較器排序。
106.Map有哪些取出元素的方式?原理是什么?
答:keySet():將Map集合中的鍵取出放在Set集合,然后通過(guò)遍歷Set集合取出里面的鍵,再用map的get(key)方法取出對(duì)應(yīng)的值。
entrySet()將Map集合中的鍵值對(duì)關(guān)系取出放在Set集合,然后通過(guò)遍歷Set集合取出里面的鍵值對(duì)關(guān)系,然后通過(guò)entry的getKey()和getValue()方法取出元素。
107.Collections和collection的區(qū)別?
答:Collections是用來(lái)操作集合的工具類,它是個(gè)類;collection是單列集合的頂層接口。
108:
*棧和隊(duì)列:
隊(duì)列結(jié)構(gòu):先進(jìn)先出的規(guī)則
棧結(jié)構(gòu):先進(jìn)后出規(guī)則
*鏈表和數(shù)組的區(qū)別:
數(shù)組:一塊連續(xù)的存儲(chǔ)區(qū)域
鏈表結(jié)構(gòu):每個(gè)元素指向下一個(gè)元素
四、異常
109.異常體系概述?
答:Throwable類
|--Error:無(wú)法通過(guò)處理解決的錯(cuò)誤
|--Exception:
|--編譯時(shí)異常:就是在編譯程序生成.class文件時(shí)產(chǎn)生的異常,這種異常必須處理,要么拋出,要么捕獲,否則編譯無(wú)法通過(guò)
|--運(yùn)行時(shí)異常:編譯時(shí)期不會(huì)出現(xiàn),只有在運(yùn)行時(shí)才產(chǎn)生,這種異常,可以處理,也可以不處理,可以聲明,也可以不聲明
110.異常處理有哪些方式?
答(1)捕獲處理try{}catch{}try{}catch{}finally{}try{}finally{}
(2)聲明拋出
111.運(yùn)行異常和編譯異常的區(qū)別?
答:所有的RumtimeException類及其子類的實(shí)例是運(yùn)行異常,其他異常時(shí)編譯異常。編譯異常必須顯式處理,否則會(huì)編譯失敗。運(yùn)行時(shí)異??梢圆惶幚?,可以通過(guò)編譯。
112.throw和throws的區(qū)別?
答:throws是在方法聲明后面,用來(lái)聲明異常,后面跟的異常類名;可以跟多個(gè)異常類名,用逗號(hào)隔開(kāi);表示拋出異常,需要由調(diào)用者處理。
Throw定義在方法體內(nèi),跟的異常對(duì)象名;只能跟一個(gè)異常對(duì)象。
113.子父類間異常的注意事項(xiàng)?
答:(1)子類繼承父類時(shí),父類方法拋出了異常,子類重寫(xiě)該方法時(shí)只能拋出相同的異?;蛘咴摦惓5淖宇悺?/p>
(2)如果父類拋出了多個(gè)異常,子類在重寫(xiě)方法時(shí)只能拋出相同的異?;蛘咚淖蛹?,不能拋出父類沒(méi)有的異常。
(3)如果父類沒(méi)有拋出異常,子類重寫(xiě)該方法時(shí)不能拋出異常。如果子類出現(xiàn)了異常,只能進(jìn)行try處理,不能拋出。
114.異常處理的注意事項(xiàng):
[if !supportLists](1)[endif]子類不能出現(xiàn)父類沒(méi)有的異常
[if !supportLists](2)[endif]如果父類沒(méi)有拋出異常,子類重寫(xiě)該方法時(shí)不能拋出異常。如果子類出現(xiàn)了異常,只能進(jìn)行try處理,不能拋出。
[if !supportLists](3)[endif]功能內(nèi)部如果出現(xiàn)異常,如果內(nèi)部可以處理,就用try。如果功能內(nèi)部處理不了,就必須聲明出來(lái),讓調(diào)用者處理。
116.JVM是如何處理異常的?
先自己處理,處理不了交給調(diào)用者處理。
五、IO
117.遞歸的注意事項(xiàng)?
答:1.遞歸必須要有出口,否則是死遞歸,造成棧內(nèi)存溢出。2.遞歸不能多層次調(diào)用,否則會(huì)造成棧內(nèi)存溢出。3.構(gòu)造方法不能遞歸調(diào)用。
117.路徑的分類?
答:分為相對(duì)路徑和絕對(duì)路徑。絕對(duì)路徑是相對(duì)盤(pán)符而言的;相對(duì)路徑相對(duì)的是工程。
118.集合的頂層是什么?IO的頂層是什么?
答:集合的頂層是接口。IO的頂層的是抽象類。
119.什么IO流?
用來(lái)在硬盤(pán)和內(nèi)存直接交換數(shù)據(jù)的。
120:簡(jiǎn)述IO的分類?
答:按照流向分輸入流和輸出流。
按照操作分為字節(jié)流和子字符流。
字節(jié)流能操作任意類型的文件,如果操作文本,可能會(huì)出現(xiàn)亂碼。分為字節(jié)輸出流和字節(jié)輸入流。
字符流只能操作純文本文件,分為字符輸入流和字符輸出流。
121.為什么read()方法返回值是int類型?
答:為了防止中間出現(xiàn)11111111(-1的反碼)這樣的數(shù)據(jù),后面的內(nèi)容就讀不到了。
122.字符流通往字節(jié)流的橋梁是什么?字節(jié)流通往字符的橋梁是什么?
答:字符流通往字節(jié)流的橋梁是OutputStreamWriter;字節(jié)流通往字符流的橋梁是InputstreamReader。
123.標(biāo)準(zhǔn)輸入流和輸出流是什么?
答:標(biāo)準(zhǔn)輸入流的是System.in。標(biāo)準(zhǔn)輸出流是System.out.
124.高效字符流的方法?
ReadLine()讀不到\r\n
newline()針對(duì)當(dāng)前操作系統(tǒng)換行
125.字節(jié)輸入流read()一次讀取的一個(gè)字節(jié),返回的字節(jié)的對(duì)應(yīng)的ASCII值。
126.字符緩沖流和字節(jié)緩沖流的緩沖區(qū)的默認(rèn)大小是多少?
答:字符緩沖流緩沖區(qū)默認(rèn)的大小是8192個(gè)字符,16kb。
字節(jié)緩沖流緩沖區(qū)默認(rèn)的大小是8192個(gè)字節(jié),8kb。
Writer的2kb。
127.close()和flush()的區(qū)別:
答:flush()方法是來(lái)刷新緩沖區(qū)的,刷新之后還可以再次寫(xiě)出。
Close()是用來(lái)關(guān)閉流釋放資源的,如果是帶緩沖區(qū)的流對(duì)象關(guān)閉流之前還會(huì)刷新緩沖區(qū),關(guān)閉之后無(wú)法寫(xiě)出。
六、網(wǎng)絡(luò)編程
128.什么是網(wǎng)絡(luò)編程?
答:網(wǎng)絡(luò)編程又叫套接字編程,Socket編程,就是用來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)互連的不同計(jì)算機(jī)上運(yùn)行程序之間可以進(jìn)行數(shù)據(jù)的交換。大白話來(lái)講:就是用java語(yǔ)言來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)上不同計(jì)算機(jī)的通信。
129.網(wǎng)絡(luò)編程的三要素?
答:IP地址、端口、協(xié)議。
IP的組成網(wǎng)關(guān)和主機(jī)地址。127.0.0.1回環(huán)地址255.255.255.255廣播地址
130.端口的范圍是什么?哪個(gè)范圍的端口不能用,為什么?
答:端口的范圍是0——65535.0——1024這個(gè)范圍的端口不能使用,因?yàn)橐呀?jīng)被系統(tǒng)占用或者作為保留端口。
131.TCP和UDP協(xié)議的區(qū)別?
答:TCP是面向有連接的,三次握手機(jī)制;傳輸?shù)臄?shù)據(jù)無(wú)大小限制;安全(可靠)協(xié)議;效率低;區(qū)分客戶端和服務(wù)器。
UDP是面向無(wú)連接的,發(fā)送的數(shù)據(jù)是通過(guò)數(shù)據(jù)報(bào)包的形式,不超過(guò)64k;不安全(可靠)協(xié)議,效率高;不區(qū)分客戶端和服務(wù)器。(叫發(fā)送端和接收端)
132.Socket通信的原理是是什么?
答:通信的兩端都有獨(dú)有的Socket,Socket通信就是使用TCP或者UDP協(xié)議通過(guò)IO流在兩個(gè)Socket間進(jìn)行通信。
七、多線程
133.繼承和線程?
進(jìn)程是一個(gè)正在執(zhí)行中的程序,每一個(gè)程序都至少有一個(gè)執(zhí)行順序,該順序是一個(gè)路徑,或者叫一個(gè)控制單元。
線程是進(jìn)程中的一個(gè)獨(dú)立的控制單元,線程在控制著進(jìn)程的執(zhí)行,是進(jìn)程的執(zhí)行路徑。
進(jìn)程:正在運(yùn)行的程序
線程:進(jìn)程的執(zhí)行單元,執(zhí)行路徑。
多線程:進(jìn)程有多條執(zhí)行路徑,每個(gè)執(zhí)行路徑就是線程。
134.多線程并發(fā)和多線程并行是什么呢?
答:兩個(gè)或者多個(gè)任務(wù)發(fā)送請(qǐng)求時(shí),CPU只能執(zhí)行一個(gè),就會(huì)安排這些任務(wù)交替執(zhí)行,由于CPU做著高速的切換,間隔的時(shí)間比較短,我們看起來(lái)像同時(shí)執(zhí)行的,這就是多線程并發(fā)。
并行是兩個(gè)或多個(gè)任務(wù)同時(shí)執(zhí)行,前提是多核CPU。
135.多線程的執(zhí)行原理?
答:CPU在做著高速的切換。
136.線程的執(zhí)行具有隨機(jī)性和延遲性。
137.線程的默認(rèn)命名規(guī)則?
答:Thread-編號(hào),編號(hào)是從0開(kāi)始的。
138.線程的優(yōu)先級(jí)的范圍是多少?默認(rèn)的優(yōu)先級(jí)是?
答:線程的優(yōu)先級(jí)范圍是1——10。默認(rèn)的優(yōu)先級(jí)是5.
139.Java程序的啟動(dòng)原理?
答:JVM啟動(dòng)一個(gè)主線程,再由主線程調(diào)用某個(gè)類的main方法。
140.Java程序是多線程的嗎?
答:是的,至少開(kāi)啟了一個(gè)主線程和負(fù)責(zé)垃圾回收的線程。
141.線程的優(yōu)先級(jí)越高,代表這個(gè)線程一定是第一個(gè)執(zhí)行的嗎?
答:不是的,線程的優(yōu)先級(jí)越高代表著在一定程度上讓該線程獲取更多的執(zhí)行機(jī)會(huì)。
142.線程的兩種實(shí)現(xiàn)方式的區(qū)別?
答:繼承Thread類:好處是:因?yàn)槭抢^承,代碼簡(jiǎn)單,能夠直接使用Thread類的方法。確定是:擴(kuò)展性比較差,因?yàn)槔^承了Thread類,不能再繼承其他的類。
實(shí)現(xiàn)Runnable接口:好處是擴(kuò)展性比較強(qiáng)。缺點(diǎn)時(shí):代碼比較冗余,因?yàn)椴皇抢^承Thread類,無(wú)法直接使用thread中的方法。
143.同步代碼塊和同步方法的鎖是誰(shuí)?
答;同步代碼塊的鎖可以是任意類型的對(duì)象;非靜態(tài)同步方法的鎖是this;靜態(tài)方法的鎖是該類的字節(jié)碼文件。
144.實(shí)現(xiàn)Runnable和Callable的區(qū)別?
答:實(shí)現(xiàn)Runnable接口的run方法沒(méi)有返回值,不能拋異常;而實(shí)現(xiàn)Callable接口的call方法可以拋異常,有返回值。
Runnable接口的實(shí)現(xiàn)類對(duì)象既可以作為參數(shù)傳遞給Thread的構(gòu)造方法,也可以用線程池submit的參數(shù);Callable接口的實(shí)現(xiàn)類對(duì)象只適應(yīng)于線程池。
145.線程的生命周期(線程的五種狀態(tài))是什么?
答:新建、就緒、運(yùn)行(運(yùn)行的時(shí)候可能阻塞)、死亡。
線程的六種狀態(tài):新建、就緒、運(yùn)行(運(yùn)行的時(shí)候可能阻塞或者等待)、死亡。
146.sleep和wait的區(qū)別?
答:(1)sleep是讓線程睡眠,必須給相應(yīng)的睡眠時(shí)間,不需要喚醒,時(shí)間到了會(huì)自動(dòng)醒來(lái),休眠時(shí)不放棄Cpu的執(zhí)行權(quán)。
(2)wait的是讓線程等待,可以傳參也可以不傳參,傳參是在指定的時(shí)間后等待,需要被喚醒。等待的時(shí)候放棄cpu的執(zhí)行權(quán)。
147.什么時(shí)候會(huì)出現(xiàn)安全性?
多線程,并發(fā),操作同一數(shù)據(jù)。
148.為什么wait()和notify()定義在Object中?
答:因?yàn)殒i對(duì)象可以是任意類型的對(duì)象。
149.什么情況下需要同步?
當(dāng)多線程并發(fā),有多段代碼同時(shí)執(zhí)行時(shí),我們希望某一段代碼執(zhí)行的過(guò)程中CPU不要切換到其他線程工作.這時(shí)就需要同步.
如果兩段代碼是同步的,那么同一時(shí)間只能執(zhí)行一段,在一段代碼沒(méi)執(zhí)行結(jié)束之前,不會(huì)執(zhí)行另外一段代碼.
八、模擬湯姆貓服務(wù)器
150.BS結(jié)構(gòu)和CS的區(qū)別?
答:CS結(jié)構(gòu)是指客戶端和服務(wù)器端,開(kāi)發(fā)比較容易,因?yàn)橛脩舻膽?yīng)用程序都在客戶端,降低了系統(tǒng)通壓力,但是維護(hù)比較困難。
BS結(jié)構(gòu)是指瀏覽器服務(wù)器端,開(kāi)發(fā)比較困難,因?yàn)閼?yīng)用程序基本都在服務(wù)器端,維護(hù)比較方便。
151.靜態(tài)資源和動(dòng)態(tài)資源是什么?
答:靜態(tài)資源是Web頁(yè)面給人們看到的數(shù)據(jù)是始終不變的,例如html。
動(dòng)態(tài)資源是Web頁(yè)面給人們看的數(shù)據(jù)是系統(tǒng)自動(dòng)生成的,隨時(shí)變化的。例如JSP/Servlet、ASP、PHP
在JAVA,動(dòng)態(tài)Web資源開(kāi)發(fā)技術(shù)通稱Javaweb。
152.常用的狀態(tài)碼你知道哪些?
答:200請(qǐng)求成功;404請(qǐng)求的資源不存在;500服務(wù)器發(fā)生未知的錯(cuò)誤。
153.GET請(qǐng)求和POST請(qǐng)求的區(qū)別?
答:GET請(qǐng)求會(huì)將請(qǐng)求信息置于地址欄,不安全,適合小數(shù)據(jù)的傳輸。
POST請(qǐng)求將請(qǐng)求信息置于請(qǐng)求體,相對(duì)安全,適合大數(shù)據(jù)的傳輸。
154.客戶端向服務(wù)器發(fā)送請(qǐng)求request,服務(wù)器對(duì)客戶端的請(qǐng)求做出響應(yīng)response。
http協(xié)議是互聯(lián)網(wǎng)的通用協(xié)議(規(guī)則),客戶端和服務(wù)端都要遵循這個(gè)協(xié)議。默認(rèn)端口號(hào)是80.
155.請(qǐng)求信息包括什么?響應(yīng)信息包括什么?
答:請(qǐng)求頭和請(qǐng)求體。請(qǐng)求頭又包括請(qǐng)求行和頭信息。
響應(yīng)信息包括響應(yīng)頭和響應(yīng)體。
九.?dāng)?shù)據(jù)庫(kù)
156.為什么要有數(shù)據(jù)庫(kù)?常見(jiàn)的數(shù)據(jù)你知道哪些?
答:為了永久存儲(chǔ)數(shù)據(jù),并且能夠操作數(shù)據(jù)。
MySQLSQL ServerOracle
157.數(shù)據(jù)庫(kù)的本質(zhì)是什么?
答;數(shù)據(jù)庫(kù)的本質(zhì)是一個(gè)文件系統(tǒng)。
158.數(shù)據(jù)庫(kù)以什么為單位存儲(chǔ)數(shù)據(jù)?
數(shù)據(jù)庫(kù)中以表為組織單位存儲(chǔ)數(shù)據(jù)。
159.常用的SQL語(yǔ)句?
createdatabase數(shù)據(jù)庫(kù)名;創(chuàng)建數(shù)據(jù)庫(kù)
show databases;查看所有數(shù)據(jù)庫(kù)
use數(shù)據(jù)庫(kù)名;使用指定數(shù)據(jù)庫(kù)
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=值2where條件; 修改指定數(shù)據(jù)
select字段1,字段2,...from表名;按照表中的字段名查詢:
select * from表名;查詢表中所有字段
order by排序
group by分組:
160.聚合函數(shù)?
count、sum、max、min、avg
161.JDBC的核心功能是什么?
答:連接數(shù)據(jù)庫(kù);向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句;操作SQL語(yǔ)句的返回結(jié)果。
162.DBUtils能否創(chuàng)建數(shù)據(jù)庫(kù)和表?
答:不能,只能操作數(shù)據(jù)庫(kù)里面的數(shù)據(jù)。
163.SQL語(yǔ)言的分類?
答:SQL語(yǔ)言是JAVA操作數(shù)據(jù)庫(kù)的語(yǔ)言。分為DDL(Data
Definition Language)數(shù)據(jù)定義語(yǔ)言;DML(Data
manipulation Language)數(shù)據(jù)操作語(yǔ)言(增刪覆蓋);DCL(Data Control
Language)數(shù)據(jù)控制語(yǔ)言;DQL(Data Query Language)數(shù)據(jù)查詢語(yǔ)言。
164.SQL注入的問(wèn)題產(chǎn)生原因和解決方法?
答:SQL注入是因?yàn)榭蛻糨斎氲氖荢QL語(yǔ)句??梢允褂肞reparedStatement接口的子類對(duì)象。
165.連接池?
答:數(shù)據(jù)庫(kù)連接的建立和關(guān)閉都是極其消耗資源的。數(shù)據(jù)庫(kù)連接池的解決方案是當(dāng)應(yīng)用程序啟動(dòng)時(shí),系統(tǒng)主動(dòng)創(chuàng)建足夠的數(shù)據(jù)庫(kù)連接,并將這些連接組成一個(gè)連接池,每次使用的時(shí)候無(wú)序重新創(chuàng)建聯(lián)系,直接從連接池中取出已有的連接使用,使用完后不再關(guān)閉數(shù)據(jù)庫(kù)連接,而是直接歸還到連接池。通過(guò)連接池,將極大的提高了程序的運(yùn)行效率。
f?3?6"b