{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問(wèn)答專欄Q & A COLUMN

Java面試題目網(wǎng)站有哪些?

ixleiixlei 回答0 收藏2
收藏問(wèn)題

4條回答

zzbo

zzbo

回答于2022-06-28 15:37

如果是想找高質(zhì)量面試題的話不妨看看動(dòng)力節(jié)點(diǎn)官網(wǎng)上面試題也是非常全面新鮮的!


Java面試題及答案

1、String類可以被繼承嗎?

String類在聲明時(shí)使用final關(guān)鍵字修飾,被final關(guān)鍵字修飾的類無(wú)法被繼承。

接下來(lái)我們可以看一下String類的源代碼片段:

public final class String implements java.io.Serializable, Comparable<String>,CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L;

● 為什么Java語(yǔ)言的開(kāi)發(fā)者,把String類定義為final的呢?

因?yàn)橹挥挟?dāng)字符串是不可變的,字符串池才有可能實(shí)現(xiàn)。字符串池的實(shí)現(xiàn)可以在運(yùn)行時(shí)節(jié)約很多heap空間,因?yàn)椴煌淖址兞慷贾赶虺刂械耐粋€(gè)字符串。但如果字符串是可變的,那么String interning將不能實(shí)現(xiàn),因?yàn)檫@樣的話,如果變量改變了它的值,那么其它指向這個(gè)值的變量的值也會(huì)一起改變。如果字符串是可變的,那么會(huì)引起很嚴(yán)重的安全問(wèn)題。譬如,數(shù)據(jù)庫(kù)的用戶名、密碼都是以字符串的形式傳入來(lái)獲得數(shù)據(jù)庫(kù)的連接,或者在socket編程中,主機(jī)名和端口都是以字符串的形式傳入。因?yàn)樽址遣豢勺兊模运闹凳遣豢筛淖兊模駝t黑客們可以鉆到空子,改變字符串指向的對(duì)象的值,造成安全漏洞。

因?yàn)樽址遣豢勺兊模允嵌嗑€程安全的,同一個(gè)字符串實(shí)例可以被多個(gè)線程共享。這樣便不用因?yàn)榫€程安全問(wèn)題而使用同步。字符串自己便是線程安全的。

因?yàn)樽址遣豢勺兊模栽谒鼊?chuàng)建的時(shí)候HashCode就被緩存了,不需要重新計(jì)算。這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過(guò)其它的鍵對(duì)象。這就是HashMap中的鍵往往都使用字符串。

● final關(guān)鍵字除了修飾類之外,還有哪些用法呢?

final修飾的變量,一旦賦值,不可重新賦值;

final修飾的方法無(wú)法被覆蓋;

final修飾的實(shí)例變量,必須手動(dòng)賦值,不能采用系統(tǒng)默認(rèn)值;

final修飾的實(shí)例變量,一般和static聯(lián)用,用來(lái)聲明常量;

注意:final不能和abstract關(guān)鍵字聯(lián)合使用。

總之,final表示最終的、不可變的。

2、& 和 && 的區(qū)別?

● &運(yùn)算符是:邏輯與;&&運(yùn)算符是:短路與。

● &和&&在程序中最終的運(yùn)算結(jié)果是完全一致的,只不過(guò)&&存在短路現(xiàn)象,當(dāng)&&運(yùn)算符左邊的表達(dá)式結(jié)果為false的時(shí)候,右邊的表達(dá)式不執(zhí)行,此時(shí)就發(fā)生了短路現(xiàn)象。如果是&運(yùn)算符,那么不管左邊的表達(dá)式是true還是false,右邊表達(dá)式是一定會(huì)執(zhí)行的。這就是他們倆的本質(zhì)區(qū)別。

● 當(dāng)然,&運(yùn)算符還可以使用在二進(jìn)制位運(yùn)算上,例如按位與操作。

3、兩個(gè)對(duì)象值相同equals結(jié)果為true,但卻可有不同的 hashCode,這句話對(duì)不對(duì)?

不對(duì),如果兩個(gè)對(duì)象x和y滿足x.equals(y) == true,它們的哈希值(hashCode)應(yīng)當(dāng)相同。Java 對(duì)于equals方法和hashCode方法是這樣規(guī)定的:

(1)如果兩個(gè)對(duì)象相同(equals方法返回true),那么它們的hashCode值一定要相同;

(2)如果兩個(gè)對(duì)象的 hashCode相同,它們并不一定相同。當(dāng)然,你未必按照要求去做,但是如果你違背了上述原則就會(huì)發(fā)現(xiàn)在使用集合時(shí),相同的對(duì)象可以出現(xiàn)在Set 集合中,同時(shí)增加新元素的效率會(huì)大大降低(對(duì)于使用哈希存儲(chǔ)的系統(tǒng),如果哈希碼頻繁的沖突將會(huì)造成存取性能急劇下降)。

關(guān)于equals和hashCode方法,很多Java程序員都知道,但很多人也就是僅僅了解而已,在Joshua Bloch的大作《Effective Java》(《Effective Java》在很多公司,是Java程序員必看書(shū)籍,如果你還沒(méi)看過(guò),那就趕緊去買一本吧)中是這樣介紹 equals 方法的:

首先equals方法必須滿足自反性(x.equals(x)必須返回true)、對(duì)稱性(x.equals(y)返回true 時(shí),y.equals(x)也必須返回true)、傳遞性(x.equals(y)和y.equals(z)都返回true時(shí),x.equals(z)也必須返回true)和一致性(當(dāng)x和y引用的對(duì)象信息沒(méi)有被修改時(shí),多次調(diào)用x.equals(y)應(yīng)該得到同樣的返回值),而且對(duì)于任何非null值的引用x,x.equals(null)必須返回false。實(shí)現(xiàn)高質(zhì)量的equals方法的訣竅包括:

使用==操作符檢查"參數(shù)是否為這個(gè)對(duì)象的引用";

使用 instanceof操作符檢查"參數(shù)是否為正確的類型";

對(duì)于類中的關(guān)鍵屬性,檢查參數(shù)傳入對(duì)象的屬性是否與之相匹配;

編寫(xiě)完equals方法后,問(wèn)自己它是否滿足對(duì)稱性、傳遞性、一致性;

重寫(xiě)equals時(shí)總是要重寫(xiě)hashCode;

不要將equals方法參數(shù)中的Object對(duì)象替換為其他的類型,在重寫(xiě)時(shí)不要忘掉@Override注解。

4、在 Java 中,如何跳出當(dāng)前的多重嵌套循環(huán)?

在最外層循環(huán)前加一個(gè)標(biāo)記如outfor,然后用break outfor;可以跳出多重循環(huán)。例如以下代碼:

public class TestBreak {

public static void main(String[] args) {

outfor: for (int i = 0; i < 10; i++){

for (int j = 0; j < 10; j++){

if (j == 5){

break outfor;

}

System.out.println("j = " + j);

}

}

}

}

運(yùn)行結(jié)果如下所示:

j = 0

j = 1

j = 2

j = 3

j = 4

5、重載(overload)和重寫(xiě)(override)的區(qū)別?重載的方法能否根據(jù)返回類型進(jìn)行區(qū)分?

方法的重載和重寫(xiě)都是實(shí)現(xiàn)多態(tài)的方式,區(qū)別在于前者實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性,而后者實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性。

