版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Java初中級程序員面試題寶典
Java基礎(chǔ)部分
&與&&區(qū)別?
&和&&都是邏輯運算符,都是判斷兩邊同時真則為真,否則為假;
但是&&當(dāng)?shù)谝粋€條件不成之后,后面的條件都不執(zhí)行了,而&則
還是繼續(xù)執(zhí)行,直到整個條件語句執(zhí)行完為止。
使用final關(guān)鍵字修飾一個變量時,是引用不能變,還是引用的對
象不能變?
使用final關(guān)鍵字修飾一個變量時,是指引用變量不能變,引用變
量所指向的對象中的內(nèi)容還是可以改變的。
靜態(tài)變量和實例變量的區(qū)別?
在語法定義上的區(qū)別:
靜態(tài)變量前要加static關(guān)鍵字,而實例變量前則不加。
在程序運行時的區(qū)別:實例變量屬于某個對象的屬性,必須創(chuàng)建了
實例對象,其中的實例變量才會被分配空間,才能使用這個實例變
量。
靜態(tài)變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,
只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就
會被分配空間,靜態(tài)變量就可以被使用了。
總之,實例變量必須創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)
變量則可以直接使用類名來引用。
靜態(tài)變量使用時,通過類名.名稱,實例變量必須要初始化后才能使用。
實例變量是實例化后才會分配空間,而靜態(tài)變量當(dāng)類加載時會分配空
間。
是否可以從一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用?
不可以。因為非static方法是要與對象關(guān)聯(lián)在一起的,必須創(chuàng)建
一個對象后,才可以在該對象上進行方法調(diào)用,而static方法調(diào)
用時不需要創(chuàng)建對象,可以直接調(diào)用。也就是說,當(dāng)一個static
方法被調(diào)用時,可能還沒有創(chuàng)建任何實例對象,如果從一個static
方法中發(fā)出對非static方法的調(diào)用,那個非static方法是關(guān)聯(lián)
到哪個對象上的呢?這個邏輯無法成立,所以,一個static方法
內(nèi)部發(fā)出對非static方法的調(diào)用。
非static方法可以訪問static方法.
static方法不能訪問非static方法
“=="和equals方法究竟有什么區(qū)別?
==如果判斷值類型的話,判斷內(nèi)容是否相同。如果判斷引用類型
則是判斷內(nèi)存地址是否相同
Equals判斷值內(nèi)容是否相等
Integer與int的區(qū)別
Integer是引用類型,默認(rèn)值是null。而int是是值類型默認(rèn)值是
0
請說出作用域public,private,protected,以及不寫時的
區(qū)別
這四個作用域的可見范圍如下表所示。
些明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表
示friendlyo
作用域當(dāng)前類同一包(package)子孫類其他包
(package)
publicNd4d
protectedN74x
friendlyNdxx
private4xxx
重載與重寫區(qū)別?
重載是同一個類中,方法名稱相同,但是參數(shù)或個數(shù)不同。與返回
值沒有關(guān)系。
重寫是在多個類中,產(chǎn)生繼承關(guān)系。父類與子類的方法方法必須相
同。
接口與抽象類的區(qū)別?
區(qū)別:定義接口的關(guān)鍵字是:interface而定義抽象類的關(guān)鍵字是:
abstracto
接口中成員不能有私有,抽象類可以。
接口中定義的成員,是finlpublicstatic類型,抽象類沒有。
接口中的不能有普通方法,抽象類中可以。
相同:
兩個都不new
但是接口與抽象類是面向?qū)ο蟊貍渲R,設(shè)計模式、重構(gòu)代碼有必
然作用
final,finally,finalize的區(qū)別。
final用于聲明屬性,方法和類,分別表示屬性不可變,方法不可
覆蓋,類不可繼承。
內(nèi)部類要訪問局部變量,局部變量必須定義成final類型,例如,
一段代碼……
finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候
會調(diào)用被回收對象的此方法,可
以覆蓋此方法提供垃圾收集時的其他資源回收,例如關(guān)閉文件
等。JVM不保證此方法總被
調(diào)用
String、StringBuffer與StringBuilder的區(qū)別
String字符串常量
StringBuffer字符串變量(線程安全)
StringBuilder字符串變量(非線程安全)
所有的類都繼承于object類,你用過的object類的直接子類有哪
些,object類常用的方法
有哪些
1.clone方法
保護方法,實現(xiàn)對象的淺復(fù)制,只有實現(xiàn)了Cloneable接口才可以
調(diào)用該方法,否則拋出CloneNotSupportedException異常。
2.getClass方法
final方法,獲得運行時類型。
3.toString方法
該方法用得比較多,一般子類都有覆蓋。
4.finalize方法
該方法用于釋放資源。因為無法確定該方法什么時候被調(diào)用,很少
使用。
5.equals方法
該方法是非常重要的一個方法。一般equals和==是不一樣的,但是
在Object中兩者是一樣的。子類一般都要重寫這個方法。
6.數(shù)組有沒有l(wèi)ength。這個方法?String有沒有l(wèi)ength。這個方
法?
答:數(shù)組沒有l(wèi)ength。這個方法,有l(wèi)ength的屬性。String有有
length。這個方法。
7.hashCode方法
該方法用于哈希查找,重寫了equals方法一般都要重寫hashCode
方法。這個方法在一些具有哈希功能的Collection中用到。
一般必須滿足objl.equals(obj2)==true??梢酝瞥鰋bjl.hash-
Code()==obj2.hashCode(),但是hashCode相等不一定就滿足
equalSo不過為了提高效率,應(yīng)該盡量使上面兩個條件接近等價。
7.wait方法
wait方法就是使當(dāng)前線程等待該對象的鎖,當(dāng)前線程必須是該對象
的擁有者,也就是具有該對象的鎖。wait。方法一直等待,直到獲
得鎖或者被中斷。wait(longtimeout)設(shè)定一個超時間隔,如果在
規(guī)定時間內(nèi)沒有獲得鎖就返回。
調(diào)用該方法后當(dāng)前線程進入睡眠狀態(tài),直到以下事件發(fā)生。
(1)其他線程調(diào)用了該對象的notify方法。
(2)其他線程調(diào)用了該對象的notifyAll方法。
(3)其他線程調(diào)用了interrupt中斷該線程。
(4)時間間隔到了。
此時該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個
InterruptedException異常。
8.notify方法
該方法喚醒在該對象上等待的某個線程。
9.notifyAll方法
該方法喚醒在該對象上等待的所有線程
反射的優(yōu)缺點?
反射:就是正在運行動態(tài)讀取這個類的完整信息。
優(yōu)點:java的反射機制就是增加程序的靈活性、
缺點:缺點:(1)性能問題:使用反射基本上是一種解釋操作,
用于字段和方法接入時要遠(yuǎn)慢于直接代碼。因此反射機制主要應(yīng)用
在對靈活性和擴展性要求很高的系統(tǒng)框架上,普通程序不建議使用o
(2)使用反射會模糊程序內(nèi)內(nèi)部邏輯:程序員希望在源代碼中看到
程序的邏輯,反射等繞過了源代碼的技術(shù),因而會帶來維護問題。
反射代碼比相應(yīng)的直接代碼更復(fù)雜。
那些地方用到了反射?
例如:jdbc、Java常用框架、jdk的動態(tài)代理、android的加載布局
文件
java中有幾種類型的流?JDK為每種類型的流提供了一些抽象
類以供繼承,為每種類型的流提供了一些抽象類以供繼承,
請說出他們分別是哪些類?
字節(jié)流,字符流。字節(jié)流繼承于InputstreamOutputstream,
字符流繼承于
InputStreamReaderOutputStreamWritero在java.io包中還有
許多其他的流,主要是為了提
高性能和使用方便。
多線程部分
什么是多線程?
在一個應(yīng)用程序中,同時,有多個不同的執(zhí)行路徑。
說一下多線程的好處?
提供程序效率。
線程和進程有什么區(qū)別?
線程是進程的一條執(zhí)行路徑,而進程是線程的集合。
什么是線程同步、異步?
線程同步表示,當(dāng)前線程執(zhí)行完后下一個線程接著執(zhí)行。
線程異步表示,在一個應(yīng)用程序中,同時,有多個不同的執(zhí)行路
徑。例如javawebajaxandroidhandler
線程之間如何同步
線程之間同步使用synchronized、wait與notify
什么是線程不安全?如何解決?(重點)
就是在多個線程共享同一個數(shù)據(jù)會受到其他線程的干擾。如何解
決:使用線程同步技術(shù),用上鎖(synchronized)。讓一個線程執(zhí)行
完了,在讓另一個線程執(zhí)行。
如何創(chuàng)建一個線程?有幾種方法?
繼承thread類,重寫run方法、實現(xiàn)Runnalbe接口,重新
run方法,啟動一個線程用start();
是使用Runnalbe接口好?還是繼承Thread類好?
是實現(xiàn)Runnalbe接口好,因為實現(xiàn)的接口還可以繼續(xù)繼承。如
果繼承了Thread類不能在繼承。
sleep。和wait。有什么區(qū)別?
a、sleep是讓當(dāng)前線程指定休眠時間,然后繼續(xù)工作不釋
放鎖
b、讓當(dāng)前線程wait則是等待,直到有線程通知notify()
喚醒他才會重新工作。釋放鎖
集合相關(guān)面試題
java中集合類的關(guān)系圖
Iterator1:Collect]on匕:Map
:ProducesIjProducest
AAA
|HashMa^j
Listiterator:■<<List:SetTreeMap
Reduces
Ar
LinkedHashMap
ArrayListLinkedjstIHashSetITreeSet
UnkedHashSet
iComparable<7Comparator;
說一下數(shù)據(jù)結(jié)構(gòu)中的什么是數(shù)組?什么是鏈表?
所謂數(shù)組,是相同數(shù)據(jù)類型的元素按一定順序排列的集合
數(shù)組:存儲區(qū)間是連續(xù)的,占用內(nèi)存嚴(yán)重,故空間復(fù)雜的很大。但
數(shù)組的二分查找時間復(fù)雜度小,為0(1);數(shù)組的特點是;尋址容
易,插入和刪除困難;
所謂鏈表,鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),
數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由
一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成,結(jié)點可以在運行
時動態(tài)生成。每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)
域,另一個是存儲下一個結(jié)點地址的指針域。相比于線性表順序結(jié)
構(gòu),操作復(fù)雜。由于不必須按順序存儲,鏈表在插入的時候可以達
到0(1)的復(fù)雜度,比另一種線性表順序表快得多,但是查找一個節(jié)
點或者訪問特定編號的節(jié)點則需要o(n)的時間,而線性表和順序表
相應(yīng)的時間復(fù)雜度分別是0(logn)和0(1)。
鏈表:鏈表存儲區(qū)間離散,占用內(nèi)存比較寬松,故空間復(fù)雜度很小,
但時間復(fù)雜度很大,達0(N)。鏈表的特點是:尋址困難,插入和
刪除容易。
說一下什么是哈希表
那么我們能不能綜合兩者的特性,做出一種尋址容易,插入刪除也
容易的數(shù)據(jù)結(jié)構(gòu)?答案是肯定的,這就是我們要提起的哈希表。哈
希表((Hashtable)既滿足了數(shù)據(jù)的查找方便,同時不占用太多
的內(nèi)容空間,使用也十分方便。
哈希表有多種不同的實現(xiàn)方法,我接下來解釋的是最常用的一
種方法一一拉鏈法,我們可以理解為“鏈表的數(shù)組”,如圖:
0
T1
T
T
T
~5
y
T
T
5
ioa26
i791
12~V2L—*28
13T
14
15
說一下ArrayList底層實現(xiàn)方式?
①ArrayList通過數(shù)組實現(xiàn),一旦我們實例化ArrayList無參數(shù)構(gòu)
造函數(shù)默認(rèn)為數(shù)組初始化長度為10
②add方法底層實現(xiàn)如果增加的元素個數(shù)超過了10個,那么
ArrayList底層會新生成一個數(shù)組,長度為原數(shù)組的1.5倍+L然
后將原數(shù)組的內(nèi)容復(fù)制到新數(shù)組當(dāng)中,并且后續(xù)增加的內(nèi)容都會放
到新數(shù)組當(dāng)中。當(dāng)新數(shù)組無法容納增加的元素時,重復(fù)該過程。是
一旦數(shù)組超出長度,就開始擴容數(shù)組。擴容數(shù)組調(diào)用的方法
Arrays.copyOf(objArr,objArr.length+1);
說一下LinkedList底層實現(xiàn)方式?
LinkedList底層的數(shù)據(jù)結(jié)構(gòu)是基于雙向循環(huán)鏈表的,且頭結(jié)點中不
存放數(shù)據(jù),如下:
Head節(jié)點,不包含數(shù)據(jù)
datadata
既然是雙向鏈表,那么必定存在一種數(shù)據(jù)結(jié)構(gòu)一一我們可以稱之為
節(jié)點,節(jié)點實例保存業(yè)務(wù)數(shù)據(jù),前一個節(jié)點的位置信息和后一個節(jié)
點位置信息,如下圖所示:
[節(jié)點N
節(jié)點N-1前節(jié)點信息業(yè)務(wù)數(shù)據(jù)后節(jié)點信息節(jié)點N+1
說一下HashMap底層實現(xiàn)方式?
HashMap是由數(shù)組+鏈表組成
put方法底層實現(xiàn):
通過key的hash值%£11宜丫[].length得到該存儲的下標(biāo)位置,如果
多個key的hash值%£成燈口.length值相同話就就會存儲到該鏈表
的后面。
ArrayList和Vector的區(qū)別
這兩個類都實現(xiàn)了List接口(List接口繼承了
Collection接口),他們都是有序集合,即存儲在這兩個集合中的元
素的位置都是有順序的,相當(dāng)于一種動態(tài)的數(shù)組,我們以后可以按位
置索引號取出某個元素,并且其中的數(shù)據(jù)是允許重復(fù)的,
ArrayList與Vector的區(qū)別,這主要包括兩個方面:.
⑴同步性:
Vector是線程安全的,也就是說是它的方法之間是線程同步的,
而ArrayList是線程序不安全的,它的方法之間是線程不同步的。
如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它
不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好
是使用Vector,因為不需要我們自己再去考慮和編寫線程安全的代
碼。
(2)數(shù)據(jù)增長:
ArrayList與Vector都有一個初始的容量大小,當(dāng)存儲進它們
里面的元素的個數(shù)超過了容量時,就需要增
加ArrayList與Vector的存儲空間,每次要增加存儲空間時,
不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲
單元的個數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。
Vector默認(rèn)增長為原來兩倍,而ArrayList的增長策略在文檔
中沒有明確規(guī)定(從源代碼看到的是增長為原來的1.5倍)。
ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還
可以設(shè)置增長的空間大小,而ArrayList沒有提供設(shè)置增長空間
的方法。
HashMap和Hashtable的區(qū)別
總結(jié):
克允許有HashMap是HashMap
方法不是
呈有效率containsvalueJaval.2引是
Synchronize
hashmap>'null高一和進的MapHashtable
的要提供外
E的鍵點、containsKeyinterface的輕量級
同步
R和值方法的一個實現(xiàn)實現(xiàn)
我不允、
Hashtable
告許有效率方法是是Hashtable
有contains方比
hashtable_三null稍Synchronize繼承于
法方法HashMap
:的鍵低、的Dictionary
要舊
亡和值類
List和Set、Map區(qū)別?
Java中的集合包括三大類,它們是Set、List和Map,它們都處于
java.util包中,Set、List和Map都是接口,它們有各自的實現(xiàn)類。
Set的實現(xiàn)類主要有HashSet和TreeSet,List的實現(xiàn)類主要有
ArrayList,Map的實現(xiàn)類主要有HashMap和TreeMap。
Set中的對象不按特定方式排序,并且沒有重復(fù)對象。但它的
有些實現(xiàn)類能對集合中的對象按特定方式排序,例如TreeSet類,
它可以按照默認(rèn)排序,也可以通過實現(xiàn)
java.util.Comparator〈Type>接口來自定義排序方式。
List中的對象按照索引位置排序,可以有重復(fù)對象,允許按照
對象在集合中的索引位置檢索對象,如通過list,get(i)方式來獲
得List集合中的元素。
Map中的每一個元素包含一個鍵對象和值對象,它們成對出現(xiàn)。
鍵對象不能重復(fù),值對象可以重復(fù)。
List、Map、Set三個接口,存取元素時,各有什么特點?
list:存儲:有序的可重復(fù)的
訪問:可以for循環(huán),foreach循環(huán),iterator迭代器迭代。
set:存儲:無序的不重復(fù)的
訪問:可以foreach循環(huán),iterator迭代器迭代
map:存儲:存儲的是一對一對的映射“key=value",key值是
無序,不重復(fù)的。value值可重復(fù)
訪問:可以map中key值轉(zhuǎn)為為set存儲,然后迭代這個set,用
map.get(key)獲取value
也可以轉(zhuǎn)換為entry對象用迭代器迭代
說出ArrayList,Vector,LinkedList的存儲性能和特性
ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)
大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號
索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索
引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法
(線程安全),通常性能上較ArrayList差,而LinkedList使用雙
向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行前向或后向遍歷,但是
插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。
去掉一個Vector集合中重復(fù)的元素
通過Vector,contains()方法判斷是否包含該元素,如果沒有包
含就添加到新的集合當(dāng)中,適用于數(shù)據(jù)較小的情況下。
Collection和Collections的區(qū)別。
Collection是集合類的上級接口,繼承于它的接口主要有Set和
ListoCollections是針對集合類的一個幫助類,它提供了一系列
靜態(tài)方法實現(xiàn)了對各種集合的排序,搜索和線程安全等操作。
Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢?是
用==還是equals()?它們有何區(qū)別?
set里的元素是不能重復(fù)的,用iterator。方法來區(qū)分重復(fù)與否。
equals方法(是String類從它的超類Object中繼承的)被用來檢
測兩個對象是否相等,即兩個對象的內(nèi)容是否相等。
==用于比較引用和比較基本數(shù)據(jù)類型時具有不同的功能:
比較基本數(shù)據(jù)類型,如果兩個值相同,則結(jié)果為true
而在比較引用時,如果引用指向內(nèi)存中的同一對象,結(jié)果為true
HashMap面試題
HashMap的工作原理是近年來常見的Java面試題。幾乎每個Java
程序員都知道HashMap,都知道哪里要用HashMap,知道Hashtable
和HashMap之間的區(qū)別,那么為何這道面試題如此特殊呢?是因為
這道題考察的深度很深。這題經(jīng)常出現(xiàn)在高級或中高級面試中。投
資銀行更喜歡問這個問題,甚至?xí)竽銓崿F(xiàn)HashMap來考察你的
編程能力。ConcurrentHashMap和其它同步集合的引入讓這道題變
得更加復(fù)雜。讓我們開始探索的旅程吧!
先來些簡單的問題
“你用過HashMap嗎?”“什么是HashMap?你為什么用到它?”
幾乎每個人都會回答,,是的”,然后回答HashMap的一些特性,譬
如HashMap可以接受null鍵值和值,而Hashtable則不能;
HashMap是非synchronized;HashMap很快;以及HashMap儲存的是
鍵值對等等。這顯示出你已經(jīng)用過HashMap,而且對它相當(dāng)?shù)氖煜ぁ?/p>
但是面試官來個急轉(zhuǎn)直下,從此刻開始問出一些刁鉆的問題,關(guān)于
HashMap的更多基礎(chǔ)的細(xì)節(jié)。面試官可能會問出下面的問題:
“你知道HashMap的工作原理嗎?”“你知道HashMap的get()方
法的工作原理嗎?”
你也許會回答“我沒有詳查標(biāo)準(zhǔn)的JavaAPI,你可以看看Java源
代碼或者OpenJDK。”“我可以用Google找到答案?!?/p>
但一些面試者可能可以給出答案,“HashMap是基于hashing的原
理,我們使用put(key,value)存儲對象到HashMap中,使用
get(key)從HashMap中獲取對象。當(dāng)我們給put()方法傳遞鍵和值
時,我們先對鍵調(diào)用hashCode()方法,返回的hashCode用于找到
bucket位置來儲存Entry對象?!边@里關(guān)鍵點在于指出,HashMap
是在bucket中儲存鍵對象和值對象,作為Map.Entry。這一點有助
于理解獲取對象的邏輯。如果你沒有意識到這一點,或者錯誤的認(rèn)
為僅僅只在bucket中存儲值的話,你將不會回答如何從HashMap中
獲取對象的邏輯。這個答案相當(dāng)?shù)恼_,也顯示出面試者確實知道
hashing以及HashMap的工作原理。但是這僅僅是故事的開始,當(dāng)
面試官加入一些Java程序員每天要碰到的實際場景的時候,錯誤的
答案頻現(xiàn)。下個問題可能是關(guān)于HashMap中的碰撞探測(collision
detection)以及碰撞的解決方法:
“當(dāng)兩個對象的hashcode相同會發(fā)生什么?”從這里開始,真正
的困惑開始了,一些面試者會回答因為hashcode相同,所以兩個對
象是相等的,HashMap將會拋出異常,或者不會存儲它們。然后面
試官可能會提醒他們有equals()和hashCode()兩個方法,并告訴他
們兩個對象就算hashcode相同,但是它們可能并不相等。一些面試
者可能就此放棄,而另外一些還能繼續(xù)挺進,他們回答“因為
hashcode相同,所以它們的bucket位置相同,'碰撞'會發(fā)生。
因為HashMap使用鏈表存儲對象,這個Entry(包含有鍵值對的
Map.Entry對象)會存儲在鏈表中。”這個答案非常的合理,雖然有
很多種處理碰撞的方法,這種方法是最簡單的,也正是HashMap的
處理方法。但故事還沒有完結(jié),面試官會繼續(xù)問:
“如果兩個鍵的hashcode相同,你如何獲取值對象?”面試者會
回答:當(dāng)我們調(diào)用get()方法,HashMap會使用鍵對象的hashcode
找到bucket位置,然后獲取值對象。面試官提醒他如果有兩個值對
象儲存在同一個bucket,他給出答案:將會遍歷鏈表直到找到值對
象。面試官會問因為你并沒有值對象去比較,你是如何確定確定找
到值對象的?除非面試者直到HashMap在鏈表中存儲的是鍵值對,
否則他們不可能回答出這一題。
其中一些記得這個重要知識點的面試者會說,找到bucket位置之后,
會調(diào)用keys,equals()方法去找到鏈表中正確的節(jié)點,最終找到要
找的值對象。完美的答案!
許多情況下,面試者會在這個環(huán)節(jié)中出錯,因為他們混淆了
hashCode()和equals。方法。因為在此之前hashCode()屢屢出現(xiàn),
而equals。方法僅僅在獲取值對象的時候才出現(xiàn)。一些優(yōu)秀的開發(fā)
者會指出使用不可變的、聲明作final的對象,并且采用合適的
equals。和hashCode()方法的話,將會減少碰撞的發(fā)生,提高效率。
不可變性使得能夠緩存不同鍵的hashcode,這將提高整個獲取對象
的速度,使用String,Interger這樣的wrapper類作為鍵是非常好
的選擇。
如果你認(rèn)為到這里已經(jīng)完結(jié)了,那么聽到下面這個問題的時候,你
會大吃一驚。“如果HashMap的大小超過了負(fù)載因子(loadfactor)
定義的容量,怎么辦?”除非你真正知道HashMap的工作原理,否
則你將回答不出這道題。默認(rèn)的負(fù)載因子大小為0.75,也就是說,
當(dāng)一個map填滿了75%的bucket時候,和其它集合類(如ArrayList
等)一樣,將會創(chuàng)建原來HashMap大小的兩倍的bucket數(shù)組,來重
新調(diào)整map的大小,并將原來的對象放入新的bucket數(shù)組中。這個
過程叫作rehashing,因為它調(diào)用hash方法找到新的bucket位置。
如果你能夠回答這道問題,下面的問題來了:“你了解重新調(diào)整
HashMap大小存在什么問題嗎?"你可能回答不上來,這時面試官
會提醒你當(dāng)多線程的情況下,可能產(chǎn)生條件競爭(racecondition)o
當(dāng)重新調(diào)整HashMap大小的時候,確實存在條件競爭,因為如果兩
個線程都發(fā)現(xiàn)HashMap需要重新調(diào)整大小了,它們會同時試著調(diào)整
大小。在調(diào)整大小的過程中,存儲在鏈表中的元素的次序會反過來,
因為移動到新的bucket位置的時候,HashMap并不會將元素放在鏈
表的尾部,而是放在頭部,這是為了避免尾部遍歷(tail
traversing)o如果條件競爭發(fā)生了,那么就死循環(huán)了。這個時候,
你可以質(zhì)問面試官,為什么這么奇怪,要在多線程的環(huán)境下使用
HashMap呢?:)
熱心的讀者貢獻了更多的關(guān)于HashMap的問題:
為什么String,Interger這樣的wrapper類適合作為
鍵?String,Interger這樣的wrapper類作為HashMap的鍵是再
適合不過了,而且String最為常用。因為String是不可變的,也
是final的,而且已經(jīng)重寫了equals。和hashCode()方法了。其他
的wrapper類也有這個特點。不可變性是必要的,因為為了要計算
hashCode(),就要防止鍵值改變,如果鍵值在放入時和獲取時返回
不同的hashcode的話,那么就不能從HashMap中找到你想要的對象。
不可變性還有其他的優(yōu)點如線程安全。如果你可以僅僅通過將某個
field聲明成final就能保證hashCode是不變的,那么請這么做吧。
因為獲取對象的時候要用到equals()和hashCode()方法,那么鍵對
象正確的重寫這兩個方法是非常重要的。如果兩個不相等的對象返
回不同的hashcode的話,那么碰撞的幾率就會小些,這樣就能提高
HashMap的性能。
我們可以使用自定義的對象作為鍵嗎?這是前一個問題的延伸。
當(dāng)然你可能使用任何對象作為鍵,只要它遵守了equals。和
hashCode()方法的定義規(guī)則,并且當(dāng)對象插入到Map中之后將不會
再改變了。如果這個自定義對象時不可變的,那么它已經(jīng)滿足了作
為鍵的條件,因為當(dāng)它創(chuàng)建之后就已經(jīng)不能改變了。
我們可以使用CocurrentHashMap來代替Hashtable嗎?這是另外一
個很熱門的面試題,因為ConcurrentHashMap越來越多人用了。我
們知道Hashtable是synchronized的,但是ConcurrentHashMap
同步性能更好,因為它僅僅根據(jù)同步級別對map的一部分進行上鎖。
ConcurrentHashMap當(dāng)然可以代替HashTable,但是HashTable提
供更強的線程安全性??纯催@篇博客查看Hashtable和
ConcurrentHashMap的區(qū)別。
我個人很喜歡這個問題,因為這個問題的深度和廣度,也不直接的
涉及到不同的概念。讓我們再來看看這些問題設(shè)計哪些知識點:
hashing的概念
HashMap中解決碰撞的方法
equals()和hashCode()的應(yīng)用,以及它們在HashMap中的重要性
不可變對象的好處
HashMap多線程的條件競爭
重新調(diào)整HashMap的大小
總結(jié)
HashMap的工作原理
HashMap基于hashing原理,我們通過put()和get()方法儲存和獲
取對象。當(dāng)我們將鍵值對傳遞給put()方法時,它調(diào)用鍵對象的
hashCode()方法來計算hashcode,讓后找到bucket位置來儲存值
對象。當(dāng)獲取對象時,通過鍵對象的equals。方法找到正確的鍵值
對,然后返回值對象。HashMap使用鏈表來解決碰撞問題,當(dāng)發(fā)生
碰撞了,對象將會儲存在鏈表的下一個節(jié)點中。HashMap在每個鏈
表節(jié)點中儲存鍵值對對象。
當(dāng)兩個不同的鍵對象的hashcode相同時會發(fā)生什么?它們會儲存
在同一個bucket位置的鏈表中。鍵對象的equals()方法用來找到
鍵值對。
因為HashMap的好處非常多,我曾經(jīng)在電子商務(wù)的應(yīng)用中使用
HashMap作為緩存。因為金融領(lǐng)域非常多的運用Java,也出于性能
的考慮,我們會經(jīng)常用到HashMap和ConcurrentHashMap。你可以
查看更多的關(guān)于HashMap的文章:
請講下Java里面的容器
分兩大類,Map和Collection0而Collection又有子接口
List(數(shù)據(jù)存儲順序和插入順序是一樣的)、Set(里面的元素具有唯
一性)
Map是存儲鍵值對的,里面的健不可以重復(fù),但值可以重復(fù)
a.對于List主要有ArrayList和LinkedList兩種實現(xiàn)。實現(xiàn)的
數(shù)據(jù)結(jié)構(gòu)不同,所以主要的區(qū)別也都是和數(shù)據(jù)結(jié)構(gòu)相關(guān)的。
ArrayList基于數(shù)組,隨機訪問快,而對于中間元素的插入刪除效
率比較低,而且需要考慮擴容問題。LinkedList,則基于鏈表,
和ArrayList提到的正相反,隨機訪問慢,但對于中間元素的插入
和刪除更有效率。
Set也是一種Collection,和List比起來主要體現(xiàn)在元素唯一性。
請說下Iterator的作用
迭代器可以實現(xiàn)Collection接口的方法,可以一個一個地獲取集
合中的元素
在遍歷集合時可判斷是否有下一個元素
說下ArrayList和LinkedList的區(qū)別和聯(lián)系,并說明什么情況下用
它們
區(qū)別:ArrayList用于對象的隨機訪問速度快,沒有順序
LinkedList實現(xiàn)機制是鏈表式的,和順序有關(guān),速度比ArrayList慢
聯(lián)系:ArrayList和LinkedList都是List接口的實現(xiàn)類
當(dāng)要快速獲取一個值時,用ArrayList,用于順序插入操作時,用
LinkedList.
說下List,Set,Map三種集合各有什么特征
List集合中的元素可以重復(fù),
Set集合中的元素不可以重復(fù)
Map集合用鍵-值映射存放對象,Map容器中的鍵對象不能重復(fù),值對
象可以重復(fù)
HashSet和TreeSet有什么區(qū)別,什么時候用它們
區(qū)別:HashSet中的元素不能重復(fù),沒有順序
TreeSet中的元素不能重復(fù),但有順序
當(dāng)集合中的元素需要排序時,用TreeSet
一般情況下用HashSet,因為不需要排序,速度比TreeSet快
什么是泛型,怎么使用的,有什么好處?
答案
定義一個集合時,可以知道里面定義的是什么類型
使用:在集合類型后面加<數(shù)據(jù)類型>
使用泛型后,從集合中取得元素后就不用再用強轉(zhuǎn)
什么是foreach循環(huán),它可以循環(huán)那些數(shù)據(jù)類型
答案
也可以叫增強型循環(huán),通過對象拿到集合里的值,因為擴展性比
較強,建議多使用
可以用來循環(huán)集合和數(shù)組
比較下集合和數(shù)組的優(yōu)缺點
集合是多個對象的容器,可以將不同數(shù)據(jù)類型的多個對象組織在一
起
數(shù)組類型是有相同數(shù)據(jù)類型的數(shù)據(jù)集合,數(shù)組是很多語言都支持的底
層數(shù)據(jù)結(jié)構(gòu),性能上是最高的
HashMap與LinkedHashMap,和TreeMap的區(qū)別。
共同點:HashMap,LinkedHashMap,TreeMap都屬于Map的實現(xiàn)類.
不同點:1.HashMap里面存入的鍵值對在取出的時候是隨機的,
2.TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或
自定義順序遍歷鍵,那么TreeMap會更好。
3.LinkedHashMap是HashMap的一個子類,如果需要輸出的順序和
輸入的相同,那么用LinkedHashMap可以實現(xiàn).
在List里面怎么去掉重復(fù)的數(shù)?
通過把List里面的數(shù)據(jù)放入HashSet可以去除重復(fù)
HashMap和ArrayList是不是都是線程不安全的?
ArrayList是線程不安全的;HashMap是線程不安全的;還有我們常
見的一些JAVA集合都是線程不安全,這樣做是為了提高性能
在JDK5以后提供了線程安全的并發(fā)包java.util.concurrent并發(fā)
包,譬如里面的類
CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap
等
ArrayList集合加入1萬條數(shù)據(jù),應(yīng)該怎么提高效率
因為ArrayList的底層是數(shù)組實現(xiàn),并且數(shù)組的默認(rèn)值是10,如果
插入10000條要不斷的擴容,耗費時間,所以我們調(diào)用ArrayList的
指定容量的構(gòu)造器方法ArrayList(intsize)就可以實現(xiàn)不擴容,
就提高了性能
網(wǎng)路通訊部分
客戶茸附名器
HTTP幅務(wù)器
TCP
IP
以太網(wǎng)協(xié)議
Xml與JSON區(qū)別
數(shù)據(jù)交換格式
區(qū)別:
xml是重量級、json是輕量級
xml比較占帶寬、json占帶寬小,易于壓縮
json在webservice用的比較少、xml用的較多
相同:
兩者都用在項目交互下例如移動app接口用的就是json、在
web項目中與其他項目對接用xml較多。
json常用解析方法gson、jsonobject>jackson等xmldomsax
pull解析
TCP與UDP區(qū)別?
udp:a、是面向無連接,將數(shù)據(jù)及源的封裝成數(shù)據(jù)包中,不需要
建立建立連接
b、每個數(shù)據(jù)報的大小在限制64k內(nèi)
c、因無連接,是不可靠協(xié)議
d、不需要建立連接,速度快
tcp:a、建議連接,形成傳輸數(shù)據(jù)的通道.
b、在連接中進行大數(shù)據(jù)量傳輸,以字節(jié)流方式
c通過三次握手完成連接,是可靠協(xié)議
d必須建立連接m效率會稍低
聊天、網(wǎng)絡(luò)視頻會議、桌面共享用的就是udp
說說三次握手?
1)第一次握手:建立連接時,客戶端A發(fā)送SYN包(SYN=j)到
服務(wù)器B,并進入SYN_SEND狀態(tài),等待服務(wù)器B確認(rèn)。
(2)第二次握手:服窩器B收到SYN包,必須確認(rèn)客戶A的SYN
(ACK=j+l),同時自己也發(fā)送一個SYN包(SYN=k),即SYN+ACK
包,此時服務(wù)器B進入SYN_RECV狀態(tài)。
(3)第三次握手:客戶端X收到服務(wù)器B的SYN+ACK包,向服務(wù)
器B發(fā)送確認(rèn)包ACK(ACK=k+l),此包發(fā)送完畢,客戶端A和服務(wù)
器B進入ESTABLISHED狀態(tài),完成三次握手。
完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)。
什么是Webserivce?
Webservice就是提供不同的平臺相互通訊,基于Soap協(xié)議。
Webservice就是一個應(yīng)用程序,它向外界暴露出一個能夠通過
Web進行調(diào)用的API。
SOAP是一種簡單基于xml的輕量協(xié)議,用戶web上交換結(jié)構(gòu)化信息
和類型信息。
soap請求是HTTPPOST的一個專用版本,遵循一種特殊的xml消息
格式Content-type設(shè)置為:text/xml任何數(shù)據(jù)都可以xml化。
WebService實現(xiàn)原理是?
HTTP協(xié)議+XML
說一下什么是Http協(xié)議?
對器客戶端和服務(wù)器端之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范,格式簡稱為“超
文本傳輸協(xié)議”。
什么是Http協(xié)議無狀態(tài)協(xié)議?怎么解決Http協(xié)議無狀態(tài)協(xié)議?
(曾經(jīng)去某創(chuàng)業(yè)公司問到)
1、無狀態(tài)協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后
續(xù)處理需要前面的信息
2、無狀態(tài)協(xié)議解決辦法:通過1、Cookie2、通過Session會話
保存。
說一下Http協(xié)議中302狀態(tài)(阿里經(jīng)常問)
http協(xié)議中,返回狀態(tài)碼302表示重定向。
這種情況下,服務(wù)器返回的頭部信息中會包含一個Location字段,
內(nèi)容是重定向到的url
Http協(xié)議有什么組成?
請求報文包含三部分:
a、請求行:包含請求方法、URI、HTTP版本信息
b、請求首部字段
c、請求內(nèi)容實體
響應(yīng)報文包含三部分:
a、狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語
b、響應(yīng)首部字段
c、響應(yīng)內(nèi)容實體
Http協(xié)議中有那些請求方式?
GET:用于請求訪問已經(jīng)被URI(統(tǒng)一資源標(biāo)識符)識別的資源,
可以通過URL傳參給服務(wù)器
POST:用于傳輸信息給服務(wù)器,主要功能與GET方法類似,但一般
推薦使用POST方式。
PUT:傳輸文件,報文主體中包含文件內(nèi)容,保存到對應(yīng)URI位置。
HEAD:獲得報文首部,與GET方法類似,只是不返回報文主體,一
般用于驗證URI是否有效。
DELETE:刪除文件,與PUT方法相反,刪除對應(yīng)URI位置的文件。
OPTIONS:查詢相應(yīng)URI支持的HTTP方法。
Http協(xié)議中Httpl.0與1.1區(qū)別?
在httpl.O中,當(dāng)建立連接后,客戶端發(fā)送一個請求,服務(wù)器端返
回一個信息后就關(guān)閉連接,當(dāng)瀏覽器下次請求的時候又要建立連接,
顯然這種不斷建立連接的方式,會造成很多問題。
5.在httpl.1中,引入了持續(xù)連接的概念,通過這種連接,瀏覽器
可以建立一個連接之后,發(fā)送請求并得到返回信息,然后繼續(xù)發(fā)送
請求再次等到返回信息,也就是說客戶端可以連續(xù)發(fā)送多個請求,
而不用等待每一個響應(yīng)的到來。
Http協(xié)議實現(xiàn)原理機制?
2.1,整個流程步驟
①域名解析②發(fā)起TCP的三次握手3發(fā)起HTTPi青求
⑨力慌器解析HTML代碼,。瀏覽器對頁面的
'④服務(wù)器晌應(yīng)HTTP請求「并請求HTML代碼中的資源
歌呈現(xiàn)給用戶
(如$、CSS、圖片等)
2.2、域名解析過程
憎索姆作系坎|
憎零用室器自身向本也配置的落選DNS服打;
的DN5韁存一自我的DNS縊f*發(fā)起域名解析請求
;NO1NO
YES
IYES
線所結(jié)束解析結(jié)束鱷物崎束
股是不會進行到一下的步費的
7NONOzu
查找NetBIOSI查詢WINS那包器1迸行廣搐座??;_=讀取LMHOST5文件
nameCache~
______,」I1
廣丁JYESjYESjYES
解析結(jié)束|解舊告束|皖折結(jié)束|.、結(jié)束|
2.3、三次握手過程
2.4、發(fā)起HTTP請求
2.5、響應(yīng)HTTP請求并得到HTML代碼
2.6、瀏覽器解析HTML代碼
2.7、瀏覽器對頁面進行渲染呈現(xiàn)給用戶
get與post請求區(qū)別?(初級程序員必備問題)
區(qū)別一:
get重點在從服務(wù)器上獲取資源,post重點在向服務(wù)器發(fā)送數(shù)
據(jù);
區(qū)別二:
get傳輸數(shù)據(jù)是通過URL請求,以field(字段)=value的
形式,置于URL后,并用〃?〃連接,多個請求數(shù)據(jù)間用〃&〃連接,如
http://127.0.0.1/Test/login.action?name=admin&password=adm
in,這個過程用戶是可見的;
post傳輸數(shù)據(jù)通過Http的post機制,將字段與對應(yīng)值封存在請
求實體中發(fā)送給服務(wù)器,這個過程對用戶是不可見的;
區(qū)別三:
Get傳輸?shù)臄?shù)據(jù)量小,因為受URL長度限制,但效率較高;
Post可以傳輸大量數(shù)據(jù),所以上傳文件時只能用Post方式;
區(qū)別四:
get是不安全的,因為URL是可見的,可能會泄露私密信息,
如密碼等;
post較get安全性較高;
區(qū)別五:
get方式只能支持ASCII字符,向服務(wù)器傳的中文字符可能
會亂碼。
post支持標(biāo)準(zhǔn)字符集,可以正確傳遞中文字符。
9、Http請求報文與響應(yīng)報文格式?
請求報文包含三部分:
a、請求行:包含請求方法、URI、HTTP版本信息
b、請求首部字段
c、請求內(nèi)容實體
響應(yīng)報文包含三部分:
a、狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語
b、響應(yīng)首部字段
c、響應(yīng)內(nèi)容實體
10、常見Http協(xié)議狀態(tài)?
200:請求被正常處理
204:請求被受理但沒有資源可以返回
206:客戶端只是請求資源的一部分,服務(wù)器只對請求的部分資源
執(zhí)行GET方法,相應(yīng)報文中通過Content-Range指定范圍的資源。
301:永久性重定向
302:臨時重定向
303:與302狀態(tài)碼有相似功能,只是它希望客戶端在請求一個
URI的時候,能通過GET方法重定向到另一個URI上
304:發(fā)送附帶條件的請求時,條件不滿足時返回,與重定向無關(guān)
307:臨時重定向,與302類似,只是強制要求使用POST方法
400:請求報文語法有誤,服務(wù)器無法識別
401:請求需要認(rèn)證
403:請求的對應(yīng)資源禁止被訪問
404:服務(wù)器無法找到對應(yīng)資源
500:服務(wù)器內(nèi)部錯誤
503:服務(wù)器正忙
Http協(xié)議首部字段?
a、通用首部字段(請求報文與響應(yīng)報文都會使用的首部字段)
Date:創(chuàng)建報文時間
Connection:連接的管理
Cache-Control:緩存的控制
Transfer-Encoding:報文主體的傳輸編碼方式
b、請求首部字段(請求報文會使用的首部字段)
Host:請求資源所在服務(wù)器
Accept:可處理的媒體類型
Accept-Charset:可接收的字符集
Accept-Encoding:可接受的內(nèi)容編碼
Accept-Language:可接受的自然語言
c、響應(yīng)首部字段(響應(yīng)報文會使用的首部字段)
Accept-Ranges:可接受的字節(jié)范圍
Location:令客戶端重新定向到的URI
Server:HTTP服務(wù)器的安裝信息
d、實體首部字段(請求報文與響應(yīng)報文的的實體部分使用的首部
字段)
Allow:資源可支持的HTTP方法
Content-Type:實體主類的類型
Content-Encoding:實體主體適用的編碼方式
Content-Language:實體主體的自然語言
Content-Length:實體主體的的字節(jié)數(shù)
Content-Range:實體主體的位置范圍,一般用于發(fā)出部分請求時
使用
Http與Https優(yōu)缺點?
a、通信使用明文不加密,內(nèi)容可能被竊聽,也就是被抓包分析。
b、不驗證通信方身份,可能遭到偽裝
c、無法驗證報文完整性,可能被篡改
HTTPS就是HTTP加上加密處理(一般是SSL安全通信線路)+認(rèn)證
+完整性保護
Http優(yōu)化
利用負(fù)載均衡優(yōu)化和加速HTTP應(yīng)用
利用HTTPCache來優(yōu)化網(wǎng)站
Http協(xié)議有那些特征?
1、支持客戶/服務(wù)器模式;2、簡單快速;3、靈活;4、無連接;
5、無狀態(tài);
如果你還對Http協(xié)議不熟悉的話,請參考Http協(xié)議
http://www.itmayiedu.com/front/articleinfo/49.html文章
JavaWeb基礎(chǔ)部分
講下Servlet的執(zhí)行流程。doGet和doPost的區(qū)別
Servlet的執(zhí)行流程也就是servlet的生命周期,當(dāng)服務(wù)器啟動
的時候生命周期開始,然后通過init()《啟動順序根據(jù)web.xml里
的startup-on-load來確定加載順序》方法初始化servlet,再根
據(jù)不同請求調(diào)用doGet或doPost方法,最后再通過destroy。方法
進行銷毀。
doGet和doPost都是接受用戶請求的方法,doGet處理get請求,
doPost處理post請求,doGet用于地址欄提交,doPost用于表單
提交,在頁面提交數(shù)據(jù)時,get的數(shù)據(jù)大小有限制4k,post沒有限
制,get請求提交的數(shù)據(jù)會在地址欄顯示,post不顯示,所以post
比get安全.
當(dāng)service有一個實例變量,doGet和doPost去調(diào)用這個變量,會
出現(xiàn)什么問題,你是如何解決的。
會出現(xiàn)線程不安全問題。無論是doGet還是doPost去調(diào)用,服務(wù)
器端處理的過程都是一樣的,那么我們可以把處理過程單獨寫在另
外一個方法handle里,讓兩個方法都去調(diào)用handle,根據(jù)不同請
求去調(diào)用不同的方法。
如何處理servlet的線程不安全問題
線程安全就是多線程操作同一個對象不會有問題,線程同步一般
來保護線程安全,所以可以在Servlet的線程里面加上同步方法或
同步塊。(Synchronized)可以保證在同一時間只有一個線程訪問,
(使用同步塊會導(dǎo)致性能變差,最好不去使用實例變量)
Jsp的重定向和轉(zhuǎn)發(fā)的流程有什么區(qū)別
重定向是客戶端行為,轉(zhuǎn)發(fā)是服務(wù)器端行為
重定向時服務(wù)器產(chǎn)生兩次請求,轉(zhuǎn)發(fā)產(chǎn)生一次請求,重定向時可
以轉(zhuǎn)發(fā)到項目以外的任何網(wǎng)址,轉(zhuǎn)發(fā)只能在當(dāng)前項目里轉(zhuǎn)發(fā)
重定向會導(dǎo)致request對象信息丟失。轉(zhuǎn)發(fā)則不會
轉(zhuǎn)發(fā)的url不會變,request.getRequestDispatch()。forward()
重定向的url會改變,response.getRedirect();
Jsp和servlet的區(qū)別
jsp的可讀性強,容易維護,并且jsp在最后會編譯成servlet
servlet容易調(diào)試
Jsp的九大內(nèi)置對象,三大指令,七大動作的具體功能
JSP九大內(nèi)置對象:
pageContext:只對當(dāng)前jsp頁面有效,里面封裝了基本的request
和session的對象
Request:對當(dāng)前請求進行封裝
Session:瀏覽器會話對象,瀏覽器范圍內(nèi)有效
Application:應(yīng)用程序?qū)ο螅瑢φ麄€web工程都有效
Out:頁面打印對象,在jsp頁面打印字符串
Response:返回服務(wù)器端信息給用戶
Config:單個servlet的配置對象,相當(dāng)于servletConfig對象
Page:當(dāng)前頁面對象,也就是this
Exception:錯誤頁面的exception對象,如果指定的是錯誤頁面,
這個就是異常對象
三大指令;
Page:指令是針對當(dāng)前頁面的指令
Include:用于指定如何包含另一個頁面
Taglib:用于定義和指定自定義標(biāo)簽
七大動作:
Forward,執(zhí)行頁面跳轉(zhuǎn),將請求的處理轉(zhuǎn)發(fā)到另一個頁面
Param:用于傳遞參數(shù)
Include:用于動態(tài)引入一個jsp頁面
Plugin:用于下載javaBean或applet到客戶端執(zhí)行
useBean:使用javaBean
setProperty:修改javaBean實例的屬性值
getProperty:獲取javaBean實例的屬性值
獲取頁面的元素和值有幾種方式,分別說一下
request.getParameter()返回客戶端的請求參數(shù)與值
request.getParameterNames()返回所有可用屬性名的枚舉
request.getParameterValues()返回包含參數(shù)的所有值的數(shù)組
servlet和JavaScript的區(qū)別,他們分別是什么作用
一個是服務(wù)端,一個是客戶端
Servlet是獨立于平臺和協(xié)議的服務(wù)器端的java應(yīng)用程序,可以動態(tài)
生成web頁面,并采用響應(yīng)--請求的模式提供web服務(wù)
JavaScript是一種解釋性語言,用于向html頁面提供交互行為,通
常被直接嵌入在html頁面中
servlet是java語言編寫的web應(yīng)用
js是基于html上的一種解釋語言
會話跟蹤有哪些,他們的區(qū)別是什么
Cookie,session和application,
Cookie是http對象,客戶端與服務(wù)端都可以操縱
cookie是在客戶端保持狀態(tài),session是在服務(wù)器端保持狀態(tài),由于
cookie是保存在客戶端本地的,所以數(shù)據(jù)很容易被竊取,當(dāng)訪問量
很多時,使用session則會降低服務(wù)器的性能,application的作用域
是整個工程里只有一個,可以在不同瀏覽器之間共享數(shù)據(jù),所有人
都可以共享,因此application也是不安全的
說說jsp的隱藏對象有哪些
Request,out,response,pageContext,session,application,config,p
age,exception,也即jsp的九大內(nèi)置對象
request,response,session和application是怎么用的
Request是客戶端向服務(wù)端發(fā)送請求
Response是服務(wù)端對客戶端請求做出響應(yīng)
Session在servlet中不能直接使用,需要通過getSession()創(chuàng)建,如
果沒有設(shè)定它的生命周期,或者通過invildate。方法銷毀,關(guān)閉瀏
覽器session就會消失
Application不能直接創(chuàng)建,存在于服務(wù)器的內(nèi)存中,由服務(wù)器創(chuàng)建
和銷毀
jsp頁面跳轉(zhuǎn)
Jsp頁面跳轉(zhuǎn)有兩種方式,forward和redirect(轉(zhuǎn)發(fā)和重定向)
Forward只能在當(dāng)前項目里跳轉(zhuǎn),只產(chǎn)生一次請求,request保存的
變量不會丟失,url地址不會改變
Redirect可跳轉(zhuǎn)到項目以外的任何頁面,產(chǎn)生兩次請求,request保
存的變量會全部丟失,url地址會發(fā)生改變,變化為第二個請求的地
址
話跟蹤
如果創(chuàng)建servlet實例不用構(gòu)造方法,怎么創(chuàng)建一個servlet實例
Web容器會自動為servlet寫一個無參的構(gòu)造器,它使用
dass.forName("").newInstance()反射來創(chuàng)建servlet實例的
Servlet是安全的嗎?當(dāng)service有一^t'實例變量,doGet和
doPost去調(diào)用這個變量,會出現(xiàn)什么問題,你是如何解決的
是線程不安全的,因為servlet是單例模式,當(dāng)多個客戶端共同訪問
的時候線程不安全。
盡量用局部變量,同步塊,如果當(dāng)前字段是不會改變的,用final修
飾
Java框架部分
說說Spring?
Spring的核心是控制反轉(zhuǎn)、依賴注入,Aop(面向切面)相當(dāng)于把每
個bean與bean之間的關(guān)系交給第三方容器進行管理.
說SpringIOC>SpringAOP?
SpringIOC,其實就是依賴注入、控制反轉(zhuǎn)。相當(dāng)于把每個bean與
bean之間的關(guān)系交給第三方容器管理。而這個容器就是spring
SpringAOP面向切面的編程,或A0P,是一種編程技術(shù),允許程序
模塊化橫向切割關(guān)注點,或橫切典型的責(zé)任劃分,如日志和事務(wù)管
理。SpringAop就是用Javva的動態(tài)代理
Spring的底層實現(xiàn)機制是什么?
使用Demo4j(解析XML)+Java反射機制
Demo4j其實就是解析XML。使用反射機制實例化bean。
SpringAOP用到了什么代理?
JDK動態(tài)代理:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- (2篇)2024大學(xué)生活部年終工作總結(jié)
- 項目組成及主要環(huán)境問題表
- 2024年湖北中醫(yī)藥高等??茖W(xué)校高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 第一章物理基礎(chǔ)知識備課講稿
- 20202021學(xué)年高中物理選修3-1滬科版課件33
- 成比例線段練習(xí)題及答案
- 二零二五年度股權(quán)投資終止協(xié)議
- 2024年浙江旅游職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 2024年泉州紡織服裝職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 二零二五年度房地產(chǎn)租賃簡易合作協(xié)議2篇
- 2025年河南鶴壁市政務(wù)服務(wù)和大數(shù)據(jù)管理局招聘12345市長熱線人員10人高頻重點提升(共500題)附帶答案詳解
- 路面彎沉溫度修正系數(shù)
- 職業(yè)技能鑒定要素細(xì)目表和卷庫編寫要求
- 公司設(shè)備轉(zhuǎn)讓合同協(xié)議書
- 2023年全國統(tǒng)一建筑工程預(yù)算工程量計算規(guī)則完整版
- 教科版四年級科學(xué)下冊第三單元巖石與土壤4.制作巖石和礦物標(biāo)本(教學(xué)設(shè)計)教案
- 大學(xué)《工程力學(xué)》期末考試試題庫含詳細(xì)答案
- 2022年湖北省武漢市中考數(shù)學(xué)試卷含解析
- TLFSA 003-2020 危害分析與關(guān)鍵控制點(HACCP)體系調(diào)味面制品生產(chǎn)企業(yè)要求
- LY/T 2244.3-2014自然保護區(qū)保護成效評估技術(shù)導(dǎo)則第3部分:景觀保護
- 紀(jì)律教育月批評與自我批評五篇
評論
0/150
提交評論