Java WEB 初中級(jí)程序員面試寶典_第1頁(yè)
Java WEB 初中級(jí)程序員面試寶典_第2頁(yè)
Java WEB 初中級(jí)程序員面試寶典_第3頁(yè)
Java WEB 初中級(jí)程序員面試寶典_第4頁(yè)
Java WEB 初中級(jí)程序員面試寶典_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java初中級(jí)程序員面試題寶典

Java基礎(chǔ)部分

&與&&區(qū)別?

&和&&都是邏輯運(yùn)算符,都是判斷兩邊同時(shí)真則為真,否則為假;

但是&&當(dāng)?shù)谝粋€(gè)條件不成之后,后面的條件都不執(zhí)行了,而&則

還是繼續(xù)執(zhí)行,直到整個(gè)條件語(yǔ)句執(zhí)行完為止。

使用final關(guān)鍵字修飾一個(gè)變量時(shí),是引用不能變,還是引用的對(duì)

象不能變?

使用final關(guān)鍵字修飾一個(gè)變量時(shí),是指引用變量不能變,引用變

量所指向的對(duì)象中的內(nèi)容還是可以改變的。

靜態(tài)變量和實(shí)例變量的區(qū)別?

在語(yǔ)法定義上的區(qū)別:

靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加。

在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對(duì)象的屬性,必須創(chuàng)建了

實(shí)例對(duì)象,其中的實(shí)例變量才會(huì)被分配空間,才能使用這個(gè)實(shí)例變

量。

靜態(tài)變量不屬于某個(gè)實(shí)例對(duì)象,而是屬于類,所以也稱為類變量,

只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對(duì)象,靜態(tài)變量就

會(huì)被分配空間,靜態(tài)變量就可以被使用了。

總之,實(shí)例變量必須創(chuàng)建對(duì)象后才可以通過(guò)這個(gè)對(duì)象來(lái)使用,靜態(tài)

變量則可以直接使用類名來(lái)引用。

靜態(tài)變量使用時(shí),通過(guò)類名.名稱,實(shí)例變量必須要初始化后才能使用。

實(shí)例變量是實(shí)例化后才會(huì)分配空間,而靜態(tài)變量當(dāng)類加載時(shí)會(huì)分配空

間。

是否可以從一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用?

不可以。因?yàn)榉莝tatic方法是要與對(duì)象關(guān)聯(lián)在一起的,必須創(chuàng)建

一個(gè)對(duì)象后,才可以在該對(duì)象上進(jìn)行方法調(diào)用,而static方法調(diào)

用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,可以直接調(diào)用。也就是說(shuō),當(dāng)一個(gè)static

方法被調(diào)用時(shí),可能還沒(méi)有創(chuàng)建任何實(shí)例對(duì)象,如果從一個(gè)static

方法中發(fā)出對(duì)非static方法的調(diào)用,那個(gè)非static方法是關(guān)聯(lián)

到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無(wú)法成立,所以,一個(gè)static方法

內(nèi)部發(fā)出對(duì)非static方法的調(diào)用。

非static方法可以訪問(wèn)static方法.

static方法不能訪問(wèn)非static方法

“=="和equals方法究竟有什么區(qū)別?

==如果判斷值類型的話,判斷內(nèi)容是否相同。如果判斷引用類型

則是判斷內(nèi)存地址是否相同

Equals判斷值內(nèi)容是否相等

Integer與int的區(qū)別

Integer是引用類型,默認(rèn)值是null。而int是是值類型默認(rèn)值是

0

請(qǐng)說(shuō)出作用域public,private,protected,以及不寫時(shí)的

區(qū)別

這四個(gè)作用域的可見(jiàn)范圍如下表所示。

些明:如果在修飾的元素上面沒(méi)有寫任何訪問(wèn)修飾符,則表

示friendlyo

作用域當(dāng)前類同一包(package)子孫類其他包

(package)

publicNd4d

protectedN74x

friendlyNdxx

private4xxx

重載與重寫區(qū)別?

重載是同一個(gè)類中,方法名稱相同,但是參數(shù)或個(gè)數(shù)不同。與返回

值沒(méi)有關(guān)系。

重寫是在多個(gè)類中,產(chǎn)生繼承關(guān)系。父類與子類的方法方法必須相

同。

接口與抽象類的區(qū)別?

區(qū)別:定義接口的關(guān)鍵字是:interface而定義抽象類的關(guān)鍵字是:

abstracto

接口中成員不能有私有,抽象類可以。

接口中定義的成員,是finlpublicstatic類型,抽象類沒(méi)有。

接口中的不能有普通方法,抽象類中可以。

相同:

兩個(gè)都不new

但是接口與抽象類是面向?qū)ο蟊貍渲R(shí),設(shè)計(jì)模式、重構(gòu)代碼有必

然作用

final,finally,finalize的區(qū)別。

final用于聲明屬性,方法和類,分別表示屬性不可變,方法不可

覆蓋,類不可繼承。

內(nèi)部類要訪問(wèn)局部變量,局部變量必須定義成final類型,例如,

一段代碼……

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

finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候

會(huì)調(diào)用被回收對(duì)象的此方法,可

以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件

等。JVM不保證此方法總被

調(diào)用

String、StringBuffer與StringBuilder的區(qū)別

String字符串常量

StringBuffer字符串變量(線程安全)

StringBuilder字符串變量(非線程安全)

所有的類都繼承于object類,你用過(guò)的object類的直接子類有哪

些,object類常用的方法

有哪些

1.clone方法

保護(hù)方法,實(shí)現(xiàn)對(duì)象的淺復(fù)制,只有實(shí)現(xiàn)了Cloneable接口才可以

調(diào)用該方法,否則拋出CloneNotSupportedException異常。

2.getClass方法

final方法,獲得運(yùn)行時(shí)類型。

3.toString方法

該方法用得比較多,一般子類都有覆蓋。

4.finalize方法

該方法用于釋放資源。因?yàn)闊o(wú)法確定該方法什么時(shí)候被調(diào)用,很少

使用。

5.equals方法

該方法是非常重要的一個(gè)方法。一般equals和==是不一樣的,但是

在Object中兩者是一樣的。子類一般都要重寫這個(gè)方法。

6.數(shù)組有沒(méi)有l(wèi)ength。這個(gè)方法?String有沒(méi)有l(wèi)ength。這個(gè)方

法?

答:數(shù)組沒(méi)有l(wèi)ength。這個(gè)方法,有l(wèi)ength的屬性。String有有

length。這個(gè)方法。

7.hashCode方法

該方法用于哈希查找,重寫了equals方法一般都要重寫hashCode

方法。這個(gè)方法在一些具有哈希功能的Collection中用到。

一般必須滿足objl.equals(obj2)==true。可以推出objl.hash-

Code()==obj2.hashCode(),但是hashCode相等不一定就滿足

equalSo不過(guò)為了提高效率,應(yīng)該盡量使上面兩個(gè)條件接近等價(jià)。

7.wait方法

wait方法就是使當(dāng)前線程等待該對(duì)象的鎖,當(dāng)前線程必須是該對(duì)象

的擁有者,也就是具有該對(duì)象的鎖。wait。方法一直等待,直到獲

得鎖或者被中斷。wait(longtimeout)設(shè)定一個(gè)超時(shí)間隔,如果在

規(guī)定時(shí)間內(nèi)沒(méi)有獲得鎖就返回。

調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài),直到以下事件發(fā)生。

(1)其他線程調(diào)用了該對(duì)象的notify方法。

(2)其他線程調(diào)用了該對(duì)象的notifyAll方法。

(3)其他線程調(diào)用了interrupt中斷該線程。

(4)時(shí)間間隔到了。

此時(shí)該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個(gè)

InterruptedException異常。

8.notify方法

該方法喚醒在該對(duì)象上等待的某個(gè)線程。

9.notifyAll方法

該方法喚醒在該對(duì)象上等待的所有線程

反射的優(yōu)缺點(diǎn)?

反射:就是正在運(yùn)行動(dòng)態(tài)讀取這個(gè)類的完整信息。

優(yōu)點(diǎn):java的反射機(jī)制就是增加程序的靈活性、

