Java最全面試題庫(kù)_第1頁
Java最全面試題庫(kù)_第2頁
Java最全面試題庫(kù)_第3頁
Java最全面試題庫(kù)_第4頁
Java最全面試題庫(kù)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

目錄\l"1"ObjectOrientedProgramming(OOP)\l"2"GeneralQuestionsaboutJava\l"3"JavaThreads\l"4"JavaCollections\l"5"GarbageCollectors\l"6"ExceptionHandling\l"7"JavaApplets\l"8"Swing\l"9"JDBC\l"10"RemoteMethodInvocation(RMI)\l"11"Servlets\l"12"JSP面向?qū)ο缶幊?OOP)Java是支持并發(fā),基于類的以及面向?qū)ο蟮囊环N計(jì)算機(jī)編程語言.以下列舉了面向?qū)ο缶幊痰膬?yōu)勢(shì):模塊化編程,使維護(hù)和修改更加容易代碼重用提高代碼的可靠性以及靈活性提高代碼可讀性面向?qū)ο缶幊逃衅浞浅C黠@的特性,比如說封裝,繼承,多態(tài)和抽象.下面我們來分析一下每種特性.封裝(Encapsulation)封裝,提供的對(duì)象隱藏內(nèi)部特性和行為的一種能力,每個(gè)對(duì)象提供了一些方法,其他的對(duì)象可以訪問并改變其內(nèi)部數(shù)據(jù)。在Java中,提供了三種訪問修飾符:公有的,私有的以及保護(hù)的。每個(gè)修飾符都設(shè)定了不同的訪問權(quán)限,這個(gè)權(quán)限設(shè)置不會(huì)因?yàn)榘牟煌胁町悺O旅媸鞘褂梅庋b的一些優(yōu)點(diǎn):通過隱藏屬性來保護(hù)對(duì)象的內(nèi)部信息因?yàn)榭梢元?dú)立的修改或者擴(kuò)展對(duì)象的行為,從而提高代碼的可用性以及維護(hù)性隔離,通過阻止對(duì)象使用不希望的互動(dòng)方式來交互,以此來提高模塊化程度。你可以通過鏈接訪問我們的教程查看關(guān)于封裝更多的細(xì)節(jié)和實(shí)例.多態(tài)(Polymorphism)多態(tài)就是針對(duì)不同的基礎(chǔ)數(shù)據(jù)類型呈現(xiàn)相同接口的一種能力,多態(tài)類型就是其操作可以適用于不同類型值的一種類型。繼承(Inheritance)繼承提供了一個(gè)對(duì)象從基類獲取字段和方法的一種能力.繼承提供了代碼的重用性,并且在不更改現(xiàn)有類的情況下,對(duì)現(xiàn)有類增加額外的功能。抽象(Abstraction)抽象是從具體的實(shí)例中分離想法的過程,根據(jù)他們各自的功能而非具體的實(shí)現(xiàn)來開發(fā)類.Java中支持創(chuàng)建和存在暴露接口的抽象類,而沒有包括方法的具體實(shí)現(xiàn)。抽象方法的宗旨就是將類的行為和具體實(shí)現(xiàn)分離開。抽象和封裝的異同抽象和封裝是個(gè)互補(bǔ)的概念。一方面,抽象專注在對(duì)象的行為上,而另外一方面,封裝專注于對(duì)象的行為的具體實(shí)現(xiàn)。封裝是通過隱藏對(duì)象的內(nèi)部信息來實(shí)現(xiàn)的,因此也可以被看做是抽象的一種策略。有關(guān)Java的一般問題1.什么是JVM?

為什么稱Java為跨平臺(tái)的編程語言?Java虛擬機(jī)(JavaVirtualMachine)是可以執(zhí)行Java字節(jié)碼的虛擬機(jī),每個(gè)Java源文件將被編譯成字節(jié)碼文件,然后在JVM中執(zhí)行。Java之所以被設(shè)計(jì)成可以在任意的平臺(tái)運(yùn)行,而不需要重寫或者在不同的平臺(tái)下重新編譯,這些都要?dú)w功于Java虛擬機(jī)(JVM),因?yàn)镴VM非常了解特定的指令的長(zhǎng)度以及底層硬件平臺(tái)的特殊性。2.JDK和JRE之間的差異是什么?Java運(yùn)行環(huán)境(JavaRuntimeEnviroment)是運(yùn)行Java程序的基本的Java虛擬機(jī),包括執(zhí)行applet的瀏覽器插件。JDK(JavaDevelopmentKit)是為了開發(fā),編譯和執(zhí)行Java應(yīng)用程序,針對(duì)Java的全功能的軟件開發(fā)包,包含了JRE,編譯器和工具(比如說JavaDoc

和JavaDebugger)。3.“static”關(guān)鍵字是什么意思?在Java里可以overrideprivate或static的方法嗎?keywordmean?CanyouoverrideprivateorstaticmethodinJava?static關(guān)鍵字表示,訪問這個(gè)成員變量或方法時(shí),不必獲取它屬于的類的實(shí)例。Java里的static方法不能被override,因?yàn)閛verride的機(jī)制是運(yùn)行時(shí)(runtime)的動(dòng)態(tài)綁定,而static方法是在編譯時(shí)靜態(tài)綁定的。static方法并不與任何類的具體實(shí)例有關(guān),因此無法應(yīng)用繼承的概念。4.在靜態(tài)方法里可以訪問非靜態(tài)變量嗎?Java

中的static變量歸相應(yīng)的類所有,它的值對(duì)于類的所有實(shí)例都是相同的。static變量是在JVM加載類的時(shí)候初始化的。如果代碼試圖訪問非靜態(tài)的變量,而且不是通過類的實(shí)例去訪問,編譯器會(huì)報(bào)錯(cuò),因?yàn)檫@些非靜態(tài)變量還沒有被創(chuàng)建呢,并且它們沒有與實(shí)例相關(guān)聯(lián)。5.Java支持哪些數(shù)據(jù)類型?什么是Autoboxing和Unboxing?

Java語言支持的8個(gè)基本數(shù)據(jù)類型如下:byteshortintlongfloatdoublebooleancharAutoboxing是指在基本數(shù)據(jù)類型和對(duì)應(yīng)的包裝(wrapper)類之間Java編譯器所做的自動(dòng)轉(zhuǎn)換。例如,編譯器將int轉(zhuǎn)換為

Integer,將

double轉(zhuǎn)換為

Double

,等等。逆向的轉(zhuǎn)換稱為unboxing。6.在Java中什么是方法的