重載發(fā)生在一個(gè)類中,同名的方法如果有不同的參數(shù)列表(類型不同、個(gè)數(shù)不同、順序不同)則視為重載。

重寫(xiě)發(fā)生在子類與父類之間,重寫(xiě)要求子類重寫(xiě)之后的方法與父類被重寫(xiě)方法有相同的返回類型,比父類被重寫(xiě)方法更好訪問(wèn),不能比父類被重寫(xiě)方法聲明更多的異常(里氏代換原則)。重載對(duì)返回類型沒(méi)有特殊的要求。

● 方法重載的規(guī)則:

方法名一致,參數(shù)列表中參數(shù)的順序,類型,個(gè)數(shù)不同。

重載與方法的返回值無(wú)關(guān),存在于父類和子類,同類中。

可以拋出不同的異常,可以有不同修飾符。

● 方法重寫(xiě)的規(guī)則:

參數(shù)列表、方法名、返回值類型必須完全一致;

構(gòu)造方法不能被重寫(xiě);

聲明為 final 的方法不能被重寫(xiě);

聲明為 static 的方法不存在重寫(xiě)(重寫(xiě)和多態(tài)聯(lián)合才有意義);

訪問(wèn)權(quán)限不能比父類更低;

重寫(xiě)之后的方法不能拋出更寬泛的異常;

6、當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里是值傳遞還是引用傳遞?

是值傳遞。Java 語(yǔ)言的方法調(diào)用只支持參數(shù)的值傳遞。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的內(nèi)存地址。這個(gè)值(內(nèi)存地址)被傳遞后,同一個(gè)內(nèi)存地址指向堆內(nèi)存當(dāng)中的同一個(gè)對(duì)象,所以通過(guò)哪個(gè)引用去操作這個(gè)對(duì)象,對(duì)象的屬性都是改變的。

7、為什么方法不能根據(jù)返回類型來(lái)區(qū)分重載?

我們來(lái)看以下的代碼:

public void testMethod(){

doSome();

}

public void doSome(){

}

public int doSome(){

return 1;

}

在Java語(yǔ)言中,調(diào)用一個(gè)方法,即使這個(gè)方法有返回值,我們也可以不接收這個(gè)返回值,例如以上兩個(gè)方法doSome(),在testMethod()中調(diào)用的時(shí)候,Java編譯器無(wú)法區(qū)分調(diào)用的具體是哪個(gè)方法。所以對(duì)于編譯器來(lái)說(shuō),doSome()方法不是重載而是重復(fù)了,編譯器報(bào)錯(cuò)。所以區(qū)分這兩個(gè)方法不能依靠方法的返回值類型。

8、抽象類(abstract class)和接口(interface)有什么異同?

不同點(diǎn):

● 抽象類中可以定義構(gòu)造器,接口不能;

● 抽象類可以有抽象方法和具體方法,接口不能有具體方法;

● 接口中的成員全都是 public 的,抽象類中的成員可以使用private、public、protected、默認(rèn)等修飾;

● 抽象類中可以定義成員變量,接口中只能是常量;

● 有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法;

● 抽象類中可以包含靜態(tài)方法,接口中不能有靜態(tài)方法;

● 一個(gè)類只能繼承一個(gè)抽象類,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口;

相同點(diǎn):

● 不能夠?qū)嵗?/p>

● 可以將抽象類和接口類型作為引用類型;

● 一個(gè)類如果繼承了某個(gè)抽象類或者實(shí)現(xiàn)了某個(gè)接口都需要對(duì)其中的抽象方法全部進(jìn)行實(shí)現(xiàn),否則該類仍然需要被聲明為抽象類;

9、char 型變量中能不能存儲(chǔ)一個(gè)中文漢字,為什么?

char 類型可以存儲(chǔ)一個(gè)中文漢字,因?yàn)镴ava中使用的編碼是Unicode(不選擇任何特定的編碼,直接使用字符在字符集中的編號(hào),這是統(tǒng)一的唯一方法),一個(gè)char 類型占2個(gè)字節(jié)(16 比特),所以放一個(gè)中文是沒(méi)問(wèn)題的。

補(bǔ)充:使用Unicode 意味著字符在JVM內(nèi)部和外部有不同的表現(xiàn)形式,在JVM內(nèi)部都是 Unicode,當(dāng)這個(gè)字符被從JVM內(nèi)部轉(zhuǎn)移到外部時(shí)(例如存入文件系統(tǒng)中),需要進(jìn)行編碼轉(zhuǎn)換。所以 Java 中有字節(jié)流和字符流,以及在字符流和字節(jié)流之間進(jìn)行轉(zhuǎn)換的轉(zhuǎn)換流,如 InputStreamReader和OutputStreamReader,這兩個(gè)類是字節(jié)流和字符流之間的適配器類,承擔(dān)了編碼轉(zhuǎn)換的任務(wù)。

10、抽象的(abstract)方法是否可同時(shí)是靜態(tài)的(static), 是否可同時(shí)是本地方法(native),是否可同時(shí)被 synchronized?

都不能。

● 抽象方法需要子類重寫(xiě),而靜態(tài)的方法是無(wú)法被重寫(xiě)的,因此二者是矛盾的。

● 本地方法是由本地代碼(如 C++ 代碼)實(shí)現(xiàn)的方法,而抽象方法是沒(méi)有實(shí)現(xiàn)的,也是矛盾的。

● synchronized 和方法的實(shí)現(xiàn)細(xì)節(jié)有關(guān),抽象方法不涉及實(shí)現(xiàn)細(xì)節(jié),因此也是相互矛盾的。

Java面向?qū)ο竺嬖囶}

1、面向?qū)ο蟀男┨匦裕趺蠢斫獾模?/strong>

(1)封裝:通常認(rèn)為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的接口。面向?qū)ο蟮谋举|(zhì)就是將現(xiàn)實(shí)世界描繪成一系列完全自治、封閉的對(duì)象。我們?cè)陬愔芯帉?xiě)的方法就是對(duì)實(shí)現(xiàn)細(xì)節(jié)的一種封裝;我們編寫(xiě)一個(gè)類就是對(duì)數(shù)據(jù)和數(shù)據(jù)操作的封裝。可以說(shuō),封裝就是隱藏一切可隱藏的東西,只向外界提供最簡(jiǎn)單的編程接口。

(2)繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過(guò)程。提供繼承信息的類被稱為父類(超類、基類);得到繼承信息的類被稱為子類(派生類)。繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性,同時(shí)繼承也是封裝程序中可變因素的重要手段。

(3)多態(tài):多態(tài)性是指允許不同子類型的對(duì)象對(duì)同一消息作出不同的響應(yīng)。簡(jiǎn)單的說(shuō)就是用同樣的對(duì)象引用調(diào)用同樣的方法但是做了不同的事情。多態(tài)性分為編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。如果將對(duì)象的方法視為對(duì)象向外界提供的服務(wù),那么運(yùn)行時(shí)的多態(tài)性可以解釋為:當(dāng) A系統(tǒng)訪問(wèn)B系統(tǒng)提供的服務(wù)時(shí),B 系統(tǒng)有多種提供服務(wù)的方式,但一切對(duì) A 系統(tǒng)來(lái)說(shuō)都是透明的。方法重載(overload)實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性(也稱為前綁定),而方法重寫(xiě)(override)實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性(也稱為后綁定)。運(yùn)行時(shí)的多態(tài)是面向?qū)ο笞罹璧臇|西,要實(shí)現(xiàn)多態(tài)需要做兩件事:

第一:方法重寫(xiě)(子類繼承父類并重寫(xiě)父類中已有的或抽象的方法);

第二:對(duì)象造型(用父類型引用指向子類型對(duì)象,這樣同樣的引用調(diào)用同樣的方法就會(huì)根據(jù)子類對(duì)象的不同而表現(xiàn)出不同的行為)。

(4)抽象:抽象是將一類對(duì)象的共同特征總結(jié)出來(lái)構(gòu)造類的過(guò)程,包括數(shù)據(jù)抽象和行為抽象兩方面。抽象只關(guān)注對(duì)象有哪些屬性和行為,并不關(guān)注這些行為的細(xì)節(jié)是什么。

2、訪問(wèn)權(quán)限修飾符 public、private、protected, 以及不寫(xiě)(默認(rèn))時(shí)的區(qū)別?

修飾符

當(dāng)前類

同包

子類

其他包

public

protected

×

默認(rèn)(缺省)

×

×

private

×

×

×

3、Java中為什么要用 clone?

在實(shí)際編程過(guò)程中,我們常常要遇到這種情況:有一個(gè)對(duì)象 A,在某一時(shí)刻 A 中已經(jīng)包含了一些有效值,此時(shí)可能會(huì)需要一個(gè)和 A 完全相同新對(duì)象 B,并且此后對(duì) B 任何改動(dòng)都不會(huì)影響到 A 中的值,也就是說(shuō),A 與 B 是兩個(gè)獨(dú)立的對(duì)象,但 B 的初始值是由 A 對(duì)象確定的。在 Java 語(yǔ)言中,用簡(jiǎn)單的賦值語(yǔ)句是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但clone()方法是其中最簡(jiǎn)單,也是最高效的手段。

● 說(shuō)到對(duì)象的克隆,涉及到深克隆和淺克隆?

淺克隆:創(chuàng)建一個(gè)新對(duì)象,新對(duì)象的屬性和原來(lái)對(duì)象完全相同,對(duì)于非基本類型屬性,仍指向原有屬性所指向的對(duì)象的內(nèi)存地址。

深克隆:創(chuàng)建一個(gè)新對(duì)象,屬性中引用的其他對(duì)象也會(huì)被克隆,不再指向原有對(duì)象地址。

4、new一個(gè)對(duì)象的過(guò)程和clone一個(gè)對(duì)象的區(qū)別?

new 操作符的本意是分配內(nèi)存。程序執(zhí)行到 new 操作符時(shí),首先去看 new 操作符后面的類型,因?yàn)橹懒祟愋停拍苤酪峙涠啻蟮膬?nèi)存空間。分配完內(nèi)存之后,再調(diào)用構(gòu)造函數(shù),填充對(duì)象的各個(gè)域,這一步叫做對(duì)象的初始化,構(gòu)造方法返回后,一個(gè)對(duì)象創(chuàng)建完畢,可以把他的引用(地址)發(fā)布到外部,在外部就可以使用這個(gè)引用操縱這個(gè)對(duì)象。

clone 在第一步是和 new 相似的,都是分配內(nèi)存,調(diào)用 clone 方法時(shí),分配的內(nèi)存和原對(duì)象(即調(diào)用 clone 方法的對(duì)象)相同,然后再使用原對(duì)象中對(duì)應(yīng)的各個(gè)域,填充新對(duì)象的域,填充完成之后,clone方法返回,一個(gè)新的相同的對(duì)象被創(chuàng)建,同樣可以把這個(gè)新對(duì)象的引用發(fā)布到外部。

5、Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?

Java中的多態(tài)靠的是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對(duì)象,而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法,而不是引用變量的類型中定義的方法。

6、談?wù)勀銓?duì)多態(tài)的理解?

多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量到底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源代碼,就可以讓引用變量綁定到各種不同的對(duì)象上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。

7、談?wù)勀銓?duì)面向?qū)ο蟮睦斫猓?/strong>

所謂對(duì)象就是由一組數(shù)據(jù)結(jié)構(gòu)和處理它們的方法組成的,重點(diǎn)“數(shù)據(jù)”包括對(duì)象的特性、狀態(tài)等的靜態(tài)信息;“方法” 也就是行為,包括該對(duì)象的對(duì)數(shù)據(jù)的操作、功能等能動(dòng)信息。把相同行為的對(duì)象歸納為類,類是一個(gè)抽象的概念,對(duì)象是類的具體。簡(jiǎn)單點(diǎn)說(shuō):對(duì)象就是類的實(shí)例。例如:小品演員就是一個(gè)類,趙本山就是一個(gè)對(duì)象。

面向?qū)ο蟮哪康模航鉀Q軟件系統(tǒng)的可擴(kuò)展性,可維護(hù)性和可重用性。

● 面向?qū)ο蟮娜筇匦裕悍庋b、多態(tài)和繼承:

(1)封裝(對(duì)應(yīng)可擴(kuò)展性):隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口,控制在程序中屬性的讀和修改的訪問(wèn)級(jí)別。封裝是通過(guò)訪問(wèn)控制符(public protected private)來(lái)實(shí)現(xiàn)。一個(gè)類就可看成一個(gè)封裝。

(2)繼承(重用性和擴(kuò)展性):子類繼承父類,可以繼承父類的方法和屬性。可以對(duì)父類方向進(jìn)行覆蓋(實(shí)現(xiàn)了多態(tài))。但是繼承破壞了封裝,因?yàn)樗菍?duì)子類開(kāi)放的,修改父類會(huì)導(dǎo)致所有子類的改變,因此繼承一定程度上又破壞了系統(tǒng)的可擴(kuò)展性,只有明確的IS-A關(guān)系才能使用。繼承要慎用,盡量?jī)?yōu)先使用組合。

(3)多態(tài)(可維護(hù)性和可擴(kuò)展性):接口的不同實(shí)現(xiàn)方式即為多態(tài)。接口是對(duì)行為的抽象,剛才在封裝提到,找到變化部分并封裝起來(lái),但是封裝起來(lái)后,怎么適應(yīng)接下來(lái)的變化?這正是接口的作用,接口的主要目的是為不相關(guān)的類提供通用的處理服務(wù),我們可以想象一下。比如鳥(niǎo)會(huì)飛,但是超人也會(huì)飛,通過(guò)飛這個(gè)接口,我們可以讓鳥(niǎo)和超人,都實(shí)現(xiàn)這個(gè)接口。

面向?qū)ο缶幊蹋∣OP)其實(shí)就是一種設(shè)計(jì)思想,在程序設(shè)計(jì)過(guò)程中把每一部分都盡量當(dāng)成一個(gè)對(duì)象來(lái)考慮,以實(shí)現(xiàn)軟件系統(tǒng)的可擴(kuò)展性,可維護(hù)性和可重用性。

Java異常處理面試題

1、final、finally、finalize 的區(qū)別?

● final:用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。

● finally:異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

● finalize:Object 類的一個(gè)方法,所以Java對(duì)象都有這個(gè)方法,當(dāng)某Java對(duì)象沒(méi)有更多的引用指向的時(shí)候,會(huì)被垃圾回收器回收,該對(duì)象被回收之前,由垃圾回收器來(lái)負(fù)責(zé)調(diào)用此方法,通常在該方法中進(jìn)行回收前的準(zhǔn)備工作。該方法更像是一個(gè)對(duì)象生命周期的臨終方法,當(dāng)該方法被系統(tǒng)調(diào)用則代表該對(duì)象即將“死亡”,但是需要注意的是,我們主動(dòng)行為上去調(diào)用該方法并不會(huì)導(dǎo)致該對(duì)象“死亡”,這是一個(gè)被動(dòng)的方法(其實(shí)就是回調(diào)方法),不需要我們調(diào)用。