缺點(diǎn):缺點(diǎn):(1)性能問(wèn)題:使用反射基本上是一種解釋操作,

用于字段和方法接入時(shí)要遠(yuǎn)慢于直接代碼。因此反射機(jī)制主要應(yīng)用

在對(duì)靈活性和擴(kuò)展性要求很高的系統(tǒng)框架上,普通程序不建議使用o

(2)使用反射會(huì)模糊程序內(nèi)內(nèi)部邏輯:程序員希望在源代碼中看到

程序的邏輯,反射等繞過(guò)了源代碼的技術(shù),因而會(huì)帶來(lái)維護(hù)問(wèn)題。

反射代碼比相應(yīng)的直接代碼更復(fù)雜。

那些地方用到了反射?

例如:jdbc、Java常用框架、jdk的動(dòng)態(tài)代理、android的加載布局

文件

java中有幾種類型的流?JDK為每種類型的流提供了一些抽象

類以供繼承,為每種類型的流提供了一些抽象類以供繼承,

請(qǐng)說(shuō)出他們分別是哪些類?

字節(jié)流,字符流。字節(jié)流繼承于InputstreamOutputstream,

字符流繼承于

InputStreamReaderOutputStreamWritero在java.io包中還有

許多其他的流,主要是為了提

高性能和使用方便。

多線程部分

什么是多線程?

在一個(gè)應(yīng)用程序中,同時(shí),有多個(gè)不同的執(zhí)行路徑。

說(shuō)一下多線程的好處?

提供程序效率。

線程和進(jìn)程有什么區(qū)別?

線程是進(jìn)程的一條執(zhí)行路徑,而進(jìn)程是線程的集合。

什么是線程同步、異步?

線程同步表示,當(dāng)前線程執(zhí)行完后下一個(gè)線程接著執(zhí)行。

線程異步表示,在一個(gè)應(yīng)用程序中,同時(shí),有多個(gè)不同的執(zhí)行路

徑。例如javawebajaxandroidhandler

線程之間如何同步

線程之間同步使用synchronized、wait與notify

什么是線程不安全?如何解決?(重點(diǎn))

就是在多個(gè)線程共享同一個(gè)數(shù)據(jù)會(huì)受到其他線程的干擾。如何解

決:使用線程同步技術(shù),用上鎖(synchronized)。讓一個(gè)線程執(zhí)行

完了,在讓另一個(gè)線程執(zhí)行。

如何創(chuàng)建一個(gè)線程?有幾種方法?

繼承thread類,重寫run方法、實(shí)現(xiàn)Runnalbe接口,重新

run方法,啟動(dòng)一個(gè)線程用start();

是使用Runnalbe接口好?還是繼承Thread類好?

是實(shí)現(xiàn)Runnalbe接口好,因?yàn)閷?shí)現(xiàn)的接口還可以繼續(xù)繼承。如

果繼承了Thread類不能在繼承。

sleep。和wait。有什么區(qū)別?

a、sleep是讓當(dāng)前線程指定休眠時(shí)間,然后繼續(xù)工作不釋

放鎖

b、讓當(dāng)前線程wait則是等待,直到有線程通知notify()

喚醒他才會(huì)重新工作。釋放鎖

集合相關(guān)面試題

java中集合類的關(guān)系圖

Iterator1:Collect]on匕:Map

:ProducesIjProducest

AAA

|HashMa^j

Listiterator:■<<List:SetTreeMap

Reduces

Ar

LinkedHashMap

ArrayListLinkedjstIHashSetITreeSet

UnkedHashSet

iComparable<7Comparator;

說(shuō)一下數(shù)據(jù)結(jié)構(gòu)中的什么是數(shù)組?什么是鏈表?

所謂數(shù)組,是相同數(shù)據(jù)類型的元素按一定順序排列的集合

數(shù)組:存儲(chǔ)區(qū)間是連續(xù)的,占用內(nèi)存嚴(yán)重,故空間復(fù)雜的很大。但

數(shù)組的二分查找時(shí)間復(fù)雜度小,為0(1);數(shù)組的特點(diǎn)是;尋址容

易,插入和刪除困難;

所謂鏈表,鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),

數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由

一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行

時(shí)動(dòng)態(tài)生成。每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)

域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。相比于線性表順序結(jié)

構(gòu),操作復(fù)雜。由于不必須按順序存儲(chǔ),鏈表在插入的時(shí)候可以達(dá)

到0(1)的復(fù)雜度,比另一種線性表順序表快得多,但是查找一個(gè)節(jié)

點(diǎn)或者訪問(wèn)特定編號(hào)的節(jié)點(diǎn)則需要o(n)的時(shí)間,而線性表和順序表

相應(yīng)的時(shí)間復(fù)雜度分別是0(logn)和0(1)。

鏈表:鏈表存儲(chǔ)區(qū)間離散,占用內(nèi)存比較寬松,故空間復(fù)雜度很小,

但時(shí)間復(fù)雜度很大,達(dá)0(N)。鏈表的特點(diǎn)是:尋址困難,插入和

刪除容易。

說(shuō)一下什么是哈希表

那么我們能不能綜合兩者的特性,做出一種尋址容易,插入刪除也

容易的數(shù)據(jù)結(jié)構(gòu)?答案是肯定的,這就是我們要提起的哈希表。哈

希表((Hashtable)既滿足了數(shù)據(jù)的查找方便,同時(shí)不占用太多

的內(nèi)容空間,使用也十分方便。

哈希表有多種不同的實(shí)現(xiàn)方法,我接下來(lái)解釋的是最常用的一

種方法一一拉鏈法,我們可以理解為“鏈表的數(shù)組”,如圖:

0

T1

T

T

T

~5

y

T

T

5

ioa26

i791

12~V2L—*28

13T

14

15

說(shuō)一下ArrayList底層實(shí)現(xiàn)方式?

①ArrayList通過(guò)數(shù)組實(shí)現(xiàn),一旦我們實(shí)例化ArrayList無(wú)參數(shù)構(gòu)

造函數(shù)默認(rèn)為數(shù)組初始化長(zhǎng)度為10

②add方法底層實(shí)現(xiàn)如果增加的元素個(gè)數(shù)超過(guò)了10個(gè),那么

ArrayList底層會(huì)新生成一個(gè)數(shù)組,長(zhǎng)度為原數(shù)組的1.5倍+L然

后將原數(shù)組的內(nèi)容復(fù)制到新數(shù)組當(dāng)中,并且后續(xù)增加的內(nèi)容都會(huì)放

到新數(shù)組當(dāng)中。當(dāng)新數(shù)組無(wú)法容納增加的元素時(shí),重復(fù)該過(guò)程。是

一旦數(shù)組超出長(zhǎng)度,就開(kāi)始擴(kuò)容數(shù)組。擴(kuò)容數(shù)組調(diào)用的方法

Arrays.copyOf(objArr,objArr.length+1);

說(shuō)一下LinkedList底層實(shí)現(xiàn)方式?

LinkedList底層的數(shù)據(jù)結(jié)構(gòu)是基于雙向循環(huán)鏈表的,且頭結(jié)點(diǎn)中不

存放數(shù)據(jù),如下:

Head節(jié)點(diǎn),不包含數(shù)據(jù)

datadata

既然是雙向鏈表,那么必定存在一種數(shù)據(jù)結(jié)構(gòu)一一我們可以稱之為

節(jié)點(diǎn),節(jié)點(diǎn)實(shí)例保存業(yè)務(wù)數(shù)據(jù),前一個(gè)節(jié)點(diǎn)的位置信息和后一個(gè)節(jié)

點(diǎn)位置信息,如下圖所示:

[節(jié)點(diǎn)N

節(jié)點(diǎn)N-1前節(jié)點(diǎn)信息業(yè)務(wù)數(shù)據(jù)后節(jié)點(diǎn)信息節(jié)點(diǎn)N+1

說(shuō)一下HashMap底層實(shí)現(xiàn)方式?

HashMap是由數(shù)組+鏈表組成

put方法底層實(shí)現(xiàn):

通過(guò)key的hash值%£11宜丫[].length得到該存儲(chǔ)的下標(biāo)位置,如果

多個(gè)key的hash值%£成燈口.length值相同話就就會(huì)存儲(chǔ)到該鏈表

的后面。

ArrayList和Vector的區(qū)別

這兩個(gè)類都實(shí)現(xiàn)了List接口(List接口繼承了

Collection接口),他們都是有序集合,即存儲(chǔ)在這兩個(gè)集合中的元

素的位置都是有順序的,相當(dāng)于一種動(dòng)態(tài)的數(shù)組,我們以后可以按位

置索引號(hào)取出某個(gè)元素,并且其中的數(shù)據(jù)是允許重復(fù)的,

ArrayList與Vector的區(qū)別,這主要包括兩個(gè)方面:.

⑴同步性:

Vector是線程安全的,也就是說(shuō)是它的方法之間是線程同步的,

而ArrayList是線程序不安全的,它的方法之間是線程不同步的。

如果只有一個(gè)線程會(huì)訪問(wèn)到集合,那最好是使用ArrayList,因?yàn)樗?/p>

不考慮線程安全,效率會(huì)高些;如果有多個(gè)線程會(huì)訪問(wèn)到集合,那最好

是使用Vector,因?yàn)椴恍枰覀冏约涸偃タ紤]和編寫線程安全的代