Override(覆蓋)和Overload(重載)?

Java中方法的overload發(fā)生的條件是,同一個(gè)類里,有兩個(gè)或以上的方法名稱完全相同,但參數(shù)列表不同。另一方面,方法的override是指,子類重定義了父類里的同一個(gè)方法。Override的方法必須方法名、參數(shù)列表和返回類型都完全相同。Override的方法不會(huì)限制原方法的訪問權(quán)限。7.Java中構(gòu)造函數(shù)、構(gòu)造函數(shù)重載的概念和拷貝構(gòu)造函數(shù)

當(dāng)類的對(duì)象被創(chuàng)建的時(shí)候,調(diào)用它的構(gòu)造函數(shù)。每個(gè)類都有一個(gè)構(gòu)造函數(shù)。如果程序員沒有為類編寫構(gòu)造函數(shù),Java編譯器自動(dòng)為類創(chuàng)建一個(gè)缺省的構(gòu)造函數(shù)。

構(gòu)造函數(shù)重載和Java中函數(shù)重載類似,可以為同一個(gè)類創(chuàng)建不同的構(gòu)造函數(shù),每個(gè)構(gòu)造函數(shù)必須擁有唯一的參數(shù)列表。

Java與C++不同,它不支持拷貝構(gòu)造函數(shù),但是區(qū)別僅僅是,如果你沒有編寫類的拷貝構(gòu)造函數(shù),Java不會(huì)自動(dòng)創(chuàng)建它。

8.Java支持多繼承嗎?

Java不支持多繼承,每個(gè)類只允許繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口。9.接口和抽象類有什么不同?Java同時(shí)提供和支持抽象類和接口,它們的實(shí)現(xiàn)有一些共同的特點(diǎn),也有如下不同:接口中所有的方法默認(rèn)都是抽象的,而抽象類可以同時(shí)包含抽象和非抽象的方法。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但它只能繼承一個(gè)抽象類。一個(gè)類要實(shí)現(xiàn)某個(gè)接口,必須實(shí)現(xiàn)這個(gè)接口聲明的所有方法。而一個(gè)類不需要實(shí)現(xiàn)抽象父類中聲明的所有方法,不過,這時(shí)候這個(gè)類也必須聲明為抽象類。抽象類可以實(shí)現(xiàn)接口,而且不需要實(shí)現(xiàn)接口中的方法。接口中聲明的變量默認(rèn)是final的,而抽象類可以包含非final的變量。接口中的成員默認(rèn)是public的,而抽象類的成員可以是private,protected,或public的。接口是絕對(duì)抽象的,不可實(shí)例化,抽象類也不可以實(shí)例化,但可以在main方法中觸發(fā)實(shí)例化(注:通過匿名類實(shí)現(xiàn))。也可以查閱

AbstractclassandInterfacedifferencesforJDK8

。

10.傳引用和傳值

當(dāng)對(duì)象通過傳值調(diào)用時(shí),傳遞的是這個(gè)對(duì)象的一個(gè)拷貝。因此,即使函數(shù)修改這個(gè)對(duì)象,也不會(huì)影響原對(duì)象的值。

當(dāng)對(duì)象通過傳引用調(diào)用時(shí),對(duì)象本身沒有被傳遞,而傳遞的是對(duì)象的一個(gè)引用。因此,外部函數(shù)對(duì)這個(gè)對(duì)象的修改,也會(huì)反映到任何出現(xiàn)這個(gè)對(duì)象的地方。Java線程11.進(jìn)程與線程的區(qū)別?

進(jìn)程是一個(gè)程序的執(zhí)行(即正在運(yùn)行的程序),然而線程是在進(jìn)程中獨(dú)立的執(zhí)行序列.一個(gè)進(jìn)程可以包含很多線程.線程有時(shí)被稱為輕量級(jí)的進(jìn)程.12.說下創(chuàng)建線程的不同方式.你傾向于哪種方式并說明原因?

有三種創(chuàng)建線程的方式:繼承Thread類.實(shí)現(xiàn)Runnable接口.通過Executor框架創(chuàng)建線程池.首選方式是實(shí)現(xiàn)Runnable接口,因?yàn)樗恍枰^承Thread類.當(dāng)你的程序設(shè)計(jì)需要多繼承時(shí),使用接口會(huì)有所幫助.另外,線程池效率是很高的,并且實(shí)施起來也很簡(jiǎn)單.13.解釋下可用的線程狀態(tài).

在執(zhí)行期間,線程會(huì)處于以下狀態(tài)中的一種:Runnable:線程已準(zhǔn)備就緒,但沒有立即運(yùn)行.Running:處理器正在執(zhí)行的線程代碼.Waiting:處于阻塞狀態(tài)的線程,等待外部某種處理的結(jié)束.Sleeping:被強(qiáng)制休眠的線程.BlockedonI/O:等待I/O操作的完成.BlockedonSynchronization:等待取得線程鎖.Dead:線程已經(jīng)執(zhí)行結(jié)束.14.同步方法與同步塊的區(qū)別?

在Java程序中,每個(gè)對(duì)象都擁有一個(gè)鎖.線程可以通過使用synchronized關(guān)鍵字來獲取一個(gè)對(duì)象上的鎖.synchronized關(guān)鍵字可以用于方法級(jí)別(粗粒度鎖)或代碼塊級(jí)別(細(xì)粒度鎖).15.在監(jiān)視器中的線程同步是怎樣發(fā)生的?你可以使用哪些級(jí)別的同步?JVM使用結(jié)合了監(jiān)視器的鎖.監(jiān)視器是一個(gè)守護(hù)者,它看管一個(gè)同步代碼的序列,并且確保在一個(gè)時(shí)刻只能有一個(gè)線程執(zhí)行同步代碼片段.每個(gè)監(jiān)視器關(guān)聯(lián)著一個(gè)對(duì)象引用.只能得到鎖的線程才可以執(zhí)行同步代碼.16.什么是死鎖?當(dāng)兩個(gè)進(jìn)程相互等待對(duì)方執(zhí)行完畢時(shí),其結(jié)果是它們會(huì)永遠(yuǎn)等待下去.17.怎樣確保N個(gè)線程訪問N個(gè)資源時(shí)不會(huì)發(fā)生死鎖?使用N個(gè)線程時(shí)一個(gè)非常簡(jiǎn)單的避免死鎖的方法是為所有的鎖排序,并強(qiáng)制每個(gè)線程也按那種方式排序.這樣,如果所有線程以相同的順序鎖定和解鎖互斥資源就不會(huì)發(fā)生死鎖了.JavaCollections18.JavaCollections框架的基本接口?

