前言
1. 什么是 Java 虛擬機?為什么 Java 被稱作是"平臺無關(guān)的編程語言"榕暇?
Java 虛擬機是一個可以執(zhí)行 Java 字節(jié)碼的虛擬機進程蓬衡。Java 源文件被編譯成能被 Java 虛擬機執(zhí)行的字節(jié)碼文件。
Java 被設(shè)計成允許應(yīng)用程序可以運行在任意的平臺彤枢,而不需要程序員為每一個平臺單獨重寫
或者是重新編譯狰晚。Java 虛擬機讓這個變?yōu)榭赡埽驗樗赖讓佑布脚_的指令長度和其特性缴啡。
2. JDK 和 JRE 的區(qū)別是什么壁晒?
Java 運行時環(huán)境(JRE)是將要執(zhí)行 Java 程序的 Java 虛擬機。它同時也包含了執(zhí)行 applet 需要 的瀏覽器插件业栅。
Java 開發(fā)工具包(JDK)是完整的 Java 軟件開發(fā)包讨衣,包含了 JRE换棚,編譯器和其他的工具(比如:JavaDoc,Java
調(diào)試器)反镇,可以讓開發(fā)者開發(fā)固蚤、編譯、執(zhí)行 Java 應(yīng)用程序歹茶。
3. "static"關(guān)鍵字是什么意思夕玩?Java 中是否可以覆蓋(override)一個 private 或者是
static 的方法?
"static"關(guān)鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實例變量的情況下被訪問惊豺。
Java 中 static 方法不能被覆蓋燎孟,因為方法覆蓋是基于運行時動態(tài)綁定的,而 static 方法是編 譯時靜態(tài)綁定的尸昧。static 方法跟類的任何實例都不相關(guān)揩页,所以概念上不適用。private 也是不支持覆蓋的烹俗,因為私有的成員外界是看不到的所以也就不存在覆蓋的問題爆侣。
4. 是否可以在 static 環(huán)境中訪問非 static 變量?
static 變量在 Java 中是屬于類的幢妄,它在所有的實例中的值是一樣的兔仰。當(dāng)類被 Java 虛擬機載入 的時候, 會對 static 變量進行初始化蕉鸳。如果你的代碼嘗試不用實例來訪問非 static 的變量乎赴,編譯器會報錯,因為這些變量還沒有被創(chuàng)建出來潮尝,還沒有跟任何實例關(guān)聯(lián)上榕吼。
5. Java 支持的數(shù)據(jù)類型有哪些?什么是自動拆裝箱勉失?
Java 語言支持的 8 中基本數(shù)據(jù)類型是:
整型:byte short int long
浮點型:float double 布爾型:boolean
字符型:char
自動裝箱是 Java 編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型之間做的一個轉(zhuǎn)化羹蚣。比如:把 int 轉(zhuǎn)化成 Integer,double 轉(zhuǎn)化成 double戴质,等等。反之就是自動拆箱踢匣。
6. Java 中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思告匠?
重寫方法的規(guī)則:(方法重寫也稱為方法覆蓋)
1、參數(shù)列表必須完全與被重寫的方法相同离唬,否則不能稱其為重寫而是重載后专。
2、返回的類型必須一直與被重寫的方法的返回類型相同输莺,否則不能稱其為重寫而是重載戚哎。
3裸诽、訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)
4、重寫方法一定不能拋出新的檢查異承偷剩或者比被重寫方法申明更加寬泛的檢查型異常丈冬。例如:
父類的一個方法申明了一個檢查異常 IOException,在重寫這個方法是就不能拋出 Exception,只能拋出
IOException 的子類異常甘畅,可以拋出非檢查異常埂蕊。
而重載的規(guī)則:
1、必須具有不同的參數(shù)列表疏唾;
2蓄氧、可以有不責(zé)罵的返回類型,只要參數(shù)列表不同就可以了槐脏;
3喉童、可以有不同的訪問修飾符;
4顿天、可以拋出不同的異常堂氯;
重寫與重載的區(qū)別在于:
重寫多態(tài)性起作用,對調(diào)用被重載過的方法可以大大減少代碼的輸入量露氮,同一個方法名只要往里面?zhèn)鬟f不同的參數(shù)就可以擁有不同的功能或返回值祖灰。
用好重寫和重載可以設(shè)計一個結(jié)構(gòu)清晰而簡潔的類,可以說重寫和重載在編寫代碼過程中的作用非同一般.
7. Java 中畔规,什么是構(gòu)造函數(shù)局扶?什么是構(gòu)造函數(shù)重載?什么是復(fù)制構(gòu)造函數(shù)叁扫?
當(dāng)新對象被創(chuàng)建的時候三妈,構(gòu)造函數(shù)會被調(diào)用。每一個類都有構(gòu)造函數(shù)莫绣。在程序員沒有給類提供構(gòu)造函數(shù)的情況下畴蒲,Java 編譯器會為這個類創(chuàng)建一個默認(rèn)的構(gòu)造函數(shù)。
Java 中構(gòu)造函數(shù)重載和方法重載很相似对室∧T铮可以為一個類創(chuàng)建多個構(gòu)造函數(shù)。每一個構(gòu)造函數(shù) 必須有它自己唯一的參數(shù)列表掩宜。
Java 不支持像 C++中那樣的復(fù)制構(gòu)造函數(shù)蔫骂,這個不同點是因為如果你不自己寫構(gòu)造函數(shù)的情況下,Java 不會創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù)牺汤。
8. Java 支持多繼承么辽旋?支持多實現(xiàn)嗎?
不支持,Java 不支持多繼承补胚。每個類都只能繼承一個類码耐,但是可以實現(xiàn)多個接口。
9. 接口可以繼承接口嗎溶其?如果可以繼承 請列舉一個案例骚腥?
可以,List 繼承 Collection
10. 接口和 抽象類 的區(qū)別是什么握联?
接口和抽象類有什么區(qū)別
你選擇使用接口和抽象類的依據(jù)是什么桦沉?
接口和抽象類的概念不一樣。接口是對動作的抽象金闽,抽象類是對根源的抽象纯露。
抽象類表示的是,這個對象是什么代芜。接口表示的是埠褪,這個對象能做什么。比如挤庇, 蘇格蘭折耳貓 钞速, 布偶貓 ,這兩個類(如果是類的話??)嫡秕,他們的抽象類是貓渴语。說明,他們都是貓昆咽。
貓可以吃東西驾凶,耗子也可以吃東西,你可以把"吃東西"定義成一個接口掷酗,然后讓這些類去實現(xiàn)它.
所以调违,在高級語言上,一個類只能繼承一個類(抽象類)(正如貓不可能同時是生物和非生物)泻轰,但是可以實現(xiàn)多個接口(吃飯接口技肩、走路接口)。
第一點.接口是抽象類的變體浮声,接口中所有的方法都是抽象的虚婿。而抽象類是聲明方法的存在而不去實現(xiàn)它的類。
第二點.接口可以多繼承泳挥,抽象類不行
第三點.接口定義方法然痊,不能實現(xiàn),而抽象類可以實現(xiàn)部分方法羡洁。第四點.接口中基本數(shù)據(jù)類型為 static 而抽類象不是的玷过。
第五點.Java 接口中聲明的變量默認(rèn)都是 final 的爽丹。抽象類可以包含非 final 的變量筑煮。
第六點.Java 接口中的成員函數(shù)默認(rèn)是 public 的辛蚊。抽象類的成員函數(shù)可以是 private,protected 或者是 public真仲。
當(dāng)你關(guān)注一個事物的本質(zhì)的時候袋马,用抽象類;當(dāng)你關(guān)注一個操作的時候秸应,用接口虑凛。
抽象類的功能要遠超過接口,但是软啼,定義抽象類的代價高桑谍。因為高級語言來說(從實際設(shè)計上來說也是) 每個類只能繼承一個類。在這個類中祸挪,你必須繼承或編寫出其所有子類的
所有共性锣披。雖然接口在功能上會弱化許多,但是它只是針對一個動作的描述贿条。而且你可以在一個類中同時
實現(xiàn)多個接口雹仿。在設(shè)計階段會降低難度的。
接口是絕對抽象的整以,不可以被實例化胧辽。抽象類也不可以被實例化
11. 什么是值傳遞和引用傳遞?
對象被值傳遞公黑,意味著傳遞了對象的一個副本邑商。因此,就算是改變了對象副本帆调,也不會影響 源對象的值奠骄。
對象被引用傳遞,意味著傳遞的并不是實際的對象番刊,而是對象的引用含鳞。因此,外部對引用對 象所做的改變會反映到所有的對象上芹务。
(Java 線程)
12. 進程和線程的區(qū)別是什么蝉绷?
進程是執(zhí)行著的應(yīng)用程序,而線程是進程內(nèi)部的一個執(zhí)行序列枣抱。一個進程可以有多個線程熔吗。線程又叫做輕量級進程。
13. 創(chuàng)建線程有幾種不同的方式佳晶?你喜歡哪一種桅狠?為什么?
有三種方式可以用來創(chuàng)建線程: 繼承 Thread 類
實現(xiàn) Runnable 接口
應(yīng)用程序可以使用 Executor 框架來創(chuàng)建線程池
實現(xiàn) Runnable 接口這種方式更受歡迎,因為這不需要繼承 Thread 類中跌。在應(yīng)用設(shè)計中已經(jīng)繼承了別的對象的情況下咨堤,這需要多繼承(而 Java 不支持多繼承),只能實現(xiàn)接口漩符。同時一喘,線程池也是非常高效的, 很容易實現(xiàn)和使用嗜暴。
14. 概括的解釋下線程的幾種可用狀態(tài)凸克。
線程在執(zhí)行過程中,可以處于下面幾種狀態(tài):
就緒(Runnable):線程準(zhǔn)備運行闷沥,不一定立馬就能開始執(zhí)行萎战。運行中(Running):進程正在執(zhí)行線程的代碼。
等待中(Waiting): 線程處于阻塞的狀態(tài)舆逃, 等待外部的處理結(jié)束撞鹉。 睡眠中
(Sleeping):線程被強制睡眠。
I/O 阻塞(Blocked on I/O):等待 I/O 操作完成颖侄。
同步阻塞(Blocked on Synchronization):等待獲取鎖鸟雏。死亡(Dead):線程完成了執(zhí)行。
15. 同步方法和同步代碼塊的區(qū)別是什么览祖?
在 Java 語言中孝鹊,每一個對象有一把鎖。線程可以使用 synchronized 關(guān)鍵字來獲取對象上的鎖展蒂。
synchronized 關(guān)鍵字可應(yīng)用在方法級別(粗粒度鎖)或者是代碼塊級別(細粒度鎖)又活。
16. 在監(jiān)視器(Monitor)內(nèi)部,是如何做線程同步的锰悼?程序應(yīng)該做哪種級別的同步柳骄?
監(jiān)視器和鎖在 Java 虛擬機中是一塊使用的。監(jiān)視器監(jiān)視一塊同步代碼塊箕般,確保一次只有一個線程執(zhí)行同步代碼塊耐薯。每一個監(jiān)視器都和一個對象引用相關(guān)聯(lián)。線程在獲取鎖之前不允許執(zhí)行同步代碼丝里。
17. 什么是死鎖(deadlock)曲初?
兩個進程都在等待對方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時候就發(fā)生了死鎖。結(jié)果就是兩個進程都陷入了無限的等待中杯聚。
18. 如何確保 N 個線程可以訪問 N 個資源同時又不導(dǎo)致死鎖臼婆?
使用多線程的時候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序幌绍,并強制線程
按照指定的順序獲取鎖颁褂。因此故响,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出 現(xiàn)死鎖了颁独。
(Java 集合類)
19. Java 集合類框架的基本接口有哪些被去?
Java 集合類提供了一套設(shè)計良好的支持對一組對象進行操作的接口和類。Java 集合類里面最基本的接口有:
Collection:代表一組對象奖唯,每一個對象都是它的子元素。
Set:不包含重復(fù)元素的 Collection糜值。
List:有順序的 collection丰捷,并且可以包含重復(fù)元素。
Map:可以把鍵(key)映射到值(value)的對象寂汇,鍵不能重復(fù)病往。
20. 為什么集合類沒有實現(xiàn) Cloneable 和 Serializable 接口?
集合類接口指定了一組叫做元素的對象骄瓣。集合類接口的每一種具體的實現(xiàn)類都可以選擇以它自己的方式對元素進行保存和排序停巷。有的集合類允許重復(fù)的鍵,有些不允許榕栏。
21. 什么是迭代器(Iterator)畔勤?
Iterator 接口提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器實例的 迭代方法扒磁。迭代器可以在迭代的過程中刪除底層集合的元素庆揪。
克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現(xiàn)相關(guān)的。因此妨托,應(yīng)該由集合類的具體實現(xiàn)來決定如何被克隆或者是序列化缸榛。
22. Iterator 和 ListIterator 的區(qū)別是什么?
下面列出了他們的區(qū)別:
Iterator 可用來遍歷 Set 和 List 集合兰伤,但是 ListIterator 只能用來遍歷 List内颗。
Iterator 對集合只能是前向遍歷,ListIterator 既可以前向也可以后向敦腔。
ListIterator 實現(xiàn)了 Iterator 接口均澳,并包含其他的功能,比如:增加元素符衔,替換元素负懦,獲取前一個和后一個元素的索引,等等柏腻。
23. 快速失敗(fail-fast)和安全失敗(fail-safe)的區(qū)別是什么纸厉?
Iterator 的安全失敗是基于對底層集合做拷貝,因此五嫂,它不受源集合上修改的影響颗品。java.util 包下面的所有的集合類都是快速失敗的肯尺,而 java.util.concurrent 包下面的所有的類都是安全 失敗的∏啵快速失敗的迭代器會拋出 ConcurrentModificationException 異常则吟,而安全失敗的迭 代
器永遠不會拋出這樣的異常。
24. Java 中的 HashMap 的工作原理是什么锄蹂?
Java 中的 HashMap 是以鍵值對(key-value)的形式存儲元素的氓仲。HashMap 需要一個 hash 函數(shù),它使用 hashCode()和 equals()方法來向集合/從集合添加和檢索元素得糜。當(dāng)調(diào)用 put()方法的時候敬扛,HashMap 會計算 key 的 hash 值,然后把鍵值對存儲在集合中合適的索引上朝抖。如果 key
已經(jīng)存在了啥箭,value 會被更新成新值。HashMap 的一些重要的特性是它的容量(capacity)治宣,負 載因子(load factor)和擴容極限(threshold resizing)急侥。
25. hashCode()和 equals()方法的重要性體現(xiàn)在什么地方?
Java 中的 HashMap 使用 hashCode()和 equals()方法來確定鍵值對的索引侮邀,當(dāng)根據(jù)鍵獲取值的時候也會用到這兩個方法坏怪。如果沒有正確的實現(xiàn)這兩個方法,兩個不同的鍵可能會有相同的
hash 值绊茧,因此陕悬,可能會被集合認(rèn)為是相等的。而且按傅,這兩個方法也用來發(fā)現(xiàn)重復(fù)元素捉超。所以這兩個方法的實現(xiàn)對 HashMap 的精確性和正確性是至關(guān)重要的。
26. HashMap 和 Hashtable 有什么區(qū)別唯绍?
HashMap 和 Hashtable 都實現(xiàn)了 Map 接口拼岳,因此很多特性非常相似。但是况芒,他們有以下不同
點:
HashMap 允許鍵和值是 null惜纸,而 Hashtable 不允許鍵或者值是 null。
Hashtable 是同步的绝骚,而 HashMap 不是耐版。因此,HashMap 更適合于單線程環(huán)境压汪,而 Hashtable
適合于多線程環(huán)境粪牲。
HashMap 提供了可供應(yīng)用迭代的鍵的集合,因此止剖,HashMap 是快速失敗的腺阳。另一方面落君,
Hashtable 提供了對鍵的列舉(Enumeration)。一般認(rèn)為 Hashtable 是一個遺留的類亭引。
27. 數(shù)組(Array)和列表(ArrayList)有什么區(qū)別绎速?什么時候應(yīng)該使用 Array 而不是
ArrayList ?
下面列出了 Array 和 ArrayList 的不同點:
Array 可以包含基本類型和對象類型焙蚓,ArrayList 只能包含對象類型纹冤。
Array 大小是固定的,ArrayList 的大小是動態(tài)變化的购公。
ArrayList 提供了更多的方法和特性萌京,比如:addAll(),removeAll()君丁,iterator()等等。
對于基本類型數(shù)據(jù)将宪,集合使用自動裝箱來減少編碼工作量绘闷。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時候较坛,這種方式相對比較慢印蔗。
28. ArrayList 和 LinkedList 有什么區(qū)別?
ArrayList 和 LinkedList 都實現(xiàn)了 List 接口,他們有以下的不同點:
ArrayList 是基于索引的數(shù)據(jù)接口,它的底層是數(shù)組栓撞。它可以以 O(1)時間復(fù)雜度對元素進行隨機訪問纳鼎。與此對應(yīng),LinkedList 是以元素列表的形式存儲它的數(shù)據(jù)融柬,每一個元素都和它的前 一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復(fù)雜度是 O(n)薛躬。
相對于 ArrayList ,LinkedList 的插入呆细,添加型宝,刪除操作速度更快,因為當(dāng)元素被添加到集合任 意位置的時候絮爷,不需要像數(shù)組那樣重新計算大小或者是更新索引趴酣。
LinkedList 比 ArrayList 更占內(nèi)存,因為 LinkedList 為每一個節(jié)點存儲了兩個引用坑夯,一個指向前一個元素岖寞,一個指向下一個元素。
也可以參考 ArrayList vs. LinkedList 柜蜈。
29. Comparable 和 Comparator 接口是干什么的慎璧?列出它們的區(qū)別床嫌。
Java 提供了只包含一個 compareTo()方法的 Comparable 接口。這個方法可以個給兩個對象排序胸私。具體來說厌处,它返回負數(shù),0岁疼,正數(shù)來表明輸入對象小于阔涉,等于,大于已經(jīng)存在的對象捷绒。
Java 提供了包含 compare()和 equals()兩個方法的 Comparator 接口瑰排。compare()方法用來給兩個輸入?yún)?shù)排序,返回負數(shù)暖侨,0椭住,正數(shù)表明第一個參數(shù)是小于,等于字逗,大于第二個參數(shù)京郑。equals() 方法需要一個對象作為參數(shù),它用來決定輸入?yún)?shù)是否和 comparator 相等葫掉。只有當(dāng)輸入?yún)?shù)也是一個 comparator 并且輸入?yún)?shù)和當(dāng)前 comparator 的排序結(jié)果是相同的時候些举,這個方法才返回 true 。
30. 什么是 Java 優(yōu)先級隊列(Priority Queue)俭厚?
PriorityQueue 是一個基于優(yōu)先級堆的無界隊列户魏,它的元素是按照自然順序(natural order)排序的。在創(chuàng)建的時候挪挤,我們可以給它提供一個負責(zé)給元素排序的比較器叼丑。PriorityQueue 不允許
null 值,因為他們沒有自然順序扛门,或者說他們沒有任何的相關(guān)聯(lián)的比較器幢码。最后,PriorityQueue 不是線程安全的尖飞,入隊和出隊的時間復(fù)雜度是 O(log(n))症副。
31. 你了解大 O 符號(big-O notation)么?你能給出不同數(shù)據(jù)結(jié)構(gòu)的例子么政基?
大 O 符號描述了當(dāng)數(shù)據(jù)結(jié)構(gòu)里面的元素增加的時候贞铣,算法的規(guī)模或者是性能在最壞的場景下有多么好沮明。 大 O 符號也可用來描述其他的行為辕坝,比如:內(nèi)存消耗。因為集合類實際上是數(shù)據(jù)結(jié)構(gòu)荐健,我 們一般使用大 O 符號基于時間酱畅,內(nèi)存和性能來選擇最好的實現(xiàn)琳袄。大 O 符號可
以對大量數(shù)據(jù)的性能給出一個很好的說明。
32. 如何權(quán)衡是使用無序的數(shù)組還是有序的數(shù)組纺酸?
有序數(shù)組最大的好處在于查找的時間復(fù)雜度是 O(log n)窖逗,而無序數(shù)組是 O(n)。有序數(shù)組的缺
點是插入操作的時間復(fù)雜度是 O(n)餐蔬,因為值大的元素需要往后移動來給新元素騰位置碎紊。相反, 無序數(shù)組的插入時間復(fù)雜度是常量 O(1)樊诺。
33. Java 集合類框架的最佳實踐有哪些仗考?
根據(jù)應(yīng)用的需要正確選擇要使用的集合的類型對性能非常重要,比如:假如元素的大小是固定的词爬,而且能事先知道秃嗜,我們就應(yīng)該用 Array 而不是 ArrayList 。有些集合類允許指定初始容量顿膨。因此锅锨,如果我們能估計出存儲的元素的數(shù)目,我們可以設(shè)置
初始容量來避免重新計算 hash 值或者是擴容虽惭。為了類型安全橡类,可讀性和健壯性的原因總是要使用泛型蛇尚。同時芽唇,使用泛型還可以避免運行時的 ClassCastException。
使用 JDK 提供的不變類(immutable class)作為 Map 的鍵可以避免為我們自己的類實現(xiàn)
hashCode()和 equals()方法取劫。編程的時候接口優(yōu)于實現(xiàn)匆笤。
底層的集合實際上是空的情況下,返回長度是 0 的集合或者是數(shù)組谱邪,不要返回 null炮捧。
34. Enumeration 接口和 Iterator 接口的區(qū)別有哪些?
Enumeration 速度是 Iterator 的 2 倍惦银,同時占用更少的內(nèi)存咆课。但是,Iterator 遠遠比 Enumeration 安全扯俱,因為其他線程不能夠修改正在被 iterator 遍歷的集合里面的對象书蚪。同時,Iterator 允許調(diào)用者刪除底層集合里面的元素迅栅,這對 Enumeration 來說是不可能的殊校。
35. HashSet 和 TreeSet 有什么區(qū)別?
HashSet 是由一個 hash 表來實現(xiàn)的读存,因此为流,它的元素是無序的呕屎。add() ,remove()敬察,contains() 方法的時間復(fù)雜度是 O(1)秀睛。
另一方面,TreeSet 是由一個樹形的結(jié)構(gòu)來實現(xiàn)的静汤,它里面的元素是有序的琅催。因此,add()虫给,
remove()藤抡,contains()方法的時間復(fù)雜度是 O(logn)。
垃圾收集器(Garbage Collectors)
36. Java 中垃圾回收有什么目的抹估?什么時候進行垃圾回收缠黍?
垃圾回收的目的是識別并且丟棄應(yīng)用不再使用的對象來釋放和重用資源。
37. System.gc()和 Runtime.gc()會做什么事情药蜻?
這兩個方法用來提示 JVM 要進行垃圾回收瓷式。但是,立即開始還是延遲進行垃圾回收是取決于 JVM 的语泽。
38. finalize()方法什么時候被調(diào)用贸典?析構(gòu)函數(shù)(finalization)的目的是什么?
在釋放對象占用的內(nèi)存之前踱卵,垃圾收集器會調(diào)用對象的 finalize()方法廊驼。一般建議在該方法中釋放對象持有的資源。
39. 如果對象的引用被置為 null惋砂,垃圾收集器是否會立即釋放對象占用的內(nèi)存妒挎?
不會,在下一個垃圾回收周期中西饵,這個對象將是可被回收的酝掩。
40. Java 堆的結(jié)構(gòu)是什么樣子的?什么是堆中的永久代(Perm Gen space)?
JVM 的堆是運行時數(shù)據(jù)區(qū)眷柔,所有類的實例和數(shù)組都是在堆上分配內(nèi)存期虾。它在 JVM 啟動的時候被創(chuàng)建。對象所占的堆內(nèi)存是由自動內(nèi)存管理系統(tǒng)也就是垃圾收集器回收驯嘱。
堆內(nèi)存是由存活和死亡的對象組成的镶苞。存活的對象是應(yīng)用可以訪問的,不會被垃圾回收宙拉。死亡的對象是應(yīng)用不可訪問尚且還沒有被垃圾收集器回收掉的對象宾尚。一直到垃圾收集器把這些對象回收掉之前,他們會一直占據(jù)堆內(nèi)存空間。
41. 串行(serial)收集器和吞吐量(throughput)收集器的區(qū)別是什么煌贴?
吞吐量收集器使用并行版本的新生代垃圾收集器御板,它用于中等規(guī)模和大規(guī)模數(shù)據(jù)的應(yīng)用程
序。而串行收集器對大多數(shù)的小應(yīng)用(在現(xiàn)代處理器上需要大概 100M 左右的內(nèi)存)就足夠了牛郑。
42. 在 Java 中怠肋,對象什么時候可以被垃圾回收?
當(dāng)對象對當(dāng)前使用這個對象的應(yīng)用程序變得不可觸及的時候淹朋,這個對象就可以被回收了笙各。
43. JVM 的永久代中會發(fā)生垃圾回收么?
垃圾回收不會發(fā)生在永久代础芍,如果永久代滿了或者是超過了臨界值杈抢,會觸發(fā)完全垃圾回收 (Full
GC)。如果你仔細查看垃圾收集器的輸出信息仑性,就會發(fā)現(xiàn)永久代也是被回收的惶楼。這就是
為什么正確的永久代大小對避免 Full GC 是非常重要的原因。請參考下 Java8 :從永久代到元數(shù)據(jù)區(qū)
(Java8中已經(jīng)移除了永久代诊杆,新加了一個叫做元數(shù)據(jù)區(qū)的 native 內(nèi)存區(qū))
46. Java 中的兩種異常類型是什么歼捐?他們有什么區(qū)別?
Java 中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常晨汹。不受檢查的異常不需要在方法或者是構(gòu)造函數(shù)上聲明豹储,就算方法或者是構(gòu)造函數(shù)的執(zhí)行可能會拋出這樣的異
常,并且不受檢查的異程哉猓可以傳播到方法或者是構(gòu)造函數(shù)的外面剥扣。相反,受檢查的異常必須 要用 throws
語句在方法或者是構(gòu)造函數(shù)上聲明慨灭。這里有 Java 異常處理的一些小建議朦乏。
47. Java 中 Exception 和 Error 有什么區(qū)別球及?
Exception 和 Error 都是 Throwable 的子類氧骤。Exception 用于用戶程序可以捕獲的異常情況。
Error
定義了不期望被用戶程序捕獲的異常吃引。
48. throw 和 throws 有什么區(qū)別筹陵?
throw 關(guān)鍵字用來在程序中明確的拋出異常,相反镊尺,throws 語句用來表明方法不能處理的異 常朦佩。每一個方法都必須要指定哪些異常不能處理,所以方法的調(diào)用者才能夠確保處理可能發(fā)
生的異常庐氮,多個異常是用逗號分隔的语稠。
49. 異常處理的時候,finally 代碼塊的重要性是什么?
無論是否拋出異常仙畦,finally 代碼塊總是會被執(zhí)行输涕。就算是沒有 catch 語句同時又拋出異常的情況下,finally 代碼塊仍然會被執(zhí)行慨畸。最后要說的是莱坎,finally 代碼塊主要用來釋放資源,比如:I/O 緩沖區(qū)寸士,數(shù)據(jù)庫連接檐什。
50. 異常處理完成以后,Exception 對象會發(fā)生什么變化弱卡?
Exception 對象會在下一個垃圾回收過程中被回收掉乃正。
51. finally 代碼塊和 finalize()方法有什么區(qū)別?
無論是否拋出異常婶博,finally 代碼塊都會執(zhí)行烫葬,它主要是用來釋放應(yīng)用占用的資源。finalize()
方法是 Object 類的一個 protected 方法凡蜻,它是在對象被垃圾回收之前由 Java 虛擬機來調(diào)用的搭综。
Java 小應(yīng)用程序 (Applet)
52. 什么是 Applet?
java applet 是能夠被包含在 HTML 頁面中并且能被啟用了 java 的客戶端瀏覽器執(zhí)行的程序划栓。
Applet 主要用來創(chuàng)建動態(tài)交互的 web 應(yīng)用程序兑巾。
53. 解釋一下 Applet 的生命周期
applet 可以經(jīng)歷下面的狀態(tài):
Init:每次被載入的時候都會被初始化。
Start:開始執(zhí)行 applet忠荞。
Stop:結(jié)束執(zhí)行 applet蒋歌。
Destroy:卸載 applet 之前,做最后的清理工作委煤。
54. 當(dāng) applet 被載入的時候會發(fā)生什么堂油?
首先,創(chuàng)建 applet 控制類的實例碧绞,然后初始化 applet府框,最后開始運行。
55. Applet 和普通的 Java 應(yīng)用程序有什么區(qū)別讥邻?
applet 是運行在啟用了 java 的瀏覽器中迫靖,Java 應(yīng)用程序是可以在瀏覽器之外運行的獨立的
Java 程序。但是兴使,它們都需要有 Java 虛擬機系宜。
進一步來說,Java 應(yīng)用程序需要一個有特定方法簽名的 main 函數(shù)來開始執(zhí)行发魄。Java applet 不需要這樣的函數(shù)來開始執(zhí)行盹牧。
最后,Java applet 一般會使用很嚴(yán)格的安全策略,Java 應(yīng)用一般使用比較寬松的安全策略汰寓。
56. Java applet 有哪些限制條件吆寨?
主要是由于安全的原因,給 applet 施加了以下的限制:
applet 不能夠載入類庫或者定義本地方法踩寇。 applet 不能在宿主機上讀寫文件啄清。
applet 不能讀取特定的系統(tǒng)屬性。
applet 不能發(fā)起網(wǎng)絡(luò)連接俺孙,除非是跟宿主機辣卒。
applet 不能夠開啟宿主機上其他任何的程序。
57. 什么是不受信任的 applet睛榄?
不受信任的 applet 是不能訪問或是執(zhí)行本地系統(tǒng)文件的 Java applet荣茫,默認(rèn)情況下,所有下載的 applet 都是不受信任的场靴。
58. 從網(wǎng)絡(luò)上加載的 applet 和從本地文件系統(tǒng)加載的 applet 有什么區(qū)別啡莉?
當(dāng) applet 是從網(wǎng)絡(luò)上加載的時候,applet 是由 applet 類加載器載入的旨剥,它受 applet 安全管 理器的限制咧欣。當(dāng) applet 是從客戶端的本地磁盤載入的時候,applet 是由文件系統(tǒng)加載器載入的轨帜。
從文件系統(tǒng)載入的 applet 允許在客戶端讀文件魄咕,寫文件,加載類庫蚌父,并且也允許執(zhí)行其他程序哮兰,但是,卻通不過字節(jié)碼校驗苟弛。
59. applet 類加載器是什么喝滞?它會做哪些工作?
當(dāng) applet 是從網(wǎng)絡(luò)上加載的時候膏秫,它是由 applet 類加載器載入的右遭。類加載器有自己的 java
名稱空間等級結(jié)構(gòu)。類加載器會保證來自文件系統(tǒng)的類有唯一的名稱空間荔睹,來自網(wǎng)絡(luò)資源的 類有唯一的名稱空間狸演。
當(dāng)瀏覽器通過網(wǎng)絡(luò)載入 applet 的時候言蛇,applet 的類被放置于和 applet 的源相關(guān)聯(lián)的私有的名 稱空間中僻他。然后,那些被類加載器載入進來的類都是通過了驗證器驗證的腊尚。驗證器會檢查類 文件格式是否遵守
Java 語言規(guī)范吨拗,確保不會出現(xiàn)堆棧溢出(stack overflow) 或者下溢(underflow),傳遞給字節(jié)碼指令的參數(shù)是正確的。
60. applet 安全管理器是什么劝篷?它會做哪些工作哨鸭?
applet 安全管理器是給 applet 施加限制條件的一種機制。瀏覽器可以只有一個安全管理器娇妓。安全管理器在啟動的時候被創(chuàng)建像鸡,之后不能被替換覆蓋或者是擴展。
Swing
61. 彈出式選擇菜單(Choice)和列表(List)有什么區(qū)別
Choice 是以一種緊湊的形式展示的哈恰,需要下拉才能看到所有的選項只估。Choice 中一次只能選中一個選項。List 同時可以有多個元素可見着绷,支持選中一個或者多個元素蛔钙。
62. 什么是布局管理器?
布局管理器用來在容器中組織組件荠医。
63. 滾動條(Scrollbar)和滾動面板(JScrollPane)有什么區(qū)別吁脱?
Scrollbar 是一個組件,不是容器彬向。而 ScrollPane 是容器兼贡。ScrollPane 自己處理滾動事件。
64. 哪些 Swing 的方法是線程安全的娃胆?
只有 3 個線程安全的方法: repaint(), revalidate(), and invalidate()紧显。
65. 說出三種支持重繪(painting)的組件。
Canvas, Frame, Panel,和 Applet 支持重繪缕棵。
66. 什么是裁剪(clipping)孵班?
限制在一個給定的區(qū)域或者形狀的繪圖操作就做裁剪。
67. MenuItem 和 CheckboxMenuItem 的區(qū)別是什么招驴?
CheckboxMenuItem 類繼承自 MenuItem 類篙程,支持菜單選項可以選中或者不選中。
68. 邊緣布局(BorderLayout)里面的元素是如何布局的别厘?
BorderLayout 里面的元素是按照容器的東西南北中進行布局的虱饿。
69. 網(wǎng)格包布局(GridBagLayout)里面的元素是如何布局的?
GridBagLayout 里面的元素是按照網(wǎng)格進行布局的触趴。不同大小的元素可能會占據(jù)網(wǎng)格的多于 1 行或一列氮发。因此,行數(shù)和列數(shù)可以有不同的大小冗懦。
70. Window 和 Frame 有什么區(qū)別爽冕?
Frame 類繼承了 Window 類,它定義了一個可以有菜單欄的主應(yīng)用窗口披蕉。
71. 裁剪(clipping)和重繪(repainting)有什么聯(lián)系颈畸?
當(dāng)窗口被 AWT 重繪線程進行重繪的時候乌奇,它會把裁剪區(qū)域設(shè)置成需要重繪的窗口的區(qū)域。
72. 事件監(jiān)聽器接口(event-listener interface)和事件適配器(event-adapter)有什么關(guān)系眯娱?
事件監(jiān)聽器接口定義了對特定的事件礁苗,事件處理器必須要實現(xiàn)的方法。事件適配器給事件監(jiān)聽器接口提供了默認(rèn)的實現(xiàn)徙缴。
73. GUI 組件如何來處理它自己的事件试伙?
GUI 組件可以處理它自己的事件,只要它實現(xiàn)相對應(yīng)的事件監(jiān)聽器接口于样,并且把自己作為事件監(jiān)聽器迁霎。
74. Java 的布局管理器比傳統(tǒng)的窗口系統(tǒng)有哪些優(yōu)勢?
Java 使用布局管理器以一種一致的方式在所有的窗口平臺上擺放組件百宇。因為布局管理器不會和組件的絕對大小和位置相綁定考廉,所以他們能夠適應(yīng)跨窗口系統(tǒng)的特定平臺的不同。
75. Java 的 Swing 組件使用了哪種設(shè)計模式携御?
Java 中的 Swing 組件使用了 MVC(視圖-模型-控制器)設(shè)計模式昌粤。
JDBC
76. 什么是 JDBC?
JDBC 是允許用戶在不同數(shù)據(jù)庫之間做選擇的一個抽象層啄刹。JDBC 允許開發(fā)者用 JAVA 寫數(shù)據(jù)庫應(yīng)用程序涮坐,而不需要關(guān)心底層特定數(shù)據(jù)庫的細節(jié)。
77. 解釋下驅(qū)動(Driver)在 JDBC 中的角色誓军。
JDBC 驅(qū)動提供了特定廠商對 JDBC API 接口類的實現(xiàn)袱讹,驅(qū)動必須要提供 java.sql 包下面這些類的實現(xiàn):Connection, Statement, PreparedStatement,CallableStatement, ResultSet 和 Driver。
78. Class.forName()方法有什么作用昵时?
這個方法用來載入跟數(shù)據(jù)庫建立連接的驅(qū)動捷雕。
79. PreparedStatement 比 Statement 有什么優(yōu)勢?
PreparedStatements 是預(yù)編譯的 壹甥, 因此 救巷, 性能會更好。同時 句柠, 不同的查詢參數(shù)值 浦译,
PreparedStatement 可以重用。
80. 什么時候使用 CallableStatement溯职?用來準(zhǔn)備 CallableStatement 的方法是什么精盅?
CallableStatement 用來執(zhí)行存儲過程。存儲過程是由數(shù)據(jù)庫存儲和提供的谜酒。存儲過程可以接受輸入?yún)?shù)叹俏,也可以有返回結(jié)果。非常鼓勵使用存儲過程甚带,因為它提供了安全性和模塊化她肯。準(zhǔn) 備 一 個 CallableStatement 的 方 法 是 :
CallableStament.prepareCall();
81. 數(shù)據(jù)庫連接池是什么意思佳头?
像打開關(guān)閉數(shù)據(jù)庫連接這種和數(shù)據(jù)庫的交互可能是很費時的鹰贵,尤其是當(dāng)客戶端數(shù)量增加的時候晴氨,會消耗大量的資源,成本是非常高的碉输∽亚埃可以在應(yīng)用服務(wù)器啟動的時候建立很多個數(shù)據(jù)庫
連接并維護在一個池中。連接請求由池中的連接提供敷钾。在連接使用完畢以后枝哄,把連接歸還到 池中,以用于滿足將來更多的請求阻荒。
遠程方法調(diào)用(RMI)
82. 什么是 RMI挠锥?
Java 遠程方法調(diào)用(JavaRMI)是 Java API 對遠程過程調(diào)用(RPC)提供的面向?qū)ο蟮牡葍r形式, 支持直接傳輸序列化的Java 對象和分布式垃圾回收侨赡。遠程方法調(diào)用可以看做是激活遠程正
在運行的對象上的方法的步驟蓖租。RMI 對調(diào)用者是位置透明的,因為調(diào)用者感覺方法是執(zhí)行在本地運行的對象上的羊壹”突拢看下 RMI 的一些注意事項。
83. RMI 體系結(jié)構(gòu)的基本原則是什么油猫?
RMI 體系結(jié)構(gòu)是基于一個非常重要的行為定義和行為實現(xiàn)相分離的原則稠茂。RMI 允許定義行為的代碼和實現(xiàn)行為的代碼相分離,并且運行在不同的JVM 上情妖。
84. RMI 體系結(jié)構(gòu)分哪幾層睬关?
RMI 體系結(jié)構(gòu)分以下幾層:
存根和骨架層(Stub and Skeleton layer):這一層對程序員是透明的,它主要負責(zé)攔截客戶端
發(fā)出的方法調(diào)用請求毡证,然后把請求重定向給遠程的RMI 服務(wù)共螺。
遠程引用層(Remote Reference Layer):RMI 體系結(jié)構(gòu)的第二層用來解析客戶端對服務(wù)端遠程對象的引用。這一層解析并管理客戶端對服務(wù)端遠程對象的引用情竹。連接是點到點的藐不。
傳輸層(Transport layer):這一層負責(zé)連接參與服務(wù)的兩個 JVM 。這一層是建立在網(wǎng)絡(luò)上機器間的 TCP/IP 連接之上的秦效。它提供了基本的連接服務(wù)雏蛮,還有一些防火墻穿透策略。
85. RMI 中的遠程接口(Remote Interface)扮演了什么樣的角色阱州?
遠程接口用來標(biāo)識哪些方法是可以被非本地虛擬機調(diào)用的接口挑秉。遠程對象必須要直接或者是間接實現(xiàn)遠程接口。實現(xiàn)了遠程接口的類應(yīng)該聲明被實現(xiàn)的遠程接口苔货,給每一個遠程對象定義構(gòu)造函數(shù)犀概,給所有遠程接口的方法提供實現(xiàn)立哑。
86. java.rmi.Naming 類扮演了什么樣的角色?
java.rmi.Naming 類用來存儲和獲取在遠程對象注冊表里面的遠程對象的引用姻灶。Naming 類的
每一個方法接收一個 URL 格式的 String 對象作為它的參數(shù)铛绰。
87. RMI 的綁定(Binding)是什么意思?
綁定是為了查詢找遠程對象而給遠程對象關(guān)聯(lián)或者是注冊以后會用到的名稱的過程产喉。遠程對象可以使用
Naming 類的bind()或者 rebind()方法跟名稱相關(guān)聯(lián)捂掰。
88. Naming 類的 bind()和 rebind()方法有什么區(qū)別?
bind()方法負責(zé)把指定名稱綁定給遠程對象曾沈,rebind()方法負責(zé)把指定名稱重新綁定到一個新的遠程對象这嚣。如果那個名稱已經(jīng)綁定過了,先前的綁定會被替換掉塞俱。
89. 讓 RMI 程序能正確運行有哪些步驟姐帚?
為了讓 RMI 程序能正確運行必須要包含以下幾個步驟: 編譯所有的源文件。使用 rmic 生成 stub障涯。
啟動 rmiregistry罐旗。
啟動RMI 服務(wù)器。運行客戶端程序像樊。
90. RMI 的 stub 扮演了什么樣的角色尤莺?
遠程對象的 stub 扮演了遠程對象的代表或者代理的角色。調(diào)用者在本地 stub 上調(diào)用方法生棍,它負責(zé)在遠程對象上執(zhí)行方法颤霎。當(dāng) stub 的方法被調(diào)用的時候,會經(jīng)歷以下幾個步驟:初始化到包含了遠程對象的 JVM 的連接涂滴。
序列化參數(shù)到遠程的JVM 友酱。等待方法調(diào)用和執(zhí)行的結(jié)果。
反序列化返回的值或者是方法沒有執(zhí)行成功情況下的異常柔纵。把值返回給調(diào)用者缔杉。
91. 什么是分布式垃圾回收(DGC)?它是如何工作的搁料?
DGC 叫做分布式垃圾回收或详。RMI 使用 DGC 來做自動垃圾回收。因為RMI 包含了跨虛擬機的
遠程對象的引用郭计,垃圾回收是很困難的霸琴。DGC 使用引用計數(shù)算法來給遠程對象提供自動內(nèi)存管理。
92. RMI 中使用 RMI 安全管理器(RMISecurityManager)的目的是什么昭伸?
RMISecurityManager 使用下載好的代碼提供可被 RMI 應(yīng)用程序使用的安全管理器梧乘。如果沒有設(shè)置安全管理器,RMI 的類加載器就不會從遠程下載任何的類庐杨。
93. 解釋下 Marshalling 和 demarshalling 选调。
當(dāng)應(yīng)用程序希望把內(nèi)存對象跨網(wǎng)絡(luò)傳遞到另一臺主機或者是持久化到存儲的時候夹供,就必須要把對象在內(nèi)存里面的表示轉(zhuǎn)化成合適的格式。這個過程就叫做 Marshalling 仁堪,反之就是 demarshalling 哮洽。
94. 解釋下 Serialization 和 Deserialization。
Java 提供了一種叫做對象序列化的機制枝笨,他把對象表示成一連串的字節(jié)袁铐,里面包含了對象的數(shù)據(jù)揭蜒,對象的類型信息横浑,對象內(nèi)部的數(shù)據(jù)的類型信息等等。因此屉更,序列化可以看成是為了把對象存儲在磁盤上或者是從磁盤上讀出來并重建對象而把對象扁平化的一種方式徙融。反序列化是把對象從扁平狀態(tài)轉(zhuǎn)化成活動對象的相反的步驟。
Servlet
95. 什么是 Servlet瑰谜?
Servlet 是用來處理客戶端請求并產(chǎn)生動態(tài)網(wǎng)頁內(nèi)容的Java 類欺冀。Servlet 主要是用來處理或者是存儲HTML
表單提交的數(shù)據(jù),產(chǎn)生動態(tài)內(nèi)容萨脑,在無狀態(tài)的 HTTP 協(xié)議下管理狀態(tài)信息隐轩。
96. 說一下 Servlet 的體系結(jié)構(gòu)。
所有的 Servlet 都必須要實現(xiàn)的核心的接口是 javax.servlet.Servlet 渤早。每一個 Servlet 都必須要直接或者是間接實現(xiàn)這個接口职车,或者是繼承 javax.servlet.GenericServlet 或者 javax.servlet.http.HTTPServlet 。最后鹊杖,Servlet 使用多線程可以并行的為多個請求服務(wù)悴灵。
97. Applet 和 Servlet 有什么區(qū)別?
Applet 是運行在客戶端主機的瀏覽器上的客戶端 Java 程序骂蓖。而 Servlet 是運行在 web 服務(wù)器上的服務(wù)端的組件积瞒。applet 可以使用用戶界面類,而 Servlet 沒有用戶界面登下,相反茫孔,Servlet 是等待客戶端的 HTTP 請求, 然后為請求產(chǎn)生響應(yīng)被芳。
98. GenericServlet 和 HttpServlet 有什么區(qū)別缰贝?
GenericServlet 是一個通用的協(xié)議無關(guān)的 Servlet, 它實現(xiàn)了 Servlet 和 ServletConfig 接口筐钟。繼承自
GenericServlet 的 Servlet 應(yīng)該要覆蓋 service()方法揩瞪。最后,為了開發(fā)一個能用在網(wǎng)頁上
服務(wù)于使用 HTTP 協(xié)議請求的 Servlet篓冲,你的 Servlet 必須要繼承自HttpServlet 李破。這里有 Servlet 的例子宠哄。
99. 解釋下 Servlet 的生命周期。
對每一個客戶端的請求嗤攻,Servlet 引擎載入 Servlet芭毙,調(diào)用它的 init()方法,完成 Servlet 的初始化喇喉。然后虑乖,
Servlet 對象通過為每一個請求單獨調(diào)用 service()方法來處理所有隨后來自客戶端的請求,最后闯团,調(diào)用
Servlet(譯者注:這里應(yīng)該是Servlet 而不是 server)的 destroy()方法把 Servlet 刪除掉辛臊。
100. doGet()方法和 doPost()方法有什么區(qū)別?
doGet:GET 方法會把名值對追加在請求的 URL 后面房交。因為 URL 對字符數(shù)目有限制彻舰,進而限制了用在客戶端請求的參數(shù)值的數(shù)目。并且請求中的參數(shù)值是可見的候味,因此刃唤,敏感信息不能用這種方式傳遞。
doPOST:POST 方法通過把請求參數(shù)值放在請求體中來克服 GET 方法的限制白群,因此尚胞,可以發(fā)送的參數(shù)的數(shù)目是沒有限制的。最后帜慢,通過POST 請求傳遞的敏感信息對外部客戶端是不可見的笼裳。
101. 什么是 Web 應(yīng)用程序?
Web 應(yīng)用程序是對 Web 或者是應(yīng)用服務(wù)器的動態(tài)擴展崖堤。有兩種類型的 Web 應(yīng)用:面向表現(xiàn)的和面向服務(wù)的侍咱。面向表現(xiàn)的 Web 應(yīng)用程序會產(chǎn)生包含了很多種標(biāo)記語言和動態(tài)內(nèi)容的交互的 web 頁面作為對請求的響應(yīng)。而面向服務(wù)的 Web 應(yīng)用實現(xiàn)了 Web 服務(wù)的端點(endpoint)密幔。一般來說楔脯,一個 Web 應(yīng)用可以看成是一組安裝在服務(wù)器 URL 名稱空間的特定子集下面的Servlet 的集合。
102. 什么是服務(wù)端包含(Server Side Include)胯甩?
服務(wù)端包含(SSI)是一種簡單的解釋型服務(wù)端腳本語言昧廷,大多數(shù)時候僅用在 Web 上,用 servlet 標(biāo)簽嵌入進來偎箫。SSI 最常用的場景把一個或多個文件包含到 Web 服務(wù)器的一個 Web 頁面中木柬。當(dāng)瀏覽器訪問 Web 頁面的時候,Web 服務(wù)器會用對應(yīng)的 servlet 產(chǎn)生的文本來替換 Web 頁面中的 servlet 標(biāo)簽淹办。
103. 什么是 Servlet 鏈(Servlet Chaining)眉枕?
Servlet 鏈?zhǔn)前岩粋€ Servlet 的輸出發(fā)送給另一個 Servlet 的方法。第二個 Servlet 的輸出可以發(fā)送給第三個 Servlet,依次類推速挑。鏈條上最后一個 Servlet 負責(zé)把響應(yīng)發(fā)送給客戶端谤牡。
104. 如何知道是哪一個客戶端的機器正在請求你的 Servlet?
ServletRequest 類可以找出客戶端機器的 IP 地址或者是主機名姥宝。getRemoteAddr()方法獲取客戶端主機的 IP
地址翅萤,getRemoteHost()可以獲取主機名±奥看下這里的例子套么。
105. HTTP 響應(yīng)的結(jié)構(gòu)是怎么樣的?
HTTP 響應(yīng)由三個部分組成:
狀態(tài)碼(Status Code):描述了響應(yīng)的狀態(tài)碳蛋∨呙冢可以用來檢查是否成功的完成了請求。請求失敗的情況下疮蹦,狀態(tài)碼可用來找出失敗的原因诸迟。 如果 Servlet 沒有返回狀態(tài)碼茸炒, 默認(rèn)會返回成功的狀態(tài)碼
HttpServletResponse.SC_OK愕乎。
HTTP 頭部(HTTP Header):它們包含了更多關(guān)于響應(yīng)的信息。比如:頭部可以指定認(rèn)為響應(yīng)過期的過期日期壁公,或者是指定用來給用戶安全的傳輸實體內(nèi)容的編碼格式感论。如何在 Serlet 中檢索HTTP 的頭部看這里。
主體(Body):它包含了響應(yīng)的內(nèi)容紊册。它可以包含HTML 代碼比肄,圖片,等等囊陡。主體是由傳輸在
HTTP 消息中緊跟在頭部后面的數(shù)據(jù)字節(jié)組成的芳绩。
106. 什么是 cookie ?session 和 cookie 有什么區(qū)別撞反?
cookie 是 Web 服務(wù)器發(fā)送給瀏覽器的一塊信息妥色。瀏覽器會在本地文件中給每一個 Web 服務(wù)器存儲 cookie。以后瀏覽器在給特定的 Web 服務(wù)器發(fā)請求的時候遏片,同時會發(fā)送所有為該服務(wù)器存儲的 cookie嘹害。下面列出了 session 和 cookie 的區(qū)別: 無論客戶端瀏覽器做怎么樣的設(shè)置,session 都應(yīng)該能正常工作吮便”恃剑客戶端可以選擇禁用 cookie,但是髓需,session 仍然是能夠工作的许师,因為客戶端無法禁用服務(wù)端的 session。在存儲的數(shù)據(jù)量方面session 和cookies 也是不一樣的。session 能夠存儲任意的Java 對象微渠,cookie 只能存儲String 類型的對象惨驶。
107. 瀏覽器和 Servlet 通信使用的是什么協(xié)議?
瀏覽器和 Servlet 通信使用的是HTTP 協(xié)議敛助。
108. 什么是 HTTP 隧道粗卜?
HTTP 隧道是一種利用HTTP 或者是HTTPS 把多種網(wǎng)絡(luò)協(xié)議封裝起來進行通信的技術(shù)。因此纳击,HTTP 協(xié)議扮演了一個打通用于通信的網(wǎng)絡(luò)協(xié)議的管道的包裝器的角色续扔。把其他協(xié)議的請求掩蓋成 HTTP 的請求就是 HTTP 隧道。
109. sendRedirect()和 forward()方法有什么區(qū)別焕数?
sendRedirect()方法會創(chuàng)建一個新的請求纱昧,而 forward()方法只是把請求轉(zhuǎn)發(fā)到一個新的目標(biāo)上。重定向(redirect) 以后堡赔,之前請求作用域范圍以內(nèi)的對象就失效了识脆,因為會產(chǎn)生一個新的請求,而轉(zhuǎn)發(fā)(forwarding)以后善已,之前請求作用域范圍以內(nèi)的對象還是能訪問的灼捂。一般認(rèn)為 sendRedirect()比 forward()要慢。
110. 什么是 URL 編碼和 URL 解碼换团?
URL 編碼是負責(zé)把URL 里面的空格和其他的特殊字符替換成對應(yīng)的十六進制表示悉稠,反之就是解碼。
JSP
111. 什么是 JSP 頁面艘包?
JSP 頁面是一種包含了靜態(tài)數(shù)據(jù)和 JSP 元素兩種類型的文本的文本文檔的猛。靜態(tài)數(shù)據(jù)可以用任何基于文本的格式來表示,比如:HTML 或者 XML 想虎。JSP 是一種混合了靜態(tài)內(nèi)容和動態(tài)產(chǎn)生的內(nèi)容的技術(shù)卦尊。這里看下JSP 的例子。
112. JSP 請求是如何被處理的 舌厨?
瀏覽器首先要請求一個以.jsp 擴展名結(jié)尾的頁面岂却,發(fā)起JSP 請求,然后邓线,Web 服務(wù)器讀取這個請求淌友,使用
JSP 編譯器把 JSP 頁面轉(zhuǎn)化成一個 Servlet 類。需要注意的是骇陈,只有當(dāng)?shù)谝淮握埱箜撁婊蛘呤?JSP 文件發(fā)
生改變的時候JSP 文件才會被編譯震庭,然后服務(wù)器調(diào)用 servlet 類,處理瀏覽器的請求你雌。一旦請求執(zhí)行結(jié)束器联,
servlet 會把響應(yīng)發(fā)送給客戶端二汛。這里看下如何在JSP 中獲取請求參數(shù)。
113. JSP 有什么優(yōu)點拨拓?
下面列出了使用JSP 的優(yōu)點:
JSP 頁面是被動態(tài)編譯成Servlet 的肴颊,因此,開發(fā)者可以很容易的更新展現(xiàn)代碼渣磷。
JSP 頁面可以被預(yù)編譯婿着。
JSP 頁面可以很容易的和靜態(tài)模板結(jié)合,包括:HTML 或者 XML醋界,也可以很容易的和產(chǎn)生動態(tài)內(nèi)容的代碼結(jié)合起來竟宋。開發(fā)者可以提供讓頁面設(shè)計者以類 XML 格式來訪問的自定義的 JSP 標(biāo)簽庫。開發(fā)者可以在組件層做邏輯上的改變形纺,而不需要編輯單獨使用了應(yīng)用層邏輯的頁面丘侠。
114. 什么是 JSP 指令(Directive)?JSP 中有哪些不同類型的指令逐样?
Directive 是當(dāng) JSP 頁面被編譯成 Servlet 的時候蜗字,JSP 引擎要處理的指令。Directive 用來設(shè)置頁面級別的 指 令 脂新, 從 外 部 文 件 插 入 數(shù) 據(jù) 挪捕, 指 定 自 定 義 的 標(biāo) 簽 庫 。 Directive 是 定 義 在 <%@ 和%>之間的戏羽。下面列出了不同類型的 Directive:
包含指令(Include directive):用來包含文件和合并文件內(nèi)容到當(dāng)前的頁面担神。
頁面指令(Page directive):用來定義JSP 頁面中特定的屬性,比如錯誤頁面和緩沖區(qū)始花。
Taglib 指令:用來聲明頁面中使用的自定義的標(biāo)簽庫。
115. 什么是 JSP 動作(JSP action)孩锡?
JSP 動作以XML 語法的結(jié)構(gòu)來控制 Servlet 引擎的行為酷宵。當(dāng)JSP 頁面被請求的時候,JSP 動作
會被執(zhí)行躬窜。它們可以被動態(tài)的插入到文件中浇垦,重用JavaBean 組件,轉(zhuǎn)發(fā)用戶到其他的頁面荣挨,或者是給Java
插件產(chǎn)生HTML 代碼男韧。下面列出了可用的動作:jsp:include-當(dāng) JSP 頁面被請求的時候包含一個文件。
jsp:useBean-找出或者是初始化Javabean 默垄。jsp:setProperty-設(shè)置 JavaBean 的屬性此虑。jsp:getProperty-獲取 JavaBean 的屬性。jsp:forward-把請求轉(zhuǎn)發(fā)到新的頁面口锭。jsp:plugin-產(chǎn)生特定瀏覽器的代碼朦前。
116. 什么是 Scriptlets 介杆?
JSP 技術(shù)中,scriptlet 是嵌入在JSP 頁面中的一段Java 代碼韭寸。scriptlet 是位于標(biāo)簽內(nèi)部的所有的東西春哨,在標(biāo)簽與標(biāo)簽之間,用戶可以添加任意有效的 scriplet 恩伺。
117. 聲明(Decalaration)在哪里赴背?
聲明跟Java 中的變量聲明很相似,它用來聲明隨后要被表達式或者 scriptlet 使用的變量晶渠。添加的聲明必須要用開始和結(jié)束標(biāo)簽包起來癞尚。
118. 什么是表達式(Expression)?
JSP 表達式是 Web 服務(wù)器把腳本語言表達式的值轉(zhuǎn)化成一個 String 對象乱陡,插入到返回給客戶端的數(shù)據(jù)流中浇揩。表達式是在<%=和%>這兩個標(biāo)簽之間定義的。
119. 隱含對象是什么意思憨颠?有哪些隱含對象胳徽?
JSP 隱含對象是頁面中的一些Java 對象,JSP 容器讓這些Java 對象可以為開發(fā)者所使用爽彤。開發(fā)者不用明確的聲明就可以直接使用他們养盗。JSP 隱含對象也叫做預(yù)定義變量。下面列出了JSP 頁面中的隱含對象:
好了适篙,今天的題型分享到這就結(jié)束了往核,大致的面試資料都已經(jīng)整理成文檔了,有需要的朋友嚷节,可以在文章底部評論然后留言私信:資料就可以獲取了
分享結(jié)束:明天再會D羧濉!硫痰!