碼。

(2)數(shù)據(jù)增長(zhǎng):

ArrayList與Vector都有一個(gè)初始的容量大小,當(dāng)存儲(chǔ)進(jìn)它們

里面的元素的個(gè)數(shù)超過(guò)了容量時(shí),就需要增

加ArrayList與Vector的存儲(chǔ)空間,每次要增加存儲(chǔ)空間時(shí),

不是只增加一個(gè)存儲(chǔ)單元,而是增加多個(gè)存儲(chǔ)單元,每次增加的存儲(chǔ)

單元的個(gè)數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。

Vector默認(rèn)增長(zhǎng)為原來(lái)兩倍,而ArrayList的增長(zhǎng)策略在文檔

中沒(méi)有明確規(guī)定(從源代碼看到的是增長(zhǎng)為原來(lái)的1.5倍)。

ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還

可以設(shè)置增長(zhǎng)的空間大小,而ArrayList沒(méi)有提供設(shè)置增長(zhǎng)空間

的方法。

HashMap和Hashtable的區(qū)別

總結(jié):

克允許有HashMap是HashMap

方法不是

呈有效率containsvalueJaval.2引是

Synchronize

hashmap>'null高一和進(jìn)的MapHashtable

的要提供外

E的鍵點(diǎn)、containsKeyinterface的輕量級(jí)

同步

R和值方法的一個(gè)實(shí)現(xiàn)實(shí)現(xiàn)

我不允、

Hashtable

告許有效率方法是是Hashtable

有contains方比

hashtable_三null稍Synchronize繼承于

法方法HashMap

:的鍵低、的Dictionary

要舊

亡和值類

List和Set、Map區(qū)別?

Java中的集合包括三大類,它們是Set、List和Map,它們都處于

java.util包中,Set、List和Map都是接口,它們有各自的實(shí)現(xiàn)類。

Set的實(shí)現(xiàn)類主要有HashSet和TreeSet,List的實(shí)現(xiàn)類主要有

ArrayList,Map的實(shí)現(xiàn)類主要有HashMap和TreeMap。

Set中的對(duì)象不按特定方式排序,并且沒(méi)有重復(fù)對(duì)象。但它的

有些實(shí)現(xiàn)類能對(duì)集合中的對(duì)象按特定方式排序,例如TreeSet類,

它可以按照默認(rèn)排序,也可以通過(guò)實(shí)現(xiàn)

java.util.Comparator〈Type>接口來(lái)自定義排序方式。

List中的對(duì)象按照索引位置排序,可以有重復(fù)對(duì)象,允許按照

對(duì)象在集合中的索引位置檢索對(duì)象,如通過(guò)list,get(i)方式來(lái)獲

得List集合中的元素。

Map中的每一個(gè)元素包含一個(gè)鍵對(duì)象和值對(duì)象,它們成對(duì)出現(xiàn)。

鍵對(duì)象不能重復(fù),值對(duì)象可以重復(fù)。

List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)?

list:存儲(chǔ):有序的可重復(fù)的

訪問(wèn):可以for循環(huán),foreach循環(huán),iterator迭代器迭代。

set:存儲(chǔ):無(wú)序的不重復(fù)的

訪問(wèn):可以foreach循環(huán),iterator迭代器迭代

map:存儲(chǔ):存儲(chǔ)的是一對(duì)一對(duì)的映射“key=value",key值是

無(wú)序,不重復(fù)的。value值可重復(fù)

訪問(wèn):可以map中key值轉(zhuǎn)為為set存儲(chǔ),然后迭代這個(gè)set,用

map.get(key)獲取value

也可以轉(zhuǎn)換為entry對(duì)象用迭代器迭代

說(shuō)出ArrayList,Vector,LinkedList的存儲(chǔ)性能和特性

ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素?cái)?shù)

大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號(hào)

索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索

引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法

(線程安全),通常性能上較ArrayList差,而LinkedList使用雙

向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是

插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。

去掉一個(gè)Vector集合中重復(fù)的元素

通過(guò)Vector,contains()方法判斷是否包含該元素,如果沒(méi)有包

含就添加到新的集合當(dāng)中,適用于數(shù)據(jù)較小的情況下。

Collection和Collections的區(qū)別。

Collection是集合類的上級(jí)接口,繼承于它的接口主要有Set和

ListoCollections是針對(duì)集合類的一個(gè)幫助類,它提供了一系列

靜態(tài)方法實(shí)現(xiàn)了對(duì)各種集合的排序,搜索和線程安全等操作。

Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢?是

用==還是equals()?它們有何區(qū)別?

set里的元素是不能重復(fù)的,用iterator。方法來(lái)區(qū)分重復(fù)與否。

equals方法(是String類從它的超類Object中繼承的)被用來(lái)檢

測(cè)兩個(gè)對(duì)象是否相等,即兩個(gè)對(duì)象的內(nèi)容是否相等。

==用于比較引用和比較基本數(shù)據(jù)類型時(shí)具有不同的功能:

比較基本數(shù)據(jù)類型,如果兩個(gè)值相同,則結(jié)果為true

而在比較引用時(shí),如果引用指向內(nèi)存中的同一對(duì)象,結(jié)果為true

HashMap面試題

HashMap的工作原理是近年來(lái)常見(jiàn)的Java面試題。幾乎每個(gè)Java

程序員都知道HashMap,都知道哪里要用HashMap,知道Hashtable

和HashMap之間的區(qū)別,那么為何這道面試題如此特殊呢?是因?yàn)?/p>

這道題考察的深度很深。這題經(jīng)常出現(xiàn)在高級(jí)或中高級(jí)面試中。投

資銀行更喜歡問(wèn)這個(gè)問(wèn)題,甚至?xí)竽銓?shí)現(xiàn)HashMap來(lái)考察你的

編程能力。ConcurrentHashMap和其它同步集合的引入讓這道題變

得更加復(fù)雜。讓我們開(kāi)始探索的旅程吧!

先來(lái)些簡(jiǎn)單的問(wèn)題

“你用過(guò)HashMap嗎?”“什么是HashMap?你為什么用到它?”

幾乎每個(gè)人都會(huì)回答,,是的”,然后回答HashMap的一些特性,譬

如HashMap可以接受null鍵值和值,而Hashtable則不能;

HashMap是非synchronized;HashMap很快;以及HashMap儲(chǔ)存的是

鍵值對(duì)等等。這顯示出你已經(jīng)用過(guò)HashMap,而且對(duì)它相當(dāng)?shù)氖煜ぁ?/p>

但是面試官來(lái)個(gè)急轉(zhuǎn)直下,從此刻開(kāi)始問(wèn)出一些刁鉆的問(wèn)題,關(guān)于

HashMap的更多基礎(chǔ)的細(xì)節(jié)。面試官可能會(huì)問(wèn)出下面的問(wèn)題:

“你知道HashMap的工作原理嗎?”“你知道HashMap的get()方

法的工作原理嗎?”

你也許會(huì)回答“我沒(méi)有詳查標(biāo)準(zhǔn)的JavaAPI,你可以看看Java源