JavaCollections框架

提供了一系列支持對(duì)象集合操作的設(shè)計(jì)良好的接口和類.JavaCollections框架中最基礎(chǔ)的接口是:Collection,表示一組對(duì)象(元素).Set,包含非重復(fù)元素的集合.List,包含非重復(fù)元素的有序集合.Map,包含非重復(fù)鍵的鍵值對(duì)的對(duì)象.19.為什么Collection沒有繼承Cloneable和Serializable接口?Collection接口描述的是由元素組成的對(duì)象組.Collection的每一個(gè)具體實(shí)現(xiàn)可以選擇自己的方式來管理元素.一些集合允許存在重復(fù)鍵,另一些則不允許.當(dāng)處理實(shí)際實(shí)現(xiàn)時(shí)復(fù)制和序列化的語義和效果才會(huì)起作用.因此,集合類的具體實(shí)現(xiàn)應(yīng)該決定它們將怎樣被復(fù)制和序列化.20.什么是Iterator(疊代器)?Iterator接口提供了許多能夠疊代集合的方法.每個(gè)java集合(Collection)都含有一個(gè)返回Iterator實(shí)例的iterator方法.疊代器在疊代過程中能夠移除底層集合中的元素.21.Iterator和ListIterator之間的不同?

它們之間的不同如下:Iterator能夠遍歷Set和List集合,而ListIterator只能用來遍歷List.Iterator只能正向遍歷集合,而ListIterator可以雙向遍歷List.ListIterator實(shí)現(xiàn)了Iterator接口并提供了額外的功能,例如添加元素,替換元素,取得上一個(gè)或上一個(gè)元素索引,等等.22.fail-fast與fail-safe的區(qū)別?Iterator的fail_safe特性是對(duì)底層集合的拷貝進(jìn)行操作,因此對(duì)集合的任何改變都不會(huì)有影響.java.util包下的所有集合類是fail-fast的,但java.util.concurrent包下的集合類是fail-safe的.fail-fast疊代器會(huì)拋出ConcurrentModificationException,而fail-safe疊代器不會(huì)拋出這種異常.23.Java中的HashMap是怎么工作的?

Java中的HashMap是用來存儲(chǔ)鍵值對(duì)的。HashMap

需要一個(gè)hash函數(shù),它使用

hashCode

equals方法,來進(jìn)行collection中元素的保存和查找。調(diào)用put方法時(shí),HashMap

會(huì)計(jì)算鍵(key)的hash值,然后將鍵值對(duì)存到collection的適當(dāng)索引下。如果鍵已經(jīng)存在,那么相應(yīng)的值會(huì)更新。HashMap

的重要特征主要有它的容量,裝載因子(loadfactor)和容量擴(kuò)充(thresholdresizing)。24.hashCode()和equals()方法重要性何在?

Java中的

HashMap

使用

hashCode

equals

方法來確定鍵值對(duì)的索引。根據(jù)鍵去查詢對(duì)應(yīng)的值時(shí),同樣會(huì)用到這兩個(gè)方法。如果這兩個(gè)方法沒有正確實(shí)現(xiàn),兩個(gè)不同的鍵可能會(huì)產(chǎn)生相同的hash值,因此會(huì)被collection認(rèn)為是相同的。并且,這兩個(gè)方法在檢測(cè)重復(fù)時(shí)也會(huì)用到。因此,這兩個(gè)方法都要正確實(shí)現(xiàn),對(duì)

HashMap

的正確性和效率都至關(guān)重要。25.HashMap與HashTable之間有哪些不同?HashMap、HashTable這兩個(gè)類都實(shí)現(xiàn)了Map接口,因此有些非常相似的特征,但他們?cè)谝韵绿匦灾杏钟兴煌篐ashMap的key與value都允許null值的存在,而HashTable則既不允許key為null,也不允許value為null。HashTable是線程同步的,而HashMap則不是。因此,在單線程環(huán)境下HashMap是首選,而HashTable更適合在多線程環(huán)境下使用。HashMap提供了它鍵的set集合,因此Java程序可以通過set進(jìn)行迭代。因此,HashMap是快速失敗的。另一方面,HashTable提供了它鍵的枚舉。HashTable類被當(dāng)做遺留類(譯者注:Java遺留類說明)26.Array與ArrayList間有什么不同?與ArrayList相比你什么時(shí)候會(huì)用Array?Array與ArrayList類在以下特性中有所區(qū)別:Arrays可以包含基礎(chǔ)數(shù)據(jù)類型或者對(duì)象,而ArrayList只能包含對(duì)象。Arrays有固定長(zhǎng)度,而ArrayList長(zhǎng)度則是動(dòng)態(tài)的。ArrayList類提供了更多的方法和特性,比如addAll,removeAll,iterator,等等對(duì)于一個(gè)基礎(chǔ)數(shù)據(jù)類型的list,集合框架使用了自動(dòng)裝箱去減少編碼的工作。但針對(duì)固定長(zhǎng)度的基礎(chǔ)數(shù)據(jù)類型,這種方法會(huì)使得它們變得更慢。27.ArrayList與LinkedList間有什么不同?ArrayList、LinkedList這兩個(gè)類都實(shí)現(xiàn)了List接口,但他們以下特性中又有所不同:ArrayList是基于索引的數(shù)據(jù)結(jié)構(gòu),底層由Array支持實(shí)現(xiàn)。它提供了以時(shí)間復(fù)雜度為O(1)的性能隨機(jī)訪問它的元素,另一方面,LinkedList以元素列表的方式來存儲(chǔ)它的數(shù)據(jù),每一個(gè)元素與它前一個(gè)和后一個(gè)元素都是相連的。對(duì)元素查詢操作的時(shí)間復(fù)雜度為O(n).對(duì)元素的插入、添加、移除操作,與ArrayList相比,LinkedList更快,因?yàn)?,?dāng)一個(gè)元素被添加到集合內(nèi)部的任意位置時(shí),LinkedList不需要重新調(diào)整數(shù)組大小或者更新索引。LinkedList比ArrayList消耗更多的內(nèi)存,因?yàn)長(zhǎng)inkedList中每一個(gè)節(jié)點(diǎn)都存儲(chǔ)了兩個(gè)引用,一個(gè)是它前一個(gè)元素,一個(gè)是它后一個(gè)元素也可以查看我們的文章ArrayListvs.LinkedList28.Comparable和Comparator接口分別是什么?列出它們的區(qū)別。

Java提供的

Comparable

接口,其中只包含一個(gè)方法,就是