2、Java中異常分為哪些種類?

按照異常需要處理的時(shí)機(jī)分為編譯時(shí)異常(也叫受控異常)也叫 CheckedException 和運(yùn)行時(shí)異常(也叫非受控異常)也叫 UnCheckedException。Java認(rèn)為Checked異常都是可以被處理的異常,所以Java程序必須顯式處理Checked異常。如果程序沒(méi)有處理Checked 異常,該程序在編譯時(shí)就會(huì)發(fā)生錯(cuò)誤無(wú)法編譯。這體現(xiàn)了Java 的設(shè)計(jì)哲學(xué):沒(méi)有完善錯(cuò)誤處理的代碼根本沒(méi)有機(jī)會(huì)被執(zhí)行。對(duì)Checked異常處理方法有兩種:

● 第一種:當(dāng)前方法知道如何處理該異常,則用try...catch塊來(lái)處理該異常。

● 第二種:當(dāng)前方法不知道如何處理,則在定義該方法時(shí)聲明拋出該異常。

運(yùn)行時(shí)異常只有當(dāng)代碼在運(yùn)行時(shí)才發(fā)行的異常,編譯的時(shí)候不需要try…catch。Runtime如除數(shù)是0和數(shù)組下標(biāo)越界等,其產(chǎn)生頻繁,處理麻煩,若顯示申明或者捕獲將會(huì)對(duì)程序的可讀性和運(yùn)行效率影響很大。所以由系統(tǒng)自動(dòng)檢測(cè)并將它們交給缺省的異常處理程序。當(dāng)然如果你有處理要求也可以顯示捕獲它們。

3、error和exception的區(qū)別?

Error類和Exception類的父類都是Throwable類,他們的區(qū)別如下:

● Error類一般是指與虛擬機(jī)相關(guān)的問(wèn)題,如系統(tǒng)崩潰,虛擬機(jī)錯(cuò)誤,內(nèi)存空間不足,方法調(diào)用棧溢出等。對(duì)于這類錯(cuò)誤的導(dǎo)致的應(yīng)用程序中斷,僅靠程序本身無(wú)法恢復(fù)和預(yù)防,遇到這樣的錯(cuò)誤,建議讓程序終止。

● Exception類表示程序可以處理的異常,可以捕獲且可能恢復(fù)。遇到這類異常,應(yīng)該盡可能處理異常,使程序恢復(fù)運(yùn)行,而不應(yīng)該隨意終止異常。

●Exception類又分為未檢查異常(UnCheckedException)和受檢查的異常(CheckedException)。運(yùn)行時(shí)異常ArithmeticException,IllegalArgumentException編譯能通過(guò),但是一運(yùn)行就終止了,程序不會(huì)處理運(yùn)行時(shí)異常,出現(xiàn)這類異常,程序會(huì)終止。而受檢查的異常,要么用 try…catch 捕獲,要么用throws字句聲明拋出,交給它的父類處理,否則編譯不會(huì)通過(guò)。

4、調(diào)用下面的方法,得到的返回值是什么?

1. public int getNum() {

2. try {

3. int a = 1 / 0;

4. return 1;

5. } catch (Exception e) {

6. return 2;

7. } finally {

8. return 3;

9. }

10.}

代碼走到第3行的時(shí)候遇到了一個(gè)MathException,這時(shí)第4行的代碼就不會(huì)執(zhí)行了,代碼直接跳轉(zhuǎn)到catch語(yǔ)句中,走到第 6 行的時(shí)候,異常機(jī)制有一個(gè)原則:如果在catch中遇到了return或者異常等能使該函數(shù)終止的話那么有finally就必須先執(zhí)行完finally代碼塊里面的代碼然后再返回值。因此代碼又跳到第8行,可惜第8行是一個(gè)return語(yǔ)句,那么這個(gè)時(shí)候方法就結(jié)束了,因此第6行的返回結(jié)果就無(wú)法被真正返回。如果finally僅僅是處理了一個(gè)釋放資源的操作,那么該道題最終返回的結(jié)果就是2。因此上面返回值是3。

5、Java 異常處理機(jī)制的理解?

Java對(duì)異常進(jìn)行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為 java.lang.Throwable,Throwable下面又派生了兩個(gè)子類:Error和Exception。

Error表示應(yīng)用程序本身無(wú)法克服和恢復(fù)的一種嚴(yán)重問(wèn)題。

Exception表示程序還能夠克服和恢復(fù)的問(wèn)題,其中又分為系統(tǒng)異常和普通異常。

系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的問(wèn)題,也就是軟件開(kāi)發(fā)人員考慮不周所導(dǎo)致的問(wèn)題,軟件使用者無(wú)法克服和恢復(fù)這種問(wèn)題,但在這種問(wèn)題下還可以讓軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件死掉,例如,數(shù)組下標(biāo)越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉(zhuǎn)換異常(ClassCastException)。

普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問(wèn)題,是用戶能夠克服的問(wèn)題,例如,網(wǎng)絡(luò)斷線,硬盤(pán)空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。

Java為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強(qiáng)制普通異常必須try..catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱為checked異常,而系統(tǒng)異常可以處理也可以不處理,所以編譯器不強(qiáng)制用try..catch處理或用throws聲明,所以系統(tǒng)異常也稱為unchecked異常。

6、說(shuō)出最常見(jiàn)的5個(gè)RuntimeException?

● java.lang.NullPointerException 空指針異常;出現(xiàn)原因:調(diào)用了未經(jīng)初始化的對(duì)象或者是不存在的對(duì)象。

● java.lang.ClassNotFoundException 指定的類找不到;出現(xiàn)原因:類的名稱和路徑加載錯(cuò)誤;通常都是程序試圖通過(guò)字符串來(lái)加載某個(gè)類時(shí)可能引發(fā)異常。

● java.lang.NumberFormatException 字符串轉(zhuǎn)換為數(shù)字異常;出現(xiàn)原因:字符型數(shù)據(jù)中包含非數(shù)字型字符。

● java.lang.IndexOutOfBoundsException 數(shù)組角標(biāo)越界異常,常見(jiàn)于操作數(shù)組對(duì)象時(shí)發(fā)生。

● java.lang.IllegalArgumentException 方法傳遞參數(shù)錯(cuò)誤。

● java.lang.ClassCastException 數(shù)據(jù)類型轉(zhuǎn)換異常。

● java.lang.NoClassDefFoundException 未找到類定義錯(cuò)誤。

● SQLException SQL 異常,常見(jiàn)于操作數(shù)據(jù)庫(kù)時(shí)的 SQL 語(yǔ)句錯(cuò)誤。

● java.lang.InstantiationException 實(shí)例化異常。

● java.lang.NoSuchMethodException 方法不存在異常。

7、throw 和 throws 的區(qū)別?

● throw:

throw 語(yǔ)句用在方法體內(nèi),表示拋出異常,由方法體內(nèi)的語(yǔ)句處理。