代碼或者OpenJDK。”“我可以用Google找到答案?!?/p>

但一些面試者可能可以給出答案,“HashMap是基于hashing的原

理,我們使用put(key,value)存儲(chǔ)對(duì)象到HashMap中,使用

get(key)從HashMap中獲取對(duì)象。當(dāng)我們給put()方法傳遞鍵和值

時(shí),我們先對(duì)鍵調(diào)用hashCode()方法,返回的hashCode用于找到

bucket位置來(lái)儲(chǔ)存Entry對(duì)象?!边@里關(guān)鍵點(diǎn)在于指出,HashMap

是在bucket中儲(chǔ)存鍵對(duì)象和值對(duì)象,作為Map.Entry。這一點(diǎn)有助

于理解獲取對(duì)象的邏輯。如果你沒(méi)有意識(shí)到這一點(diǎn),或者錯(cuò)誤的認(rèn)

為僅僅只在bucket中存儲(chǔ)值的話,你將不會(huì)回答如何從HashMap中

獲取對(duì)象的邏輯。這個(gè)答案相當(dāng)?shù)恼_,也顯示出面試者確實(shí)知道

hashing以及HashMap的工作原理。但是這僅僅是故事的開(kāi)始,當(dāng)

面試官加入一些Java程序員每天要碰到的實(shí)際場(chǎng)景的時(shí)候,錯(cuò)誤的

答案頻現(xiàn)。下個(gè)問(wèn)題可能是關(guān)于HashMap中的碰撞探測(cè)(collision

detection)以及碰撞的解決方法:

“當(dāng)兩個(gè)對(duì)象的hashcode相同會(huì)發(fā)生什么?”從這里開(kāi)始,真正

的困惑開(kāi)始了,一些面試者會(huì)回答因?yàn)閔ashcode相同,所以兩個(gè)對(duì)

象是相等的,HashMap將會(huì)拋出異常,或者不會(huì)存儲(chǔ)它們。然后面

試官可能會(huì)提醒他們有equals()和hashCode()兩個(gè)方法,并告訴他

們兩個(gè)對(duì)象就算hashcode相同,但是它們可能并不相等。一些面試

者可能就此放棄,而另外一些還能繼續(xù)挺進(jìn),他們回答“因?yàn)?/p>

hashcode相同,所以它們的bucket位置相同,'碰撞'會(huì)發(fā)生。

因?yàn)镠ashMap使用鏈表存儲(chǔ)對(duì)象,這個(gè)Entry(包含有鍵值對(duì)的

Map.Entry對(duì)象)會(huì)存儲(chǔ)在鏈表中。”這個(gè)答案非常的合理,雖然有

很多種處理碰撞的方法,這種方法是最簡(jiǎn)單的,也正是HashMap的

處理方法。但故事還沒(méi)有完結(jié),面試官會(huì)繼續(xù)問(wèn):

“如果兩個(gè)鍵的hashcode相同,你如何獲取值對(duì)象?”面試者會(huì)

回答:當(dāng)我們調(diào)用get()方法,HashMap會(huì)使用鍵對(duì)象的hashcode

找到bucket位置,然后獲取值對(duì)象。面試官提醒他如果有兩個(gè)值對(duì)

象儲(chǔ)存在同一個(gè)bucket,他給出答案:將會(huì)遍歷鏈表直到找到值對(duì)

象。面試官會(huì)問(wèn)因?yàn)槟悴](méi)有值對(duì)象去比較,你是如何確定確定找

到值對(duì)象的?除非面試者直到HashMap在鏈表中存儲(chǔ)的是鍵值對(duì),

否則他們不可能回答出這一題。

其中一些記得這個(gè)重要知識(shí)點(diǎn)的面試者會(huì)說(shuō),找到bucket位置之后,

會(huì)調(diào)用keys,equals()方法去找到鏈表中正確的節(jié)點(diǎn),最終找到要

找的值對(duì)象。完美的答案!

許多情況下,面試者會(huì)在這個(gè)環(huán)節(jié)中出錯(cuò),因?yàn)樗麄兓煜?/p>

hashCode()和equals。方法。因?yàn)樵诖酥癶ashCode()屢屢出現(xiàn),

而equals。方法僅僅在獲取值對(duì)象的時(shí)候才出現(xiàn)。一些優(yōu)秀的開(kāi)發(fā)

者會(huì)指出使用不可變的、聲明作final的對(duì)象,并且采用合適的

equals。和hashCode()方法的話,將會(huì)減少碰撞的發(fā)生,提高效率。

不可變性使得能夠緩存不同鍵的hashcode,這將提高整個(gè)獲取對(duì)象

的速度,使用String,Interger這樣的wrapper類作為鍵是非常好

的選擇。

如果你認(rèn)為到這里已經(jīng)完結(jié)了,那么聽(tīng)到下面這個(gè)問(wèn)題的時(shí)候,你

會(huì)大吃一驚?!叭绻鸋ashMap的大小超過(guò)了負(fù)載因子(loadfactor)

定義的容量,怎么辦?”除非你真正知道HashMap的工作原理,否

則你將回答不出這道題。默認(rèn)的負(fù)載因子大小為0.75,也就是說(shuō),

當(dāng)一個(gè)map填滿了75%的bucket時(shí)候,和其它集合類(如ArrayList

等)一樣,將會(huì)創(chuàng)建原來(lái)HashMap大小的兩倍的bucket數(shù)組,來(lái)重

新調(diào)整map的大小,并將原來(lái)的對(duì)象放入新的bucket數(shù)組中。這個(gè)

過(guò)程叫作rehashing,因?yàn)樗{(diào)用hash方法找到新的bucket位置。

如果你能夠回答這道問(wèn)題,下面的問(wèn)題來(lái)了:“你了解重新調(diào)整

HashMap大小存在什么問(wèn)題嗎?"你可能回答不上來(lái),這時(shí)面試官

會(huì)提醒你當(dāng)多線程的情況下,可能產(chǎn)生條件競(jìng)爭(zhēng)(racecondition)o

當(dāng)重新調(diào)整HashMap大小的時(shí)候,確實(shí)存在條件競(jìng)爭(zhēng),因?yàn)槿绻麅?/p>

個(gè)線程都發(fā)現(xiàn)HashMap需要重新調(diào)整大小了,它們會(huì)同時(shí)試著調(diào)整

大小。在調(diào)整大小的過(guò)程中,存儲(chǔ)在鏈表中的元素的次序會(huì)反過(guò)來(lái),

因?yàn)橐苿?dòng)到新的bucket位置的時(shí)候,HashMap并不會(huì)將元素放在鏈

表的尾部,而是放在頭部,這是為了避免尾部遍歷(tail

traversing)o如果條件競(jìng)爭(zhēng)發(fā)生了,那么就死循環(huán)了。這個(gè)時(shí)候,

你可以質(zhì)問(wèn)面試官,為什么這么奇怪,要在多線程的環(huán)境下使用

HashMap呢?:)

熱心的讀者貢獻(xiàn)了更多的關(guān)于HashMap的問(wèn)題:

為什么String,Interger這樣的wrapper類適合作為

鍵?String,Interger這樣的wrapper類作為HashMap的鍵是再

適合不過(guò)了,而且String最為常用。因?yàn)镾tring是不可變的,也

是final的,而且已經(jīng)重寫了equals。和hashCode()方法了。其他

的wrapper類也有這個(gè)特點(diǎn)。不可變性是必要的,因?yàn)闉榱艘?jì)算

hashCode(),就要防止鍵值改變,如果鍵值在放入時(shí)和獲取時(shí)返回

不同的hashcode的話,那么就不能從HashMap中找到你想要的對(duì)象。

不可變性還有其他的優(yōu)點(diǎn)如線程安全。如果你可以僅僅通過(guò)將某個(gè)

field聲明成final就能保證hashCode是不變的,那么請(qǐng)這么做吧。

因?yàn)楂@取對(duì)象的時(shí)候要用到equals()和hashCode()方法,那么鍵對(duì)

象正確的重寫這兩個(gè)方法是非常重要的。如果兩個(gè)不相等的對(duì)象返