compareTo。這個(gè)方法會(huì)比較兩個(gè)對(duì)象,從而得出它們的順序關(guān)系。具體來說,它會(huì)返回一個(gè)負(fù)整數(shù),零,或一個(gè)正整數(shù),分別表示傳入的對(duì)象小于,等于或大于已有的對(duì)象。Java提供的

Comparator

接口,包含兩個(gè)方法,compare

equals

。compare方法比較兩個(gè)參數(shù),得出它們的順序關(guān)系。它會(huì)返回一個(gè)負(fù)整數(shù),零,或一個(gè)正整數(shù),分別表示第一個(gè)參數(shù)小于,等于或大于已有的對(duì)象。equals方法有1個(gè)參數(shù),它用來確定參數(shù)對(duì)象是否等于這個(gè)camparator。這個(gè)方法僅在要比較的對(duì)象也是一個(gè)comparator,同時(shí)它的序關(guān)系與這個(gè)comparator相同時(shí),才會(huì)返回true。29.JavaPriorityQueue是什么?

PriorityQueue是一個(gè)基于優(yōu)先級(jí)堆的無界隊(duì)列,它的元素都以他們的自然順序有序排列。在它創(chuàng)建的時(shí)候,我們可以可以提供一個(gè)比較器(Comparator)來負(fù)責(zé)PriorityQueue中元素的排序。PriorityQueue不允許null元素,不允許不提供自然排序的對(duì)象,也不允許沒有任何關(guān)聯(lián)Comparator的對(duì)象。最后,PriorityQueue不是線程安全的,在執(zhí)行入隊(duì)和出隊(duì)操作它需要O(log(n))的時(shí)間復(fù)雜度。30.關(guān)于Big-O符號(hào)你了解些什么?你能針對(duì)不同數(shù)據(jù)結(jié)構(gòu)舉些例子嗎?

Big-O符號(hào)簡(jiǎn)單描述了,在一種數(shù)據(jù)結(jié)構(gòu)中隨著元素的不斷增加,在最壞的情況下,一個(gè)算法的擴(kuò)展或者執(zhí)行能有多好。Big-O符號(hào)還可以用來描述其他的行為,比如內(nèi)存消耗。由于collection集合下的類實(shí)際上都是數(shù)據(jù)結(jié)構(gòu),我們通常用Big-O符號(hào)來選擇基于時(shí)間、內(nèi)存、性能前提下的最好實(shí)現(xiàn)去使用。Big-O符號(hào)能就大量數(shù)據(jù)的性能給出一個(gè)很好的指示。31.如何權(quán)衡有序數(shù)組和無序數(shù)組?

有序數(shù)組最關(guān)鍵的優(yōu)勢(shì)在于搜索的時(shí)間復(fù)雜度為O(logn),而無序數(shù)組的時(shí)間復(fù)雜度是O(n)。有序數(shù)組的劣勢(shì)就在于插入操作的時(shí)間復(fù)雜度為O(n),因?yàn)檩^高值的元素需要挪動(dòng)位置騰出空間給新元素。與之不同的是,無序數(shù)組的插入操作的時(shí)間復(fù)雜度為O(1)。32.有哪些關(guān)于Java集合框架的最佳實(shí)踐?基于應(yīng)用的需求來選擇使用正確類型的集合,這對(duì)性能來說是非常重要的。例如,如果元素的大小是固定的,并且知道優(yōu)先級(jí),我們將會(huì)使用一個(gè)

Array,而不是

ArrayList。一些集合類允許我們指定他們的初始容量。因此,如果我們知道存儲(chǔ)數(shù)據(jù)的大概數(shù)值,就可以避免重散列或者大小的調(diào)整??偸鞘褂梅盒蛠肀WC類型安全,可靠性和健壯性。同時(shí),使用泛型還可以避免運(yùn)行時(shí)的

ClassCastException。在Map中使用JavaDevelopmentKit(JDK)提供的不可變類作為一個(gè)key,這樣可以避免

hashCode

的實(shí)現(xiàn)和我們自定義類的equals方法。應(yīng)該依照接口而不是實(shí)現(xiàn)來編程。返回零長(zhǎng)度的集合或者數(shù)組,而不是返回一個(gè)null,這樣可以防止底層集合是空的。33.Enumeration和Iterator接口有什么不同?

Enumeration

跟Iterator相比較快兩倍,而且占用更少的內(nèi)存。但是,Iterator

相對(duì)于Enumeration更安全,因?yàn)槠渌€程不能修改當(dāng)前迭代器遍歷的集合對(duì)象。同時(shí),Iterators允許調(diào)用者從底層集合中移除元素,這些Enumerations都沒法完成。34.HashSet和TreeSet有什么不同?

HashSet

是用一個(gè)hash表來實(shí)現(xiàn)的,因此,它的元素是無序的。添加,刪除和HashSet包括的方法的持續(xù)時(shí)間復(fù)雜度是O(1)。另一個(gè)方面,TreeSet是用一個(gè)樹形結(jié)構(gòu)實(shí)現(xiàn)的,因此,它是有序的。添加,刪除和TreeSet包含的方法的持續(xù)時(shí)間復(fù)雜度是

O(logn)。垃圾回收器35.Java中垃圾回收的目的是什么,它什么時(shí)候被使用?垃圾回收用于識(shí)別和丟棄程序不再需要的對(duì)象,以便回收和復(fù)用資源.36.System.gc()和Runtime.gc()方法用途?這些方法用于提醒JVM開始垃圾回收.然而開始垃圾回收的時(shí)機(jī)是由JVM決定的.37.finalize()什么時(shí)候被調(diào)用?它的目的是什么?finallize方法是在釋放該對(duì)象內(nèi)存前由gc(垃圾回收器)調(diào)用.通常建議在這個(gè)方法中釋放該對(duì)象持有的資源.38.如果一個(gè)對(duì)象的引用被設(shè)置為null,gc會(huì)立即釋放該對(duì)象的內(nèi)存么?不會(huì),這個(gè)對(duì)象將會(huì)在下一次gc循環(huán)中被回收.39.Java堆的結(jié)構(gòu)是什么?堆中的PermGen(全稱是PermanentGeneration)空間是什么?JVM有一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),即堆(heap).所有的類實(shí)例和數(shù)組的內(nèi)存都是從堆中分配的.它在JVM啟動(dòng)時(shí)被創(chuàng)建.對(duì)象所占用的堆內(nèi)存會(huì)被一個(gè)稱為垃圾回收器的自動(dòng)內(nèi)存管理系統(tǒng)收回.堆內(nèi)存中包含活的和死的對(duì)象.活的對(duì)象可以被程序訪問并且不會(huì)被垃圾回收.死的對(duì)象是那些不會(huì)被程序訪問的,但還沒有被垃圾回收器收回的對(duì)象.這種對(duì)象會(huì)占用堆內(nèi)存空間直到最終被垃圾回收器收回.40.Serial垃圾回收器與Throughput垃圾回收器區(qū)別?Throughput垃圾回收器使用并行版本的新生代回收器,它用于中到大型數(shù)據(jù)集的應(yīng)用.另一方面,Serial回收器通常足以應(yīng)對(duì)大多數(shù)的小應(yīng)用(在現(xiàn)代處理器上不會(huì)超過約100MB的堆內(nèi)存).41.什么時(shí)候?qū)ο髸?huì)被回收?