throw是具體向外拋出異常的動(dòng)作,所以它拋出的是一個(gè)異常實(shí)例,執(zhí)行throw一定是拋出了某種異常。

● throws:

throws語(yǔ)句是用在方法聲明后面,表示如果拋出異常,由該方法的調(diào)用者來(lái)進(jìn)行異常的處理。

throws主要是聲明這個(gè)方法會(huì)拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。

● throws表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這種異常。

評(píng)論0 贊同0
  •  加載中...
shenhualong

shenhualong

回答于2022-06-28 15:37

像我常用的就是牛客網(wǎng)、動(dòng)力節(jié)點(diǎn)官網(wǎng)也有不少面試題,我就是在這培訓(xùn)的,最近也剛刷完面試題,準(zhǔn)備著去面試了!!檢驗(yàn)我的時(shí)刻到了~現(xiàn)在就把之前老師給我的面試題整理下,還是挺多的,這個(gè)學(xué)校只教Java就很專業(yè)~

評(píng)論0 贊同0
  •  加載中...
CocoaChina

CocoaChina

回答于2022-06-28 15:37

公眾號(hào):Java高級(jí)架構(gòu)師,回復(fù)“面試題”,獲取1500份大廠面試真題!

評(píng)論0 贊同0
  •  加載中...
APICloud

APICloud

回答于2022-06-28 15:37

關(guān)于贏在面試的Java題系列基本收集整理完成了,所有題目都是經(jīng)過(guò)精心挑選的,很基礎(chǔ)又考驗(yàn)求職者的基本功,應(yīng)該說(shuō)被面試到的幾率很大。這里整理挑選出來(lái)供大家面試前拿來(lái)看一看。

1、a.hashCode() 有什么用?與 a.equals(b) 有什么關(guān)系?

hashCode() 方法對(duì)應(yīng)對(duì)象整型的 hash 值。它常用于基于 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關(guān)系特別緊密。根據(jù) Java 規(guī)范,兩個(gè)使用 equal() 方法來(lái)判斷相等的對(duì)象,必須具有相同的 hash code。

2、字節(jié)流與字符流的區(qū)別

要把一段二進(jìn)制數(shù)據(jù)數(shù)據(jù)逐一輸出到某個(gè)設(shè)備中,或者從某個(gè)設(shè)備中逐一讀取一段二進(jìn)制數(shù)據(jù),不管輸入輸出設(shè)備是什么,我們要用統(tǒng)一的方式來(lái)完成這些操作,用一種抽象的方式進(jìn)行描述,這個(gè)抽象描述方式起名為IO流,對(duì)應(yīng)的抽象類為OutputStream和InputStream,不同的實(shí)現(xiàn)類就代表不同的輸入和輸出設(shè)備,它們都是針對(duì)字節(jié)進(jìn)行操作的。

計(jì)算機(jī)中的一切最終都是二進(jìn)制的字節(jié)形式存在。對(duì)于經(jīng)常用到的中文字符,首先要得到其對(duì)應(yīng)的字節(jié),然后將字節(jié)寫(xiě)入到輸出流。讀取時(shí),首先讀到的是字節(jié),可是我們要把它顯示為字符,我們需要將字節(jié)轉(zhuǎn)換成字符。由于這樣的需求很廣泛,Java專門提供了字符流包裝類。

底層設(shè)備永遠(yuǎn)只接受字節(jié)數(shù)據(jù),有時(shí)候要寫(xiě)字符串到底層設(shè)備,需要將字符串轉(zhuǎn)成字節(jié)再進(jìn)行寫(xiě)入。字符流是字節(jié)流的包裝,字符流則是直接接受字符串,它內(nèi)部將串轉(zhuǎn)成字節(jié),再寫(xiě)入底層設(shè)備,這為我們向IO設(shè)備寫(xiě)入或讀取字符串提供了一點(diǎn)點(diǎn)方便。

字符向字節(jié)轉(zhuǎn)換時(shí),要注意編碼的問(wèn)題,因?yàn)樽址D(zhuǎn)成字節(jié)數(shù)組,其實(shí)是轉(zhuǎn)成該字符的某種編碼的字節(jié)形式,讀取也是反之的道理。

3、什么是Java序列化,如何實(shí)現(xiàn)Java序列化?或者請(qǐng)解釋Serializable接口的作用。

我們有時(shí)候?qū)⒁粋€(gè)Java對(duì)象變成字節(jié)流的形式傳出去或者從一個(gè)字節(jié)流中恢復(fù)成一個(gè)Java對(duì)象,例如,要將Java對(duì)象存儲(chǔ)到硬盤(pán)或者傳送給網(wǎng)絡(luò)上的其他計(jì)算機(jī),這個(gè)過(guò)程我們可以自己寫(xiě)代碼去把一個(gè)Java對(duì)象變成某個(gè)格式的字節(jié)流再傳輸。

但是,jre本身就提供了這種支持,我們可以調(diào)用OutputStream的writeObject方法來(lái)做,如果要讓Java幫我們做,要被傳輸?shù)膶?duì)象必須實(shí)現(xiàn)serializable接口,這樣,Javac編譯時(shí)就會(huì)進(jìn)行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實(shí)現(xiàn)Serializable接口,該接口是一個(gè)mini接口,其中沒(méi)有需要實(shí)現(xiàn)方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的。

例如,在web開(kāi)發(fā)中,如果對(duì)象被保存在了Session中,tomcat在重啟時(shí)要把Session對(duì)象序列化到硬盤(pán),這個(gè)對(duì)象就必須實(shí)現(xiàn)Serializable接口。如果對(duì)象要經(jīng)過(guò)分布式系統(tǒng)進(jìn)行網(wǎng)絡(luò)傳輸,被傳輸?shù)膶?duì)象就必須實(shí)現(xiàn)Serializable接口。

4、描述一下JVM加載class文件的原理機(jī)制?

JVM中類的裝載是由ClassLoader和它的子類來(lái)實(shí)現(xiàn)的,Java ClassLoader是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件。它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件的類。

5、heap和stack有什么區(qū)別。

Java的內(nèi)存分為兩類,一類是棧內(nèi)存,一類是堆內(nèi)存。棧內(nèi)存是指程序進(jìn)入一個(gè)方法時(shí),會(huì)為這個(gè)方法多帶帶分配一塊私屬存儲(chǔ)空間,用于存儲(chǔ)這個(gè)方法內(nèi)部的局部變量,當(dāng)這個(gè)方法結(jié)束時(shí),分配給這個(gè)方法的棧會(huì)釋放,這個(gè)棧中的變量也將隨之釋放。

堆是與棧作用不同的內(nèi)存,一般用于存放不在當(dāng)前方法棧中的那些數(shù)據(jù),例如,使用new創(chuàng)建的對(duì)象都放在堆里,所以,它不會(huì)隨方法的結(jié)束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。

6、GC是什么?為什么要有GC?

GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒(méi)有提供釋放已分配內(nèi)存的顯示操作方法。

7、垃圾回收的優(yōu)點(diǎn)和原理。并考慮2種回收機(jī)制。

Java語(yǔ)言中一個(gè)顯著的特點(diǎn)就是引入了垃圾回收機(jī)制,使c++程序員最頭疼的內(nèi)存管理的問(wèn)題迎刃而解,它使得Java程序員在編寫(xiě)程序的時(shí)候不再需要考慮內(nèi)存管理。由于垃圾回收機(jī)制,Java中的對(duì)象不再有"作用域"的概念,只有對(duì)象的引用才有"作用域"。

垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個(gè)多帶帶的低級(jí)別的線程運(yùn)行,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡的或者長(zhǎng)時(shí)間沒(méi)有使用的對(duì)象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收。

回收機(jī)制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。

8、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收?

對(duì)于GC來(lái)說(shuō),當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開(kāi)始監(jiān)控這個(gè)對(duì)象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對(duì)象。通過(guò)這種方式確定哪些對(duì)象是"可達(dá)的",哪些對(duì)象是"不可達(dá)的"。當(dāng)GC確定一些對(duì)象為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間。

程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語(yǔ)言規(guī)范并不保證GC一定會(huì)執(zhí)行。

9、Java中throw和throws有什么區(qū)別?

throw 用于拋出 Java.lang.Throwable 類的一個(gè)實(shí)例化對(duì)象,意思是說(shuō)你可以通過(guò)關(guān)鍵字 throw 拋出一個(gè)Exception,如:

throw new IllegalArgumentException(“XXXXXXXXX″)

而throws 的作用是作為方法聲明和簽名的一部分,方法被拋出相應(yīng)的異常以便調(diào)用者能處理。Java 中,任何未處理的受檢查異常強(qiáng)制在 throws 子句中聲明。

10、Java中會(huì)存在內(nèi)存泄漏嗎,請(qǐng)簡(jiǎn)單描述。

先解釋什么是內(nèi)存泄漏:所謂內(nèi)存泄露就是指一個(gè)不再被程序使用的對(duì)象或變量一直被占據(jù)在內(nèi)存中。Java中有垃圾回收機(jī)制,它可以保證當(dāng)對(duì)象不再被引用的時(shí)候,對(duì)象將自動(dòng)被垃圾回收器從內(nèi)存中清除掉。

由于Java使用有向圖的方式進(jìn)行垃圾回收管理,可以消除引用循環(huán)的問(wèn)題,例如有兩個(gè)對(duì)象,相互引用,只要它們和根進(jìn)程不可達(dá),那么GC也是可以回收它們的。

Java中的內(nèi)存泄露的情況:長(zhǎng)生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L(zhǎng)生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是Java中內(nèi)存泄露的發(fā)生場(chǎng)景,通俗地說(shuō),就是程序員可能創(chuàng)建了一個(gè)對(duì)象,以后一直不再使用這個(gè)對(duì)象,這個(gè)對(duì)象卻一直被引用,即這個(gè)對(duì)象無(wú)用但是卻無(wú)法被垃圾回收器回收的,這就是Java中可能出現(xiàn)內(nèi)存泄露的情況,例如,緩存系統(tǒng),我們加載了一個(gè)對(duì)象放在緩存中(例如放在一個(gè)全局map對(duì)象中),然后一直不再使用它,這個(gè)對(duì)象一直被緩存引用,但卻不再被使用。

11 、說(shuō)一說(shuō)Servlet的生命周期?

Servlet有良好的生存期的定義,包括加載和實(shí)例化、初始化、處理請(qǐng)求以及服務(wù)結(jié)束。這個(gè)生存期由Javax.servlet.Servlet接口的init(),service()和destroy方法表達(dá)。

Servlet被服務(wù)器實(shí)例化后,容器運(yùn)行其init方法,請(qǐng)求到達(dá)時(shí)運(yùn)行其service方法,service方法自動(dòng)派遣運(yùn)行與請(qǐng)求對(duì)應(yīng)的doXXX方法(doGet,doPost)等,當(dāng)服務(wù)器決定將實(shí)例銷毀的時(shí)候調(diào)用其destroy方法。

web容器加載servlet,生命周期開(kāi)始。通過(guò)調(diào)用servlet的init()方法進(jìn)行servlet的初始化。通過(guò)調(diào)用service()方法實(shí)現(xiàn),根據(jù)請(qǐng)求的不同調(diào)用不同的do***()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。

12、Servlet API中forward()與redirect()的區(qū)別?

(1).從地址欄顯示來(lái)說(shuō)

forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問(wèn)目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來(lái)的,所以它的地址欄還是原來(lái)的地址.

redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.所以redirect等于客戶端向服務(wù)器端發(fā)出兩次request,同時(shí)也接受兩次response。

(2).從數(shù)據(jù)共享來(lái)說(shuō)

forward:轉(zhuǎn)發(fā)頁(yè)面和轉(zhuǎn)發(fā)到的頁(yè)面可以共享request里面的數(shù)據(jù).

redirect:不能共享數(shù)據(jù).

redirect不僅可以重定向到當(dāng)前應(yīng)用程序的其他資源,還可以重定向到同一個(gè)站點(diǎn)上的其他應(yīng)用程序中的資源,甚至是使用絕對(duì)URL重定向到其他站點(diǎn)的資源.

forward方法只能在同一個(gè)Web應(yīng)用程序內(nèi)的資源之間轉(zhuǎn)發(fā)請(qǐng)求.forward 是服務(wù)器內(nèi)部的一種操作.

redirect 是服務(wù)器通知客戶端,讓客戶端重新發(fā)起請(qǐng)求.

所以,你可以說(shuō) redirect 是一種間接的請(qǐng)求, 但是你不能說(shuō)"一個(gè)請(qǐng)求是屬于forward還是redirect "

(3).從運(yùn)用地方來(lái)說(shuō)

forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊.

redirect:一般用于用戶注銷登陸時(shí)返回主頁(yè)面和跳轉(zhuǎn)到其它的網(wǎng)站等.

(4).從效率來(lái)說(shuō)

forward:高.

redirect:低.

13、request.getAttribute()和 request.getParameter()有何區(qū)別?

(1),request.getParameter()取得是通過(guò)容器的實(shí)現(xiàn)來(lái)取得通過(guò)類似post,get等方式傳入的數(shù)據(jù)。

request.setAttribute()和getAttribute()只是在web容器內(nèi)部流轉(zhuǎn),僅僅是請(qǐng)求處理階段。

(2),getAttribute是返回對(duì)象,getParameter返回字符串

(3),getAttribute()一向是和setAttribute()一起使用的,只有先用setAttribute()設(shè)置之后,才能夠通過(guò)getAttribute()來(lái)獲得值,它們傳遞的是Object類型的數(shù)據(jù)。而且必須在同一個(gè)request對(duì)象中使用才有效。,而getParameter()是接收表單的get或者post提交過(guò)來(lái)的參數(shù)

14、jsp靜態(tài)包含和動(dòng)態(tài)包含的區(qū)別

(1)、<%@include file="xxx.jsp"%>為jsp中的編譯指令,其文件的包含是發(fā)生在jsp向servlet轉(zhuǎn)換的時(shí)期,而<jsp:include page="xxx.jsp">是jsp中的動(dòng)作指令,其文件的包含是發(fā)生在編譯時(shí)期,也就是將Java文件編譯為class文件的時(shí)期

(2)、使用靜態(tài)包含只會(huì)產(chǎn)生一個(gè)class文件,而使用動(dòng)態(tài)包含會(huì)產(chǎn)生多個(gè)class文件