回不同的hashcode的話,那么碰撞的幾率就會(huì)小些,這樣就能提高

HashMap的性能。

我們可以使用自定義的對(duì)象作為鍵嗎?這是前一個(gè)問(wèn)題的延伸。

當(dāng)然你可能使用任何對(duì)象作為鍵,只要它遵守了equals。和

hashCode()方法的定義規(guī)則,并且當(dāng)對(duì)象插入到Map中之后將不會(huì)

再改變了。如果這個(gè)自定義對(duì)象時(shí)不可變的,那么它已經(jīng)滿足了作

為鍵的條件,因?yàn)楫?dāng)它創(chuàng)建之后就已經(jīng)不能改變了。

我們可以使用CocurrentHashMap來(lái)代替Hashtable嗎?這是另外一

個(gè)很熱門的面試題,因?yàn)镃oncurrentHashMap越來(lái)越多人用了。我

們知道Hashtable是synchronized的,但是ConcurrentHashMap

同步性能更好,因?yàn)樗鼉H僅根據(jù)同步級(jí)別對(duì)map的一部分進(jìn)行上鎖。

ConcurrentHashMap當(dāng)然可以代替HashTable,但是HashTable提

供更強(qiáng)的線程安全性??纯催@篇博客查看Hashtable和

ConcurrentHashMap的區(qū)別。

我個(gè)人很喜歡這個(gè)問(wèn)題,因?yàn)檫@個(gè)問(wèn)題的深度和廣度,也不直接的

涉及到不同的概念。讓我們?cè)賮?lái)看看這些問(wèn)題設(shè)計(jì)哪些知識(shí)點(diǎn):

hashing的概念

HashMap中解決碰撞的方法

equals()和hashCode()的應(yīng)用,以及它們?cè)贖ashMap中的重要性

不可變對(duì)象的好處

HashMap多線程的條件競(jìng)爭(zhēng)

重新調(diào)整HashMap的大小

總結(jié)

HashMap的工作原理

HashMap基于hashing原理,我們通過(guò)put()和get()方法儲(chǔ)存和獲

取對(duì)象。當(dāng)我們將鍵值對(duì)傳遞給put()方法時(shí),它調(diào)用鍵對(duì)象的

hashCode()方法來(lái)計(jì)算hashcode,讓后找到bucket位置來(lái)儲(chǔ)存值

對(duì)象。當(dāng)獲取對(duì)象時(shí),通過(guò)鍵對(duì)象的equals。方法找到正確的鍵值

對(duì),然后返回值對(duì)象。HashMap使用鏈表來(lái)解決碰撞問(wèn)題,當(dāng)發(fā)生

碰撞了,對(duì)象將會(huì)儲(chǔ)存在鏈表的下一個(gè)節(jié)點(diǎn)中。HashMap在每個(gè)鏈

表節(jié)點(diǎn)中儲(chǔ)存鍵值對(duì)對(duì)象。

當(dāng)兩個(gè)不同的鍵對(duì)象的hashcode相同時(shí)會(huì)發(fā)生什么?它們會(huì)儲(chǔ)存

在同一個(gè)bucket位置的鏈表中。鍵對(duì)象的equals()方法用來(lái)找到

鍵值對(duì)。

因?yàn)镠ashMap的好處非常多,我曾經(jīng)在電子商務(wù)的應(yīng)用中使用

HashMap作為緩存。因?yàn)榻鹑陬I(lǐng)域非常多的運(yùn)用Java,也出于性能

的考慮,我們會(huì)經(jīng)常用到HashMap和ConcurrentHashMap。你可以

查看更多的關(guān)于HashMap的文章:

請(qǐng)講下Java里面的容器

分兩大類,Map和Collection0而Collection又有子接口

List(數(shù)據(jù)存儲(chǔ)順序和插入順序是一樣的)、Set(里面的元素具有唯

一性)

Map是存儲(chǔ)鍵值對(duì)的,里面的健不可以重復(fù),但值可以重復(fù)

a.對(duì)于List主要有ArrayList和LinkedList兩種實(shí)現(xiàn)。實(shí)現(xiàn)的

數(shù)據(jù)結(jié)構(gòu)不同,所以主要的區(qū)別也都是和數(shù)據(jù)結(jié)構(gòu)相關(guān)的。

ArrayList基于數(shù)組,隨機(jī)訪問(wèn)快,而對(duì)于中間元素的插入刪除效

率比較低,而且需要考慮擴(kuò)容問(wèn)題。LinkedList,則基于鏈表,

和ArrayList提到的正相反,隨機(jī)訪問(wèn)慢,但對(duì)于中間元素的插入

和刪除更有效率。

Set也是一種Collection,和List比起來(lái)主要體現(xiàn)在元素唯一性。

請(qǐng)說(shuō)下Iterator的作用

迭代器可以實(shí)現(xiàn)Collection接口的方法,可以一個(gè)一個(gè)地獲取集

合中的元素

在遍歷集合時(shí)可判斷是否有下一個(gè)元素

說(shuō)下ArrayList和LinkedList的區(qū)別和聯(lián)系,并說(shuō)明什么情況下用

它們

區(qū)別:ArrayList用于對(duì)象的隨機(jī)訪問(wèn)速度快,沒(méi)有順序

LinkedList實(shí)現(xiàn)機(jī)制是鏈表式的,和順序有關(guān),速度比ArrayList慢

聯(lián)系:ArrayList和LinkedList都是List接口的實(shí)現(xiàn)類

當(dāng)要快速獲取一個(gè)值時(shí),用ArrayList,用于順序插入操作時(shí),用

LinkedList.

說(shuō)下List,Set,Map三種集合各有什么特征

List集合中的元素可以重復(fù),

Set集合中的元素不可以重復(fù)

Map集合用鍵-值映射存放對(duì)象,Map容器中的鍵對(duì)象不能重復(fù),值對(duì)

象可以重復(fù)

HashSet和TreeSet有什么區(qū)別,什么時(shí)候用它們

區(qū)別:HashSet中的元素不能重復(fù),沒(méi)有順序

TreeSet中的元素不能重復(fù),但有順序

當(dāng)集合中的元素需要排序時(shí),用TreeSet

一般情況下用HashSet,因?yàn)椴恍枰判?速度比TreeSet快

什么是泛型,怎么使用的,有什么好處?

答案

定義一個(gè)集合時(shí),可以知道里面定義的是什么類型

使用:在集合類型后面加<數(shù)據(jù)類型>

使用泛型后,從集合中取得元素后就不用再用強(qiáng)轉(zhuǎn)

什么是foreach循環(huán),它可以循環(huán)那些數(shù)據(jù)類型

答案

也可以叫增強(qiáng)型循環(huán),通過(guò)對(duì)象拿到集合里的值,因?yàn)閿U(kuò)展性比

較強(qiáng),建議多使用

可以用來(lái)循環(huán)集合和數(shù)組

比較下集合和數(shù)組的優(yōu)缺點(diǎn)

集合是多個(gè)對(duì)象的容器,可以將不同數(shù)據(jù)類型的多個(gè)對(duì)象組織在一

數(shù)組類型是有相同數(shù)據(jù)類型的數(shù)據(jù)集合,數(shù)組是很多語(yǔ)言都支持的底

層數(shù)據(jù)結(jié)構(gòu),性能上是最高的

HashMap與LinkedHashMap,和TreeMap的區(qū)別。

共同點(diǎn):HashMap,LinkedHashMap,TreeMap都屬于Map的實(shí)現(xiàn)類.

不同點(diǎn):1.HashMap里面存入的鍵值對(duì)在取出的時(shí)候是隨機(jī)的,

2.TreeMap取出來(lái)的是排序后的鍵值對(duì)。但如果您要按自然順序或

自定義順序遍歷鍵,那么TreeMap會(huì)更好。

3.LinkedHashMap是HashMap的一個(gè)子類,如果需要輸出的順序和

輸入的相同,那么用LinkedHashMap可以實(shí)現(xiàn).

在List里面怎么去掉重復(fù)的數(shù)?

通過(guò)把List里面的數(shù)據(jù)放入HashSet可以去除重復(fù)

HashMap和ArrayList是不是都是線程不安全的?

ArrayList是線程不安全的;HashMap是線程不安全的;還有我們常