當(dāng)前程序無法訪問到某個(gè)對(duì)象時(shí),該對(duì)象將被回收.42.垃圾回收發(fā)生在指定的JVM區(qū)域?

垃圾回收在PermGen里發(fā)生。如果PermGen滿了或是到了瓶頸,就會(huì)觸發(fā)完全回收。如果仔細(xì)觀察垃圾回收過程,會(huì)發(fā)現(xiàn)PermGen最后也被回收了.這就是為什么要設(shè)置合理的PermGen大小以避免完全垃圾回收.可以看看這篇文章

Java8:PermGentoMetaspace.異常處理

43.Java中的兩種異常是什么?它們之間的區(qū)別?

Java有兩種類型的異常:checked與unchecked(檢查與未檢查)異常.如果unchecked異常可能會(huì)在方法或構(gòu)造函數(shù)的執(zhí)行時(shí)被拋出從而蔓延到方法或構(gòu)造函數(shù)的外部,它們也不需要要在方法或構(gòu)造函數(shù)中聲明throws子句.然而,checked異常必須通過方法或構(gòu)造函數(shù)的throws子句聲明.關(guān)于java異常處理的建議請(qǐng)參考這里Javaexceptionhandling.44.Java中異常與錯(cuò)誤的區(qū)別?Exception和Error都是Throwable類的子類.

Exception用于用戶程序需要捕獲的異常條件.

Error定義了用戶程序不可預(yù)見的異常45.throw與throws的區(qū)別?

關(guān)鍵字throw用于在程序中顯式地拋出一個(gè)異常.相反,throws子句用于指出在該方法中沒有處理的異常.每個(gè)方法必須顯式指明哪些異常沒有處理,以便該方法的調(diào)用者可以預(yù)防可能發(fā)生的異常.最后,多個(gè)異常用逗號(hào)分隔.45.異常處理中finally語句塊的重要性?不管程序是否發(fā)生了異常,finally語句塊都會(huì)被執(zhí)行.甚至當(dāng)沒有catch聲明但拋出了一個(gè)異常時(shí),finally語句塊也會(huì)被執(zhí)行.最后要說一點(diǎn):finally語句塊通常用于釋放資源,如I/O緩沖區(qū),數(shù)據(jù)庫(kù)連接等等.46.異常被處理后異常對(duì)象會(huì)發(fā)生什么?

異常對(duì)象會(huì)在下次gc執(zhí)行時(shí)被回收.47.怎樣區(qū)分finally語句塊與finalize()方法?

不管是否拋出異常finally語句塊都會(huì)被執(zhí)行,它通常用于釋放程序持有的資源.finalize是Object類中的一個(gè)protected方法,當(dāng)一個(gè)對(duì)象被gc回收前它會(huì)被jvm調(diào)用.JavaApplets48.什么是Applet?

一個(gè)JavaApplet可以包含在HTML頁面中并且可以在啟用Java客戶端的瀏覽器中運(yùn)行。Applets可以用來創(chuàng)建動(dòng)態(tài)和交互式的web應(yīng)用程序。49.Applet生命周期的說明

一個(gè)Applet可能會(huì)經(jīng)歷以下的幾個(gè)狀態(tài):Init:每次加載的時(shí)候都進(jìn)行初始化Start:開始執(zhí)行一個(gè)appletStop:停止執(zhí)行一個(gè)appletDestroy:卸載applet之前執(zhí)行最后的清理50.當(dāng)applet加載的時(shí)候會(huì)發(fā)生什么?

首先,會(huì)創(chuàng)建一個(gè)applet的控制類的實(shí)例。然后,applet初始化,最后applet開始運(yùn)行。51.Applet和Java應(yīng)用程序有什么不同?

Applets需要一個(gè)支持Java的瀏覽器,但是Java應(yīng)用程序可以被單獨(dú)執(zhí)行。但是,他們都需要一個(gè)Java虛擬機(jī),JVM。還有,一個(gè)Java應(yīng)用程序需要一個(gè)main方法與特定的簽名,來確保啟動(dòng).Javaapplets并不需要這樣一些東西。最后,JavaApplet通常使用嚴(yán)格的安全策略,而Java應(yīng)用程序通常使用較寬松的安全策略。52.

什么是強(qiáng)加給JavaApplet限制?

這主要是由于安全原因,以下限制強(qiáng)加在Java小程序:Applet無法加載庫(kù)或定義本地方法。Applet通常無法讀取或執(zhí)行主機(jī)的文件。Applet無法讀取某些系統(tǒng)屬性。除非連接來自主機(jī)否則不能進(jìn)行網(wǎng)絡(luò)連接。Applet程序不能啟動(dòng)主機(jī)上執(zhí)行它的任何程序。53.什么是不可信的Applet?

不受信任的Applet是那些JavaApplet不能訪問或執(zhí)行本地系統(tǒng)的文件的程序。默認(rèn)情況下,所有下載的Applet被認(rèn)為是不可信的。54.通過文件系統(tǒng)加載的小程序在加載了互聯(lián)網(wǎng)和Applet之間的區(qū)別是什么?

關(guān)于其中一個(gè)applet被加載在互聯(lián)網(wǎng)的情況下,applet是由applet類加載器加載并須受該applet安全管理器執(zhí)行的限制。關(guān)于其中一個(gè)applet是從客戶端的本地磁盤加載的情況下,applet是由文件系統(tǒng)加載器加載的。通過文件系統(tǒng)加載的applet允許讀取文件,寫入文件并加載在客戶端上。還有,通過文件系統(tǒng)加載applet允許執(zhí)行,最后,通過文件系統(tǒng)加載的applet不管是否通過字節(jié)碼驗(yàn)證都可加載。55.什么是applet類加載器,它提供了什么?