(3)、使用靜態(tài)包含,包含頁(yè)面和被包含頁(yè)面的request對(duì)象為同一對(duì)象,因?yàn)殪o態(tài)包含只是將被包含的頁(yè)面的內(nèi)容復(fù)制到包含的頁(yè)面中去;而動(dòng)態(tài)包含包含頁(yè)面和被包含頁(yè)面不是同一個(gè)頁(yè)面,被包含的頁(yè)面的request對(duì)象可以取到的參數(shù)范圍要相對(duì)大些,不僅可以取到傳遞到包含頁(yè)面的參數(shù),同樣也能取得在包含頁(yè)面向下傳遞的參數(shù)。

15 、MVC的各個(gè)部分都有那些技術(shù)來(lái)實(shí)現(xiàn)?如何實(shí)現(xiàn)?

MVC是Model-View-Controller的簡(jiǎn)寫(xiě)。Model代表的是應(yīng)用的業(yè)務(wù)邏輯(通過(guò)JavaBean,EJB組件實(shí)現(xiàn)),View是應(yīng)用的表示面(由JSP頁(yè)面產(chǎn)生),Controller是提供應(yīng)用的處理過(guò)程控制(一般是一個(gè)Servlet),通過(guò)這種設(shè)計(jì)模型把應(yīng)用邏輯,處理過(guò)程和顯示邏輯分成不同的組件實(shí)現(xiàn)。這些組件可以進(jìn)行交互和重用。

16、jsp有哪些內(nèi)置對(duì)象?作用分別是什么?

JSP共有以下9個(gè)內(nèi)置的對(duì)象:

(1),request 用戶端請(qǐng)求,此請(qǐng)求會(huì)包含來(lái)自GET/POST請(qǐng)求的參數(shù)

(2),response 網(wǎng)頁(yè)傳回用戶端的回應(yīng)

(3),pageContext 網(wǎng)頁(yè)的屬性是在這里管理

(4),session 與請(qǐng)求有關(guān)的會(huì)話期

(5),application servlet 正在執(zhí)行的內(nèi)容

(6),out 用來(lái)傳送回應(yīng)的輸出

(7),config servlet的構(gòu)架部件

(8),page JSP網(wǎng)頁(yè)本身

(9),exception 針對(duì)錯(cuò)誤網(wǎng)頁(yè),未捕捉的例外

17 、Http中,get和post方法的區(qū)別

(1),Get是向服務(wù)器發(fā)索取數(shù)據(jù)的一種請(qǐng)求,而Post是向服務(wù)器提交數(shù)據(jù)的一種請(qǐng)求

(2),Get是獲取信息,而不是修改信息,類似數(shù)據(jù)庫(kù)查詢功能一樣,數(shù)據(jù)不會(huì)被修改

(3),Get請(qǐng)求的參數(shù)會(huì)跟在url后進(jìn)行傳遞,請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,%XX中的XX為該符號(hào)以16進(jìn)制表示的ASCII,如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密。

(4),Get傳輸?shù)臄?shù)據(jù)有大小限制,因?yàn)镚ET是通過(guò)URL提交數(shù)據(jù),那么GET可提交的數(shù)據(jù)量就跟URL的長(zhǎng)度有直接關(guān)系了,不同的瀏覽器對(duì)URL的長(zhǎng)度的限制是不同的。

(5),GET請(qǐng)求的數(shù)據(jù)會(huì)被瀏覽器緩存起來(lái),用戶名和密碼將明文出現(xiàn)在URL上,其他人可以查到歷史瀏覽記錄,數(shù)據(jù)不太安全。

在服務(wù)器端,用Request.QueryString來(lái)獲取Get方式提交來(lái)的數(shù)據(jù)Post請(qǐng)求則作為http消息的實(shí)際內(nèi)容發(fā)送給web服務(wù)器,數(shù)據(jù)放置在HTML Header內(nèi)提交,Post沒(méi)有限制提交的數(shù)據(jù)。Post比Get安全,當(dāng)數(shù)據(jù)是中文或者不敏感的數(shù)據(jù),則用get,因?yàn)槭褂胓et,參數(shù)會(huì)顯示在地址,對(duì)于敏感數(shù)據(jù)和不是中文字符的數(shù)據(jù),則用post。

(6),POST表示可能修改變服務(wù)器上的資源的請(qǐng)求,在服務(wù)器端,用Post方式提交的數(shù)據(jù)只能用Request.Form來(lái)獲取。

(僅供參考,如果有更好的回答,歡迎探討)

18 、什么是cookie?Session和cookie有什么區(qū)別?

Cookie是會(huì)話技術(shù),將用戶的信息保存到瀏覽器的對(duì)象.

區(qū)別:

(1)cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上

(2)cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,如果主要考慮到安全應(yīng)當(dāng)使用session

(3)session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能,如果主要考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE

(4)單個(gè)cookie在客戶端的限制是3K,就是說(shuō)一個(gè)站點(diǎn)在客戶端存放的COOKIE不能3K。

結(jié)論:

將登陸信息等重要信息存放為SESSION;其他信息如果需要保留,可以放在COOKIE中。

19 、jsp和servlet的區(qū)別、共同點(diǎn)、各自應(yīng)用的范圍?

JSP是Servlet技術(shù)的擴(kuò)展,本質(zhì)上就是Servlet的簡(jiǎn)易方式。JSP編譯后是“類servlet”。

Servlet和JSP最主要的不同點(diǎn)在于:Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開(kāi)來(lái)。而JSP的情況是Java和HTML可以組合成一個(gè)擴(kuò)展名為.jsp的文件。

JSP側(cè)重于視圖,Servlet主要用于控制邏輯。在struts框架中,JSP位于MVC設(shè)計(jì)模式的視圖層,而Servlet位于控制層.

20 、tomcat容器是如何創(chuàng)建servlet類實(shí)例?用到了什么原理?

當(dāng)容器啟動(dòng)時(shí),會(huì)讀取在webapps目錄下所有的web應(yīng)用中的web.xml文件,然后對(duì)xml文件進(jìn)行解析,并讀取servlet注冊(cè)信息。然后,將每個(gè)應(yīng)用中注冊(cè)的servlet類都進(jìn)行加載,并通過(guò)反射的方式實(shí)例化。(有時(shí)候也是在第一次請(qǐng)求時(shí)實(shí)例化)在servlet注冊(cè)時(shí)加上<load-on-startup>1</load-on-startup>如果為正數(shù),則在一開(kāi)始就實(shí)例化,如果不寫(xiě)或?yàn)樨?fù)數(shù),則第一次請(qǐng)求實(shí)例化。

21、JDBC訪問(wèn)數(shù)據(jù)庫(kù)的基本步驟是什么?

(1),加載驅(qū)動(dòng)

(2),通過(guò)DriverManager對(duì)象獲取連接對(duì)象Connection

(3),通過(guò)連接對(duì)象獲取會(huì)話

(4),通過(guò)會(huì)話進(jìn)行數(shù)據(jù)的增刪改查,封裝對(duì)象

(5),關(guān)閉資源

22 、說(shuō)說(shuō)preparedStatement和Statement的區(qū)別

(1),效率:預(yù)編譯會(huì)話比普通會(huì)話對(duì)象,數(shù)據(jù)庫(kù)系統(tǒng)不會(huì)對(duì)相同的sql語(yǔ)句不會(huì)再次編譯