見(jiàn)的一些JAVA集合都是線程不安全,這樣做是為了提高性能

在JDK5以后提供了線程安全的并發(fā)包java.util.concurrent并發(fā)

包,譬如里面的類

CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap

ArrayList集合加入1萬(wàn)條數(shù)據(jù),應(yīng)該怎么提高效率

因?yàn)锳rrayList的底層是數(shù)組實(shí)現(xiàn),并且數(shù)組的默認(rèn)值是10,如果

插入10000條要不斷的擴(kuò)容,耗費(fèi)時(shí)間,所以我們調(diào)用ArrayList的

指定容量的構(gòu)造器方法ArrayList(intsize)就可以實(shí)現(xiàn)不擴(kuò)容,

就提高了性能

網(wǎng)路通訊部分

客戶茸附名器

HTTP幅務(wù)器

TCP

IP

以太網(wǎng)協(xié)議

Xml與JSON區(qū)別

數(shù)據(jù)交換格式

區(qū)別:

xml是重量級(jí)、json是輕量級(jí)

xml比較占帶寬、json占帶寬小,易于壓縮

json在webservice用的比較少、xml用的較多

相同:

兩者都用在項(xiàng)目交互下例如移動(dòng)app接口用的就是json、在

web項(xiàng)目中與其他項(xiàng)目對(duì)接用xml較多。

json常用解析方法gson、jsonobject>jackson等xmldomsax

pull解析

TCP與UDP區(qū)別?

udp:a、是面向無(wú)連接,將數(shù)據(jù)及源的封裝成數(shù)據(jù)包中,不需要

建立建立連接

b、每個(gè)數(shù)據(jù)報(bào)的大小在限制64k內(nèi)

c、因無(wú)連接,是不可靠協(xié)議

d、不需要建立連接,速度快

tcp:a、建議連接,形成傳輸數(shù)據(jù)的通道.

b、在連接中進(jìn)行大數(shù)據(jù)量傳輸,以字節(jié)流方式

c通過(guò)三次握手完成連接,是可靠協(xié)議

d必須建立連接m效率會(huì)稍低

聊天、網(wǎng)絡(luò)視頻會(huì)議、桌面共享用的就是udp

說(shuō)說(shuō)三次握手?

1)第一次握手:建立連接時(shí),客戶端A發(fā)送SYN包(SYN=j)到

服務(wù)器B,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器B確認(rèn)。

(2)第二次握手:服窩器B收到SYN包,必須確認(rèn)客戶A的SYN

(ACK=j+l),同時(shí)自己也發(fā)送一個(gè)SYN包(SYN=k),即SYN+ACK

包,此時(shí)服務(wù)器B進(jìn)入SYN_RECV狀態(tài)。

(3)第三次握手:客戶端X收到服務(wù)器B的SYN+ACK包,向服務(wù)

器B發(fā)送確認(rèn)包ACK(ACK=k+l),此包發(fā)送完畢,客戶端A和服務(wù)

器B進(jìn)入ESTABLISHED狀態(tài),完成三次握手。

完成三次握手,客戶端與服務(wù)器開(kāi)始傳送數(shù)據(jù)。

什么是Webserivce?

Webservice就是提供不同的平臺(tái)相互通訊,基于Soap協(xié)議。

Webservice就是一個(gè)應(yīng)用程序,它向外界暴露出一個(gè)能夠通過(guò)

Web進(jìn)行調(diào)用的API。

SOAP是一種簡(jiǎn)單基于xml的輕量協(xié)議,用戶web上交換結(jié)構(gòu)化信息

和類型信息。

soap請(qǐng)求是HTTPPOST的一個(gè)專用版本,遵循一種特殊的xml消息

格式Content-type設(shè)置為:text/xml任何數(shù)據(jù)都可以xml化。

WebService實(shí)現(xiàn)原理是?

HTTP協(xié)議+XML

說(shuō)一下什么是Http協(xié)議?

對(duì)器客戶端和服務(wù)器端之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范,格式簡(jiǎn)稱為“超

文本傳輸協(xié)議”。

什么是Http協(xié)議無(wú)狀態(tài)協(xié)議?怎么解決Http協(xié)議無(wú)狀態(tài)協(xié)議?

(曾經(jīng)去某創(chuàng)業(yè)公司問(wèn)到)

1、無(wú)狀態(tài)協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后

續(xù)處理需要前面的信息

2、無(wú)狀態(tài)協(xié)議解決辦法:通過(guò)1、Cookie2、通過(guò)Session會(huì)話

保存。

說(shuō)一下Http協(xié)議中302狀態(tài)(阿里經(jīng)常問(wèn))

http協(xié)議中,返回狀態(tài)碼302表示重定向。

這種情況下,服務(wù)器返回的頭部信息中會(huì)包含一個(gè)Location字段,

內(nèi)容是重定向到的url

Http協(xié)議有什么組成?

請(qǐng)求報(bào)文包含三部分:

a、請(qǐng)求行:包含請(qǐng)求方法、URI、HTTP版本信息

b、請(qǐng)求首部字段

c、請(qǐng)求內(nèi)容實(shí)體

響應(yīng)報(bào)文包含三部分:

a、狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語(yǔ)

b、響應(yīng)首部字段

c、響應(yīng)內(nèi)容實(shí)體

Http協(xié)議中有那些請(qǐng)求方式?

GET:用于請(qǐng)求訪問(wèn)已經(jīng)被URI(統(tǒng)一資源標(biāo)識(shí)符)識(shí)別的資源,

可以通過(guò)URL傳參給服務(wù)器

POST:用于傳輸信息給服務(wù)器,主要功能與GET方法類似,但一般

推薦使用POST方式。

PUT:傳輸文件,報(bào)文主體中包含文件內(nèi)容,保存到對(duì)應(yīng)URI位置。

HEAD:獲得報(bào)文首部,與GET方法類似,只是不返回報(bào)文主體,一

般用于驗(yàn)證URI是否有效。

DELETE:刪除文件,與PUT方法相反,刪除對(duì)應(yīng)URI位置的文件。

OPTIONS:查詢相應(yīng)URI支持的HTTP方法。

Http協(xié)議中Httpl.0與1.1區(qū)別?

在httpl.O中,當(dāng)建立連接后,客戶端發(fā)送一個(gè)請(qǐng)求,服務(wù)器端返

回一個(gè)信息后就關(guān)閉連接,當(dāng)瀏覽器下次請(qǐng)求的時(shí)候又要建立連接,

顯然這種不斷建立連接的方式,會(huì)造成很多問(wèn)題。

5.在httpl.1中,引入了持續(xù)連接的概念,通過(guò)這種連接,瀏覽器

可以建立一個(gè)連接之后,發(fā)送請(qǐng)求并得到返回信息,然后繼續(xù)發(fā)送

請(qǐng)求再次等到返回信息,也就是說(shuō)客戶端可以連續(xù)發(fā)送多個(gè)請(qǐng)求,

而不用等待每一個(gè)響應(yīng)的到來(lái)。

Http協(xié)議實(shí)現(xiàn)原理機(jī)制?

2.1,整個(gè)流程步驟

①域名解析②發(fā)起TCP的三次握手3發(fā)起HTTPi青求

⑨力慌器解析HTML代碼,。瀏覽器對(duì)頁(yè)面的

'④服務(wù)器晌應(yīng)HTTP請(qǐng)求「并請(qǐng)求HTML代碼中的資源

歌呈現(xiàn)給用戶

(如$、CSS、圖片等)

2.2、域名解析過(guò)程

憎索姆作系坎|

憎零用室器自身向本也配置的落選DNS服打;

的DN5韁存一自我的DNS縊f*發(fā)起域名解析請(qǐng)求

;NO1NO

YES

IYES

線所結(jié)束解析結(jié)束鱷物崎束

股是不會(huì)進(jìn)行到一下的步費(fèi)的

7NONOzu

查找NetBIOSI查詢WINS那包器1迸行廣搐座?。籣=讀取LMHOST5文件

nameCache~

______,」I1

廣丁JYESjYESjYES

解析結(jié)束|解舊告束|皖折結(jié)束|.、結(jié)束|