當(dāng)在互聯(lián)網(wǎng)上加載applet,該applet是由applet的類加載器加載的。類加載器強(qiáng)制執(zhí)行Java命名空間的層次結(jié)構(gòu)。此外,類加載器保證這是在來自本地文件系統(tǒng)的類中唯一的命名空間,以及在每個(gè)網(wǎng)絡(luò)源中唯一的命名空間。

當(dāng)瀏覽器在網(wǎng)絡(luò)上加載applet,applet的類被放置在私人的和applet起始地址有關(guān)的命名空間中。那么,那些類加載器加載的類就會(huì)通過校驗(yàn)。這個(gè)校驗(yàn)會(huì)檢查類文件是否符合Java語言規(guī)范。除此之外,校驗(yàn)器會(huì)確保沒有堆棧溢出或者向下溢出,參數(shù)的所有字節(jié)碼指令也是正確的。56.什么是applet安全管理,它提供什么?

applet安全管理是對(duì)Javaapplet做了限制的機(jī)制。瀏覽器只能有一個(gè)安全管理器。安全管理器在啟動(dòng)的時(shí)候建立,之后它不能被取代,重載,重寫或者延長(zhǎng)。Swing57.Choice和List之間的區(qū)別是什么?

Choice是一種緊湊的方式展示,必須要拉下,是為了讓用戶能夠看到所有的可選選項(xiàng)列表。Choice只能選中一個(gè)選項(xiàng)。List是以幾個(gè)List選項(xiàng)是可見的方式展示的。List支持選中一個(gè)或多個(gè)List選項(xiàng)。58.什么是布局管理器?

布局管理器是用來組織容器內(nèi)的組件。59.Scrollbar和JScrollPane的區(qū)別是什么?

Scrollbar是一個(gè)組件,

但不是一個(gè)容器,而ScrollPane是一個(gè)容器。

ScrollPane處理它自身的事件并執(zhí)行它自己的滑動(dòng)。60.哪些Swing方法是線程安全?

只有3個(gè)方法是線程安全的:repaint,revalidate,和invalidate。61.說出3個(gè)支持繪圖的子類。

Canvas,Frame,Panel,和Applet類都支持繪圖。62.什么是裁剪?

裁剪是指在有限的區(qū)域和圖形類進(jìn)行繪圖操作。63.MenuItem和CheckboxMenuItem的區(qū)別是什么?

CheckboxMenuItem類繼承了MenuItem類,并支持選中或者取消菜單選項(xiàng)。64.BorderLayout的元素是怎樣組織的?

BorderLayout的元素都是在有序地分布在邊緣部分(東,南,西,北)和容器的中心。65.GridBagLayout的元素是怎樣組織的?

GridBagLayout的元素根據(jù)網(wǎng)格組織的。元素具有不同的尺寸,并且可以占據(jù)一行或列的網(wǎng)格。因此,行和列可以有不同的尺寸。66.Window和Frame有什么區(qū)別?

Frame類是繼承Window類,并定義了一些主要的帶菜單欄的應(yīng)用程序窗口。67.裁剪和重畫之間的關(guān)系?

當(dāng)窗口被AWT繪圖線程重畫,它設(shè)置了裁剪區(qū)域到窗口中請(qǐng)求重畫的區(qū)域。68.事件監(jiān)聽器接口和事件適配器類之間是什么關(guān)系?

事件監(jiān)聽器接口定義了一個(gè)特定事件的事件處理程序所必須實(shí)現(xiàn)的一些方法。事件適配器提供了一個(gè)事件偵聽器接口的默認(rèn)實(shí)現(xiàn)。69.一個(gè)GUI組件怎么處理自己的事件?

GUI組件可以通過實(shí)現(xiàn)相應(yīng)的事件監(jiān)聽器接口和添加它自己作為本身的事件偵聽器來處理自己的事件。70.Java布局管理器提供超過傳統(tǒng)的窗口系統(tǒng)的什么樣的優(yōu)勢(shì)?

Java使用布局管理器以一致的方式來布局組件,跨所有窗口平臺(tái)。由于布局管理器不綁定絕對(duì)化的尺寸和位置,所以它們能夠容納不同窗口系統(tǒng)的平臺(tái)具體差異。71.Java為所有Swing組件使用的設(shè)計(jì)模式是什么?

Java為所有Swing組件使用的設(shè)計(jì)模式是是模型視圖控制器(MVC)模式。JDBC72.什么是JDBC?

JDBC是一個(gè)抽象層,允許用戶在不同數(shù)據(jù)庫(kù)間進(jìn)行選擇。JDBC使開發(fā)人員能夠在Java中編寫數(shù)據(jù)庫(kù)應(yīng)用程序,而不必讓自己關(guān)心一個(gè)特定的數(shù)據(jù)庫(kù)的底層細(xì)節(jié)。73.解釋JDBC中驅(qū)動(dòng)的作用。

JDBC驅(qū)動(dòng)提供了對(duì)JDBCAPI所提供的抽象類的數(shù)據(jù)庫(kù)供應(yīng)商的特定實(shí)現(xiàn)。每個(gè)驅(qū)動(dòng)必須提供java.sql包的以下的類實(shí)現(xiàn):Connection,Statement,PreparedStatement,CallableStatement,ResultSet

Driver。74.Class.forName方法的目的是什么?

此方法用于加載驅(qū)動(dòng)程序,以建立與數(shù)據(jù)庫(kù)的連接。75.與Statement相比PreparedStatement的優(yōu)點(diǎn)?PreparedStatement是預(yù)編譯的,因此它有更好的性能。另外,PreparedStatement可以被不同輸入值的查詢重用。76.CallableStatement的用途?指出用于創(chuàng)建CallableStatement的方法.CallableStatement用于執(zhí)行存儲(chǔ)過程。存儲(chǔ)過程由數(shù)據(jù)庫(kù)保存并提供。存儲(chǔ)過程可以根據(jù)用戶的輸入返回結(jié)果。強(qiáng)烈建議使用存儲(chǔ)過程,因?yàn)樗峁┝税踩院湍K化。準(zhǔn)備CallableStatement的方法如下:CallableStament.prepareCall();77.連接池是什么?打開和關(guān)閉數(shù)據(jù)庫(kù)連接時(shí)與數(shù)據(jù)庫(kù)的交互需要付出很高的代價(jià).特別是當(dāng)數(shù)據(jù)庫(kù)客戶端增長(zhǎng)時(shí),這個(gè)代價(jià)是相當(dāng)高的,并且消耗了很多資源。數(shù)據(jù)庫(kù)連接池中的連接在應(yīng)用服務(wù)器啟動(dòng)時(shí)被創(chuàng)建并在池中進(jìn)行管理。一個(gè)連接請(qǐng)求由池中的數(shù)據(jù)庫(kù)連接提供。當(dāng)連接結(jié)束后,請(qǐng)求會(huì)被放回池中以供以后重用。遠(yuǎn)程方法調(diào)用(RMI)78.