(2),安全性:可以有效的避免sql注入攻擊!sql注入攻擊就是從客戶端輸入一些非法的特殊字符,而使服務(wù)器端在構(gòu)造sql語(yǔ)句的時(shí)候仍然能夠正確構(gòu)造,從而收集程序和服務(wù)器的信息和數(shù)據(jù)。比如:“select * from t_user where userName = ‘” + userName + “ ’ and password =’” + password + “’”如果用戶名和密碼輸入的是’1’ or ‘1’=’1’ ; 則生產(chǎn)的sql語(yǔ)句是:“select * from t_user where userName = ‘1’ or ‘1’ =’1’ and password =’1’ or ‘1’=’1’ 這個(gè)語(yǔ)句中的where 部分沒(méi)有起到對(duì)數(shù)據(jù)篩選的作用。

23 、說(shuō)說(shuō)事務(wù)的概念,在JDBC編程中處理事務(wù)的步驟。

(1) 事務(wù)是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。

(2),一個(gè)邏輯工作單元必須有四個(gè)屬性,稱為原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成為一個(gè)事務(wù)

事務(wù)處理步驟:

(3),conn.setAutoComit(false);設(shè)置提交方式為手工提交

(4),conn.commit()提交事務(wù)

(5),出現(xiàn)異常,回滾 conn.rollback();

24 、數(shù)據(jù)庫(kù)連接池的原理。為什么要使用連接池。

(1),數(shù)據(jù)庫(kù)連接是一件費(fèi)時(shí)的操作,連接池可以使多個(gè)操作共享一個(gè)連接。

(2),數(shù)據(jù)庫(kù)連接池的基本思想就是為數(shù)據(jù)庫(kù)連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。我們可以通過(guò)設(shè)定連接池最大連接數(shù)來(lái)防止系統(tǒng)無(wú)盡的與數(shù)據(jù)庫(kù)連接。更為重要的是我們可以通過(guò)連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫(kù)的連接的數(shù)量、使用情況,為系統(tǒng)開(kāi)發(fā),測(cè)試及性能調(diào)整提供依據(jù)。

(3),使用連接池是為了提高對(duì)數(shù)據(jù)庫(kù)連接資源的管理

25 、JDBC的臟讀是什么?哪種數(shù)據(jù)庫(kù)隔離級(jí)別能防止臟讀?

當(dāng)我們使用事務(wù)時(shí),有可能會(huì)出現(xiàn)這樣的情況,有一行數(shù)據(jù)剛更新,與此同時(shí)另一個(gè)查詢讀到了這個(gè)剛更新的值。這樣就導(dǎo)致了臟讀,因?yàn)楦碌臄?shù)據(jù)還沒(méi)有進(jìn)行持久化,更新這行數(shù)據(jù)的業(yè)務(wù)可能會(huì)進(jìn)行回滾,這樣這個(gè)數(shù)據(jù)就是無(wú)效的。數(shù)據(jù)庫(kù)的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和TRANSACTION_SERIALIZABLE隔離級(jí)別可以防止臟讀。

26 、什么是幻讀,哪種隔離級(jí)別可以防止幻讀?

幻讀是指一個(gè)事務(wù)多次執(zhí)行一條查詢返回的卻是不同的值。假設(shè)一個(gè)事務(wù)正根據(jù)某個(gè)條件進(jìn)行數(shù)據(jù)查詢,然后另一個(gè)事務(wù)插入了一行滿足這個(gè)查詢條件的數(shù)據(jù)。之后這個(gè)事務(wù)再次執(zhí)行了這條查詢,返回的結(jié)果集中會(huì)包含剛插入的那條新數(shù)據(jù)。這行新數(shù)據(jù)被稱為幻行,而這種現(xiàn)象就叫做幻讀。

只有TRANSACTION_SERIALIZABLE隔離級(jí)別才能防止產(chǎn)生幻讀。

27 、JDBC的DriverManager是用來(lái)做什么的?

JDBC的DriverManager是一個(gè)工廠類,我們通過(guò)它來(lái)創(chuàng)建數(shù)據(jù)庫(kù)連接。當(dāng)JDBC的Driver類被加載進(jìn)來(lái)時(shí),它會(huì)自己注冊(cè)到DriverManager類里面然后我們會(huì)把數(shù)據(jù)庫(kù)配置信息傳成DriverManager.getConnection()方法,DriverManager會(huì)使用注冊(cè)到它里面的驅(qū)動(dòng)來(lái)獲取數(shù)據(jù)庫(kù)連接,并返回給調(diào)用的程序。

28、execute,executeQuery,executeUpdate的區(qū)別是什么?

(1),Statement的execute(String query)方法用來(lái)執(zhí)行任意的SQL查詢,如果查詢的結(jié)果是一個(gè)ResultSet,這個(gè)方法就返回true。如果結(jié)果不是ResultSet,比如insert或者update查詢,它就會(huì)返回false。我們可以通過(guò)它的getResultSet方法來(lái)獲取ResultSet,或者通過(guò)getUpdateCount()方法來(lái)獲取更新的記錄條數(shù)。

(2),Statement的executeQuery(String query)接口用來(lái)執(zhí)行select查詢,并且返回ResultSet。即使查詢不到記錄返回的ResultSet也不會(huì)為null。我們通常使用executeQuery來(lái)執(zhí)行查詢語(yǔ)句,這樣的話如果傳進(jìn)來(lái)的是insert或者update語(yǔ)句的話,它會(huì)拋出錯(cuò)誤信息為 “executeQuery method can not be used for update”的java.util.SQLException。

(3),Statement的executeUpdate(String query)方法用來(lái)執(zhí)行insert或者update/delete(DML)語(yǔ)句,或者 什么也不返回,對(duì)于DDL語(yǔ)句,返回值是int類型,如果是DML語(yǔ)句的話,它就是更新的條數(shù),如果是DDL的話,就返回0。只有當(dāng)你不確定是什么語(yǔ)句的時(shí)候才應(yīng)該使用execute()方法,否則應(yīng)該使用executeQuery或者executeUpdate方法。

29、SQL查詢出來(lái)的結(jié)果分頁(yè)展示一般怎么做?

Oracle:

MySQL:

sql server:

30、JDBC的ResultSet是什么?

在查詢數(shù)據(jù)庫(kù)后會(huì)返回一個(gè)ResultSet,它就像是查詢結(jié)果集的一張數(shù)據(jù)表。ResultSet對(duì)象維護(hù)了一個(gè)游標(biāo),指向當(dāng)前的數(shù)據(jù)行。開(kāi)始的時(shí)候這個(gè)游標(biāo)指向的是第一行。如果調(diào)用了ResultSet的next()方法游標(biāo)會(huì)下移一行,如果沒(méi)有更多的數(shù)據(jù)了,next()方法會(huì)返回false。可以在for循環(huán)中用它來(lái)遍歷數(shù)據(jù)集。默認(rèn)的ResultSet是不能更新的,游標(biāo)也只能往下移。也就是說(shuō)你只能從第一行到最后一行遍歷一遍。不過(guò)也可以創(chuàng)建可以回滾或者可更新的ResultSet

當(dāng)生成ResultSet的Statement對(duì)象要關(guān)閉或者重新執(zhí)行或是獲取下一個(gè)ResultSet的時(shí)候,ResultSet對(duì)象也會(huì)自動(dòng)關(guān)閉。可以通過(guò)ResultSet的getter方法,傳入列名或者從1開(kāi)始的序號(hào)來(lái)獲取列數(shù)據(jù)。

以上就是我總結(jié)的這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值。

評(píng)論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長(zhǎng)該話題
  • 回答過(guò)該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說(shuō)句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<