2.3、三次握手過(guò)程

2.4、發(fā)起HTTP請(qǐng)求

2.5、響應(yīng)HTTP請(qǐng)求并得到HTML代碼

2.6、瀏覽器解析HTML代碼

2.7、瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶

get與post請(qǐng)求區(qū)別?(初級(jí)程序員必備問(wèn)題)

區(qū)別一:

get重點(diǎn)在從服務(wù)器上獲取資源,post重點(diǎn)在向服務(wù)器發(fā)送數(shù)

據(jù);

區(qū)別二:

get傳輸數(shù)據(jù)是通過(guò)URL請(qǐng)求,以field(字段)=value的

形式,置于URL后,并用〃?〃連接,多個(gè)請(qǐng)求數(shù)據(jù)間用〃&〃連接,如

http://127.0.0.1/Test/login.action?name=admin&password=adm

in,這個(gè)過(guò)程用戶是可見(jiàn)的;

post傳輸數(shù)據(jù)通過(guò)Http的post機(jī)制,將字段與對(duì)應(yīng)值封存在請(qǐng)

求實(shí)體中發(fā)送給服務(wù)器,這個(gè)過(guò)程對(duì)用戶是不可見(jiàn)的;

區(qū)別三:

Get傳輸?shù)臄?shù)據(jù)量小,因?yàn)槭躑RL長(zhǎng)度限制,但效率較高;

Post可以傳輸大量數(shù)據(jù),所以上傳文件時(shí)只能用Post方式;

區(qū)別四:

get是不安全的,因?yàn)閁RL是可見(jiàn)的,可能會(huì)泄露私密信息,

如密碼等;

post較get安全性較高;

區(qū)別五:

get方式只能支持ASCII字符,向服務(wù)器傳的中文字符可能

會(huì)亂碼。

post支持標(biāo)準(zhǔn)字符集,可以正確傳遞中文字符。

9、Http請(qǐng)求報(bào)文與響應(yīng)報(bào)文格式?

請(qǐng)求報(bào)文包含三部分:

a、請(qǐng)求行:包含請(qǐng)求方法、URI、HTTP版本信息

b、請(qǐng)求首部字段

c、請(qǐng)求內(nèi)容實(shí)體

響應(yīng)報(bào)文包含三部分:

a、狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語(yǔ)

b、響應(yīng)首部字段

c、響應(yīng)內(nèi)容實(shí)體

10、常見(jiàn)Http協(xié)議狀態(tài)?

200:請(qǐng)求被正常處理

204:請(qǐng)求被受理但沒(méi)有資源可以返回

206:客戶端只是請(qǐng)求資源的一部分,服務(wù)器只對(duì)請(qǐng)求的部分資源

執(zhí)行GET方法,相應(yīng)報(bào)文中通過(guò)Content-Range指定范圍的資源。

301:永久性重定向

302:臨時(shí)重定向

303:與302狀態(tài)碼有相似功能,只是它希望客戶端在請(qǐng)求一個(gè)

URI的時(shí)候,能通過(guò)GET方法重定向到另一個(gè)URI上

304:發(fā)送附帶條件的請(qǐng)求時(shí),條件不滿足時(shí)返回,與重定向無(wú)關(guān)

307:臨時(shí)重定向,與302類似,只是強(qiáng)制要求使用POST方法

400:請(qǐng)求報(bào)文語(yǔ)法有誤,服務(wù)器無(wú)法識(shí)別

401:請(qǐng)求需要認(rèn)證

403:請(qǐng)求的對(duì)應(yīng)資源禁止被訪問(wèn)

404:服務(wù)器無(wú)法找到對(duì)應(yīng)資源

500:服務(wù)器內(nèi)部錯(cuò)誤

503:服務(wù)器正忙

Http協(xié)議首部字段?

a、通用首部字段(請(qǐng)求報(bào)文與響應(yīng)報(bào)文都會(huì)使用的首部字段)

Date:創(chuàng)建報(bào)文時(shí)間

Connection:連接的管理

Cache-Control:緩存的控制

Transfer-Encoding:報(bào)文主體的傳輸編碼方式

b、請(qǐng)求首部字段(請(qǐng)求報(bào)文會(huì)使用的首部字段)

Host:請(qǐng)求資源所在服務(wù)器

Accept:可處理的媒體類型

Accept-Charset:可接收的字符集

Accept-Encoding:可接受的內(nèi)容編碼

Accept-Language:可接受的自然語(yǔ)言

c、響應(yīng)首部字段(響應(yīng)報(bào)文會(huì)使用的首部字段)

Accept-Ranges:可接受的字節(jié)范圍

Location:令客戶端重新定向到的URI

Server:HTTP服務(wù)器的安裝信息

d、實(shí)體首部字段(請(qǐng)求報(bào)文與響應(yīng)報(bào)文的的實(shí)體部分使用的首部

字段)

Allow:資源可支持的HTTP方法

Content-Type:實(shí)體主類的類型

Content-Encoding:實(shí)體主體適用的編碼方式

Content-Language:實(shí)體主體的自然語(yǔ)言

Content-Length:實(shí)體主體的的字節(jié)數(shù)

Content-Range:實(shí)體主體的位置范圍,一般用于發(fā)出部分請(qǐng)求時(shí)

使用

Http與Https優(yōu)缺點(diǎn)?

a、通信使用明文不加密,內(nèi)容可能被竊聽(tīng),也就是被抓包分析。

b、不驗(yàn)證通信方身份,可能遭到偽裝

c、無(wú)法驗(yàn)證報(bào)文完整性,可能被篡改

HTTPS就是HTTP加上加密處理(一般是SSL安全通信線路)+認(rèn)證

+完整性保護(hù)

Http優(yōu)化

利用負(fù)載均衡優(yōu)化和加速HTTP應(yīng)用

利用HTTPCache來(lái)優(yōu)化網(wǎng)站

Http協(xié)議有那些特征?

1、支持客戶/服務(wù)器模式;2、簡(jiǎn)單快速;3、靈活;4、無(wú)連接;

5、無(wú)狀態(tài);

如果你還對(duì)Http協(xié)議不熟悉的話,請(qǐng)參考Http協(xié)議

http://www.itmayiedu.com/front/articleinfo/49.html文章

JavaWeb基礎(chǔ)部分

講下Servlet的執(zhí)行流程。doGet和doPost的區(qū)別

Servlet的執(zhí)行流程也就是servlet的生命周期,當(dāng)服務(wù)器啟動(dòng)

的時(shí)候生命周期開(kāi)始,然后通過(guò)init()《啟動(dòng)順序根據(jù)web.xml里

的startup-on-load來(lái)確定加載順序》方法初始化servlet,再根

據(jù)不同請(qǐng)求調(diào)用doGet或doPost方法,最后再通過(guò)destroy。方法

進(jìn)行銷毀。

doGet和doPost都是接受用戶請(qǐng)求的方法,doGet處理get請(qǐng)求,

doPost處理post請(qǐng)求,doGet用于地址欄提交,doPost用于表單

提交,在頁(yè)面提交數(shù)據(jù)時(shí),get的數(shù)據(jù)大小有限制4k,post沒(méi)有限

制,get請(qǐng)求提交的數(shù)據(jù)會(huì)在地址欄顯示,post不顯示,所以post

比get安全.

當(dāng)service有一個(gè)實(shí)例變量,doGet和doPost去調(diào)用這個(gè)變量,會(huì)

出現(xiàn)什么問(wèn)題,你是如何解決的。

會(huì)出現(xiàn)線程不安全問(wèn)題。無(wú)論是doGet還是doPost去調(diào)用,服務(wù)

器端處理的過(guò)程都是一樣的,那么我們可以把處理過(guò)程單獨(dú)寫在另

外一個(gè)方法handle里,讓兩個(gè)方法都去調(diào)用handle,根據(jù)不同請(qǐng)

求去調(diào)用不同的方法。

如何處理servlet的線程不安全問(wèn)題

線程安全就是多線程操作同一個(gè)對(duì)象不會(huì)有問(wèn)題,線程同步一般

來(lái)保護(hù)線程安全,所以可以在Servlet的線程里面加上同步方法或