什么是RMI?

Java遠(yuǎn)程方法調(diào)用(RMI)是一個(gè)JavaAPI,它執(zhí)行的面向?qū)ο蟮牡葍r(jià)遠(yuǎn)程過程調(diào)用(RPC)的方法,包括了直接傳輸序列化的Java類和分布式垃圾收集的支持。遠(yuǎn)程方法調(diào)用(RMI),也可以看作是一個(gè)遠(yuǎn)程運(yùn)行的對(duì)象上激活的方法的過程。RMI提供位置透明性,因?yàn)橛脩粽J(rèn)為一個(gè)方法是在本地運(yùn)行的對(duì)象上執(zhí)行。

RMITipshere.79.什么是RMI的體系結(jié)構(gòu)的基本原理?

RMI的架構(gòu)最重要的原則是將行為的定義和行為的實(shí)施分別對(duì)待。RMI允許定義的行為和實(shí)現(xiàn)行為保持獨(dú)立,并在獨(dú)立的JVM中運(yùn)行的代碼。80.RMI的體系結(jié)構(gòu)層是什么?

RMI的結(jié)構(gòu)主要分為以下幾層:樁(Stub)和框架(Skeleton)層:該層位于開發(fā)者視圖的下面。該層是負(fù)責(zé)攔截客戶端請(qǐng)求接口的方法并重定向這些請(qǐng)求到遠(yuǎn)程RMI服務(wù)上。遠(yuǎn)程引用層:架構(gòu)的第二層是處理從客戶端到服務(wù)器的遠(yuǎn)程對(duì)象引用的解析。該層解析并管理從客戶端到遠(yuǎn)程服務(wù)對(duì)象的引用。該連接是一對(duì)一(單播)連接的。傳輸層:該層主要負(fù)責(zé)連接參與服務(wù)的兩個(gè)JVM。它基于通過網(wǎng)絡(luò)連接的機(jī)子的TCP/IP,提供了基本的連通性,以及一些防火墻的滲透策略。81.在RMI中遠(yuǎn)程接口的作用是什么?

遠(yuǎn)程接口用于識(shí)別那些不是來自本地機(jī)子接口但可以被調(diào)用的方法。所有對(duì)象都是必須直接或間接實(shí)現(xiàn)該接口的遠(yuǎn)程對(duì)象。實(shí)現(xiàn)該遠(yuǎn)程接口之前應(yīng)該聲明其遠(yuǎn)程接口,為每個(gè)遠(yuǎn)程對(duì)象定義構(gòu)造方法,并在所有遠(yuǎn)程接口中為每個(gè)遠(yuǎn)程方法提供實(shí)現(xiàn)。82.java.rmi.Naming類扮演的角色?java.rmi.Naming類提供了存儲(chǔ)和獲取已注冊(cè)的遠(yuǎn)程對(duì)象.Naming類中的每個(gè)方法都需要一個(gè)URL格式的String作為參數(shù)的名稱.83.RMI中的綁定是什么意思?綁定是關(guān)聯(lián)或注冊(cè)一個(gè)遠(yuǎn)程對(duì)象的名字的過程,這個(gè)名字可以在以后用到,用于查找與它綁定的遠(yuǎn)程對(duì)象.遠(yuǎn)程對(duì)象可以通過Naming類中的bind或rebind方法與一個(gè)名字相關(guān)聯(lián).84.Naming類中的bind與rebind方法的區(qū)別?bind方法的綁定主要用于將特定的名字綁定到一個(gè)遠(yuǎn)程對(duì)象,但rebind方法的綁定用于將特定的名字重新綁定到一個(gè)新的遠(yuǎn)程對(duì)象.如果這個(gè)名字已經(jīng)綁定過了,使用rebind這個(gè)綁定會(huì)被替換.85.運(yùn)行RMI程序的步驟?為了使RMI程序正常運(yùn)行需要以下步驟:編譯所有源文件.用rmic生成stub.啟動(dòng)rmiregistry.啟動(dòng)RMIServer.運(yùn)行客戶端程序.86.RMI中stub的角色?遠(yuǎn)程對(duì)象的stub作為遠(yuǎn)程對(duì)象在本地程序中的表示或代理.調(diào)用者調(diào)用本地stub的一個(gè)方法,這個(gè)方法會(huì)在遠(yuǎn)程對(duì)象上執(zhí)行.當(dāng)一個(gè)stub的方法被調(diào)用時(shí),它經(jīng)歷了以下步驟:初始化與運(yùn)行遠(yuǎn)程對(duì)象的遠(yuǎn)程JVM的連接.將參數(shù)編碼并傳遞給遠(yuǎn)程JVM.等待方法調(diào)用與執(zhí)行的結(jié)果.解碼返回值或異常(如果執(zhí)行失敗).將返回值返回給調(diào)用者.87.什么是DGC?它是如何工作的?

DGC代表的是分布式垃圾收集。遠(yuǎn)程方法調(diào)用(RMI)使用的是DGC自動(dòng)垃圾收集機(jī)制。由于RMI涉及到跨JVM的遠(yuǎn)程引用,垃圾回收就會(huì)相當(dāng)困難。DGC使用相關(guān)的計(jì)數(shù)算法為遠(yuǎn)程對(duì)象提供自動(dòng)存儲(chǔ)管理。88.在RMI中使用RMISecurityManager的目的是什么?

在RMI應(yīng)用程序中可以使用RMISecurityManager提供安全管理器來下載代碼。如果安全管理器沒有設(shè)置好,RMI的類加載器不會(huì)從遠(yuǎn)程端下載任何類。89.解釋編組和解組。

當(dāng)一個(gè)應(yīng)用程序要通過網(wǎng)絡(luò)來傳送內(nèi)存對(duì)象到另一臺(tái)主機(jī),或者保留它到存儲(chǔ)器,內(nèi)存表達(dá)法會(huì)將其轉(zhuǎn)換到合適的格式。這個(gè)過程就叫做編組,而恢復(fù)操作就叫解組。90.解釋序列化和反序列化。

Java提供了一個(gè)機(jī)制,是指一個(gè)對(duì)象可以被表示為字節(jié)序列,包括對(duì)象的數(shù)據(jù),以及對(duì)象類型的信息和存儲(chǔ)在對(duì)象中的數(shù)據(jù)類型。因此,序列化可以看做是平面化對(duì)象為了存儲(chǔ)到磁盤中,方便后面讀取和重新配置的一種方式。反序列化是一種從平面化狀態(tài)到活躍狀態(tài)的一種轉(zhuǎn)換對(duì)象的逆過程。Servlets91.什么是Servlet?

servlet是用來處理客戶端請(qǐng)求并生成動(dòng)態(tài)web內(nèi)容的Java程序語言類。Servlets大多是用來處理或者存儲(chǔ)HTML表單提交的數(shù)據(jù),提供動(dòng)態(tài)內(nèi)容和管理那些不在HTTP無狀態(tài)協(xié)議中的狀態(tài)信息。92.解釋一個(gè)Servlet的架構(gòu).

核心抽象概念肯定是所有servlet必須實(shí)現(xiàn)

javax.servlet.Servlet接口。每個(gè)servlet必須直接或者間接實(shí)現(xiàn)這個(gè)接口,也可以繼承于javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后想提的是,每個(gè)servlet能夠使用多線程服務(wù)多個(gè)請(qǐng)求。93.一個(gè)Applet和一個(gè)Servlet區(qū)別是什么?

一個(gè)Applet是一個(gè)跑在客戶機(jī)器的網(wǎng)頁瀏覽器里面的客戶端java程序。相反,一個(gè)servlet是跑在網(wǎng)頁服務(wù)器的服務(wù)的容器。一個(gè)

applet能使用用戶界面class,而一個(gè)servlet不能夠有一個(gè)用戶界面。相反,一個(gè)servlet等待客戶端的HTTP請(qǐng)求并為每一個(gè)請(qǐng)求生成一個(gè)響應(yīng)。94.GenericServlet和HttpServlet的區(qū)別是什么?

GenericServlet是一個(gè)實(shí)現(xiàn)了Servlet和ServletConfig

接口的通用的協(xié)議無關(guān)的

servlet.那些繼承于GenericServlet類的servlet將重寫service方法。最后想提的是,為了給Web用戶開發(fā)一個(gè)使用HTTP協(xié)議服務(wù)的HTTPservlet,你的

servlet必須改為繼承于HttpServlet。查看Servlet的示例

。95.解釋一個(gè)Servlet的生命周期.對(duì)每一個(gè)客戶端的請(qǐng)求,這個(gè)Servlet引擎加載servlet和調(diào)用它的init方法,以便在servlet初始化。然后,Servlet對(duì)象處理所有從客戶端來的后續(xù)請(qǐng)求,通過為每個(gè)請(qǐng)求單獨(dú)調(diào)用服務(wù)的方法。最后,該servlet調(diào)用服務(wù)器的destroy方法。96.doGet()和doPost()之間的區(qū)別是什么?doGet

:GET方法附加請(qǐng)求的URL的名稱-值對(duì)。因此,存在客戶端的請(qǐng)求字符數(shù)量的限制。此外,該請(qǐng)求的參數(shù)值為可見,因此,如果有敏感信息不能采用這種方式。

doPost:POST方法克服了GET請(qǐng)求的限制,將發(fā)送請(qǐng)求的值置于body里。此外,發(fā)送值的數(shù)量沒有限制。最后,通過POST請(qǐng)求傳遞的敏感信息是不可見的。97.web應(yīng)用是什么?

web應(yīng)用是web服務(wù)的延伸.主要有兩種類型:面向視覺的和面向服務(wù)的.面向視覺型的應(yīng)用通過編輯語言來動(dòng)態(tài)展示交互頁面.面向應(yīng)用的則提供了后端的service.總的來說,就是一堆置于

server'sURL明明空間下的servlets.98.什么是服務(wù)端包含(SSI)?

服務(wù)端包含是服務(wù)端的一種簡(jiǎn)單腳本語言,主要應(yīng)用在Web方面,置于servlet標(biāo)簽中.最常用的地方就是在網(wǎng)頁中引入一個(gè)或多個(gè)文件.當(dāng)瀏覽器加載頁面時(shí),使用servlet產(chǎn)生的超文本替換其標(biāo)簽.99.什么是Servlet鏈?

Servlet鏈?zhǔn)侵笇⑸弦粋€(gè)servlet的結(jié)果傳到下一個(gè).第二個(gè)的結(jié)構(gòu)又可以傳到第三個(gè).最后的servlet負(fù)責(zé)將響應(yīng)回復(fù)給客戶端.100.如何知道請(qǐng)求servlet的客戶端信息?

ServletRequest類可以獲取客戶端的IP地址或主機(jī)名.getRemoteAddr()獲取IPgetRemoteHost()獲取主機(jī)名.示例如下here.101.Httpresponse的結(jié)構(gòu)是什么?

HTTPresponse包括了三個(gè)部分:StatusCode:描述了這次回應(yīng)的狀況.它可以用來檢查這次請(qǐng)求是否成功完成.一旦請(qǐng)求失敗了,這個(gè)statuscode可以用來尋找原因.如果你的servlet沒有返回一個(gè)statuscode,默認(rèn)就會(huì)返回成功的statuscode,HttpServletResponse.SC_OK.HTTPHeaders:它包含了response的更多信息.舉個(gè)例子,headers可以反應(yīng)response的訪問date/time,或者是用于將實(shí)體安全地傳送到用戶的編碼形式??梢蚤喿x

howtoretrieveheadersinServlethere.Body:它是response的具體內(nèi)容.可能包括HTML內(nèi)容,比如圖片。Body包括了緊接Header發(fā)送的HTTP事務(wù)消息數(shù)據(jù)字節(jié)。102.什么是cookie?session和cookie之間的區(qū)別是什么?

Cookie是Web服務(wù)器發(fā)送到瀏覽器的一小塊信息,瀏覽器為每個(gè)Web服務(wù)器在本地文件中存儲(chǔ)cookie。在以后的請(qǐng)求里,瀏覽器對(duì)特定的Web服務(wù)器,將request和所有特定的Web服務(wù)器的cookie一起發(fā)送。Session和Cookie之間的區(qū)別如下:Session無論在客戶端瀏覽器的設(shè)置都可以工作。客戶端可以選擇禁用cookies。然而,Session仍然可以工作,因?yàn)榭蛻舳藳]有能力在服務(wù)器端禁用Session。Session和cookie也t有不同的信息存儲(chǔ)量。HTTP會(huì)話能夠存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論