同步塊。(Synchronized)可以保證在同一時(shí)間只有一個(gè)線程訪問(wèn),

(使用同步塊會(huì)導(dǎo)致性能變差,最好不去使用實(shí)例變量)

Jsp的重定向和轉(zhuǎn)發(fā)的流程有什么區(qū)別

重定向是客戶端行為,轉(zhuǎn)發(fā)是服務(wù)器端行為

重定向時(shí)服務(wù)器產(chǎn)生兩次請(qǐng)求,轉(zhuǎn)發(fā)產(chǎn)生一次請(qǐng)求,重定向時(shí)可

以轉(zhuǎn)發(fā)到項(xiàng)目以外的任何網(wǎng)址,轉(zhuǎn)發(fā)只能在當(dāng)前項(xiàng)目里轉(zhuǎn)發(fā)

重定向會(huì)導(dǎo)致request對(duì)象信息丟失。轉(zhuǎn)發(fā)則不會(huì)

轉(zhuǎn)發(fā)的url不會(huì)變,request.getRequestDispatch()。forward()

重定向的url會(huì)改變,response.getRedirect();

Jsp和servlet的區(qū)別

jsp的可讀性強(qiáng),容易維護(hù),并且jsp在最后會(huì)編譯成servlet

servlet容易調(diào)試

Jsp的九大內(nèi)置對(duì)象,三大指令,七大動(dòng)作的具體功能

JSP九大內(nèi)置對(duì)象:

pageContext:只對(duì)當(dāng)前jsp頁(yè)面有效,里面封裝了基本的request

和session的對(duì)象

Request:對(duì)當(dāng)前請(qǐng)求進(jìn)行封裝

Session:瀏覽器會(huì)話對(duì)象,瀏覽器范圍內(nèi)有效

Application:應(yīng)用程序?qū)ο?,?duì)整個(gè)web工程都有效

Out:頁(yè)面打印對(duì)象,在jsp頁(yè)面打印字符串

Response:返回服務(wù)器端信息給用戶

Config:?jiǎn)蝹€(gè)servlet的配置對(duì)象,相當(dāng)于servletConfig對(duì)象

Page:當(dāng)前頁(yè)面對(duì)象,也就是this

Exception:錯(cuò)誤頁(yè)面的exception對(duì)象,如果指定的是錯(cuò)誤頁(yè)面,

這個(gè)就是異常對(duì)象

三大指令;

Page:指令是針對(duì)當(dāng)前頁(yè)面的指令

Include:用于指定如何包含另一個(gè)頁(yè)面

Taglib:用于定義和指定自定義標(biāo)簽

七大動(dòng)作:

Forward,執(zhí)行頁(yè)面跳轉(zhuǎn),將請(qǐng)求的處理轉(zhuǎn)發(fā)到另一個(gè)頁(yè)面

Param:用于傳遞參數(shù)

Include:用于動(dòng)態(tài)引入一個(gè)jsp頁(yè)面

Plugin:用于下載javaBean或applet到客戶端執(zhí)行

useBean:使用javaBean

setProperty:修改javaBean實(shí)例的屬性值

getProperty:獲取javaBean實(shí)例的屬性值

獲取頁(yè)面的元素和值有幾種方式,分別說(shuō)一下

request.getParameter()返回客戶端的請(qǐng)求參數(shù)與值

request.getParameterNames()返回所有可用屬性名的枚舉

request.getParameterValues()返回包含參數(shù)的所有值的數(shù)組

servlet和JavaScript的區(qū)別,他們分別是什么作用

一個(gè)是服務(wù)端,一個(gè)是客戶端

Servlet是獨(dú)立于平臺(tái)和協(xié)議的服務(wù)器端的java應(yīng)用程序,可以動(dòng)態(tài)

生成web頁(yè)面,并采用響應(yīng)--請(qǐng)求的模式提供web服務(wù)

JavaScript是一種解釋性語(yǔ)言,用于向html頁(yè)面提供交互行為,通

常被直接嵌入在html頁(yè)面中

servlet是java語(yǔ)言編寫的web應(yīng)用

js是基于html上的一種解釋語(yǔ)言

會(huì)話跟蹤有哪些,他們的區(qū)別是什么

Cookie,session和application,

Cookie是http對(duì)象,客戶端與服務(wù)端都可以操縱

cookie是在客戶端保持狀態(tài),session是在服務(wù)器端保持狀態(tài),由于

cookie是保存在客戶端本地的,所以數(shù)據(jù)很容易被竊取,當(dāng)訪問(wèn)量

很多時(shí),使用session則會(huì)降低服務(wù)器的性能,application的作用域

是整個(gè)工程里只有一個(gè),可以在不同瀏覽器之間共享數(shù)據(jù),所有人

都可以共享,因此application也是不安全的

說(shuō)說(shuō)jsp的隱藏對(duì)象有哪些

Request,out,response,pageContext,session,application,config,p

age,exception,也即jsp的九大內(nèi)置對(duì)象

request,response,session和application是怎么用的

Request是客戶端向服務(wù)端發(fā)送請(qǐng)求

Response是服務(wù)端對(duì)客戶端請(qǐng)求做出響應(yīng)

Session在servlet中不能直接使用,需要通過(guò)getSession()創(chuàng)建,如

果沒(méi)有設(shè)定它的生命周期,或者通過(guò)invildate。方法銷毀,關(guān)閉瀏

覽器session就會(huì)消失

Application不能直接創(chuàng)建,存在于服務(wù)器的內(nèi)存中,由服務(wù)器創(chuàng)建

和銷毀

jsp頁(yè)面跳轉(zhuǎn)

Jsp頁(yè)面跳轉(zhuǎn)有兩種方式,forward和redirect(轉(zhuǎn)發(fā)和重定向)

Forward只能在當(dāng)前項(xiàng)目里跳轉(zhuǎn),只產(chǎn)生一次請(qǐng)求,request保存的

變量不會(huì)丟失,url地址不會(huì)改變

Redirect可跳轉(zhuǎn)到項(xiàng)目以外的任何頁(yè)面,產(chǎn)生兩次請(qǐng)求,request保

存的變量會(huì)全部丟失,url地址會(huì)發(fā)生改變,變化為第二個(gè)請(qǐng)求的地

話跟蹤

如果創(chuàng)建servlet實(shí)例不用構(gòu)造方法,怎么創(chuàng)建一個(gè)servlet實(shí)例

Web容器會(huì)自動(dòng)為servlet寫一個(gè)無(wú)參的構(gòu)造器,它使用

dass.forName("").newInstance()反射來(lái)創(chuàng)建servlet實(shí)例的

Servlet是安全的嗎?當(dāng)service有一^t'實(shí)例變量,doGet和

doPost去調(diào)用這個(gè)變量,會(huì)出現(xiàn)什么問(wèn)題,你是如何解決的

是線程不安全的,因?yàn)閟ervlet是單例模式,當(dāng)多個(gè)客戶端共同訪問(wèn)

的時(shí)候線程不安全。

盡量用局部變量,同步塊,如果當(dāng)前字段是不會(huì)改變的,用final修

Java框架部分

說(shuō)說(shuō)Spring?

Spring的核心是控制反轉(zhuǎn)、依賴注入,Aop(面向切面)相當(dāng)于把每

個(gè)bean與bean之間的關(guān)系交給第三方容器進(jìn)行管理.

說(shuō)SpringIOC>SpringAOP?

SpringIOC,其實(shí)就是依賴注入、控制反轉(zhuǎn)。相當(dāng)于把每個(gè)bean與

bean之間的關(guān)系交給第三方容器管理。而這個(gè)容器就是spring

SpringAOP面向切面的編程,或A0P,是一種編程技術(shù),允許程序

模塊化橫向切割關(guān)注點(diǎn),或橫切典型的責(zé)任劃分,如日志和事務(wù)管

理。SpringAop就是用Javva的動(dòng)態(tài)代理

Spring的底層實(shí)現(xiàn)機(jī)制是什么?

使用Demo4j(解析XML)+Java反射機(jī)制

Demo4j其實(shí)就是解析XML。使用反射機(jī)制實(shí)例化bean。

SpringAOP用到了什么代理?

JDK動(dòng)態(tài)代理:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論