java 面經

一、什麼是Java虛擬機(JVM)?爲何Java被稱做是「平臺無關的編程語言」?java

Java虛擬機是一個能夠執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。程序員

java的跨平臺不是java源程序的跨平臺 ,若是是這樣,那麼因此語言都是跨平臺的, java源程序先通過javac編譯器編譯成二進制的.class字節碼文件(java的跨平臺指的就是.class字節碼文件的跨平臺,.class字節碼文件是與平臺無關的),.class文件再運行在jvm上,java解釋器(jvm的一部分)會將其解釋成對應平臺的機器碼執行,因此java所謂的跨平臺就是在不一樣平臺上安裝了不一樣的jvm,而在不一樣平臺上生成的.class文件都是同樣的,而.class文件再由對應平臺的jvm解釋成對應平臺的機器碼執行。 最後解釋下機器碼和字節碼的區別: 一,機器碼,徹底依附硬件而存在~而且不一樣硬件因爲內嵌指令集不一樣,即便相同的0 1代碼 意思也多是不一樣的~換句話說,根本不存在跨平臺性~好比~不一樣型號的CPU,你給他個指令10001101,他們可能會解析爲不一樣的結果~ 二,咱們知道JAVA是跨平臺的,爲何呢?由於他有一個jvm,不論哪一種硬件,只要你裝有jvm,那麼他就認識這個JAVA字節碼~~~~至於底層的機器碼,咱不用管,有jvm搞定,他會把字節碼再翻譯成所在機器認識的機器碼~~~web

 

 

 

 

 

 

 

 

 

 

二、JDK和JRE的區別是什麼?算法

Java運行時環境(JRE)。它包括Java虛擬機、Java核心類庫和支持文件。它不包含開發工具(JDK)--編譯器、調試器和其餘工具。
Java開發工具包(JDK)是完整的Java軟件開發包,包含了JRE,編譯器和其餘的工具(好比:JavaDoc,Java調試器),可讓開發者開發、編譯、執行Java應用程序。
 
三、」static」關鍵字是什麼意思?Java中是否能夠覆蓋(override)一個private或者是sta「static」關鍵字代表一個成員變量或者是成員方法能夠在沒有所屬的類的實例變量的狀況下被訪問。
Java中static方法不能被覆蓋,由於方法覆蓋是基於運行時動態綁定的,而static方法是編譯時靜態綁定的。static方法跟類的任何實例都不相關,因此概念上不適用。
java中也不能夠覆蓋private的方法,由於private修飾的變量和方法只能在當前類中使用,若是是其餘的類繼承當前類是不能訪問到private變量或方法的,固然也不能覆蓋。
 
四、Java支持的數據類型有哪些?什麼是自動拆裝箱?
Java語言支持的8種基本數據類型是:
byte
short
int
long
float
double
boolean
char
自動裝箱是Java編譯器在基本數據類型和對應的對象包裝類型之間作的一個轉化。好比:把int轉化成Integer,double轉化成Double,等等。反之就是自動拆箱。
 Java支持的數據類型包括兩種:一種是基本數據類型,包含byte,char,short, boolean ,int , long, float,double;另外一種是引用類型:如String等,實際上是對象的引用,JVM中虛擬棧中存的是對象的地址,建立的對象實質在堆中,經過地址來找到堆中的對象的過程,即爲引用類型。自動裝箱就是Java編譯器在基本數據類型和對應的對象包裝類型間的轉化,即int轉化爲Integer,自動拆箱是Integer調用其方法將其轉化爲int的過程
 
五、接口和抽象類的區別是什麼?
Java提供和支持建立抽象類和接口。它們的實現有共同點,不一樣點在於:
接口中全部的方法隱含的都是抽象的。而抽象類則能夠同時包含抽象和非抽象的方法。
類能夠實現不少個接口,可是隻能繼承一個抽象類
類能夠不實現抽象類和接口聲明的全部方法,固然,在這種狀況下,類也必須得聲明成是抽象的。
抽象類能夠在不提供接口方法實現的狀況下實現接口。
Java接口中聲明的變量默認都是final的。抽象類能夠包含非final的變量。
Java接口中的成員函數默認是public的。抽象類的成員函數能夠是private,protected或者是public。
接口是絕對抽象的,不能夠被實例化,抽象類也不能夠被實例化。
也能夠參考JDK8中抽象類和接口的區別
 
六、進程和線程的區別是什麼?
進程是執行着的應用程序,而線程是進程內部的一個執行序列。一個進程能夠有多個線程。線程又叫作輕量級進程。

線程與進程的區別概括:sql

a.地址空間和其它資源:進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。數據庫

b.通訊:進程間通訊IPC,線程間能夠直接讀寫進程數據段(如全局變量)來進行通訊——須要進程同步和互斥手段的輔助,以保證數據的一致性。編程

c.調度和切換:線程上下文切換比進程上下文切換要快得多。數組

d.在多線程OS中,進程不是一個可執行的實體。瀏覽器

 

七、建立線程有幾種不一樣的方式?你喜歡哪種?爲何?安全

有4種方式能夠用來建立線程:
繼承Thread類
實現Runnable接口
應用程序可使用Executor框架來建立線程池

實現Callable接口

實現Runnable接口這種方式更受歡迎,由於這不須要繼承Thread類。在應用設計中已經繼承了別的對象的狀況下,這須要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是很是高效的,很容易實現和使用。
 

八、歸納的解釋下線程的幾種可用狀態。

1. 新建( new ):新建立了一個線程對象。
2. 可運行( runnable ):線程對象建立後,其餘線程(好比 main 線程)調用了該對象 的 start ()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲 取 cpu 的使用權 。
3. 運行( running ):可運行狀態( runnable )的線程得到了 cpu 時間片( timeslice ) ,執行程序代碼。
4. 阻塞( block ):阻塞狀態是指線程由於某種緣由放棄了 cpu 使用權,也即讓出了 cpu timeslice ,暫時中止運行。直到線程進入可運行( runnable )狀態,纔有 機會再次得到 cpu timeslice 轉到運行( running )狀態。阻塞的狀況分三種:
(一). 等待阻塞:運行( running )的線程執行 o . wait ()方法, JVM 會把該線程放 入等待隊列( waitting queue )中。
(二). 同步阻塞:運行( running )的線程在獲取對象的同步鎖時,若該同步鎖 被別的線程佔用,則 JVM 會把該線程放入鎖池( lock pool )中。
(三). 其餘阻塞: 運行( running )的線程執行 Thread . sleep ( long ms )或 t . join ()方法,或者發出了 I / O 請求時, JVM 會把該線程置爲阻塞狀態。            當 sleep ()狀態超時、 join ()等待線程終止或者超時、或者 I / O 處理完畢時,線程從新轉入可運行( runnable )狀態。
5. 死亡( dead ):線程 run ()、 main () 方法執行結束,或者因異常退出了 run ()方法,則該線程結束生命週期。死亡的線程不可再次復生。
 
 
九、同步方法和同步代碼塊的區別是什麼?
區別:
同步方法默認用this或者當前類class對象做爲鎖;
同步代碼塊能夠選擇以什麼來加鎖,比同步方法要更細顆粒度,咱們能夠選擇只同步會發生同步問題的部分代碼而不是整個方法;
同步方法使用關鍵字 synchronized修飾方法,而同步代碼塊主要是修飾須要進行同步的代碼,用   synchronized(object){代碼內容}進行修飾;
 
十、在監視器(Monitor)內部,是如何作線程同步的?程序應該作哪一種級別的同步?
監視器和鎖在Java虛擬機中是一塊使用的。監視器監視一塊同步代碼塊,確保一次只有一個線程執行同步代碼塊。每個監視器都和一個對象引用相關聯。線程在獲取鎖以前不容許執行同步代碼。
 
十一、什麼是死鎖(deadlock)?
死鎖 :是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種 互相等待的現象,若無 外力做用,它們都將沒法推動下去
(1) 由於系統資源不足。
(2) 進程運行推動順序不合適。
(3) 資源分配不當等。
若是系統資源充足,進程的資源請求都可以獲得知足,死鎖出現的可能性就很低,不然
就會因爭奪有限的資源而陷入死鎖。其次,進程運行推動順序與速度不一樣,也可能產生死鎖。
 
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。
(3) 不剝奪條件:進程已得到的資源,在末使用完以前,不能強行剝奪。
(4) 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不知足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的緣由,尤爲是產生死鎖的四個必要條件,就能夠最大可能地避免、預防和
解除死鎖。因此,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態
的狀況下佔用資源。所以,對資源的分配要給予合理的規劃。

 

十二、如何確保N個線程能夠訪問N個資源同時又不致使死鎖?

使用多線程的時候,一種很是簡單的避免死鎖的方式就是:指定獲取鎖的順序,並強制線程按照指定的順序獲取鎖。所以,若是全部的線程都是以一樣的順序加鎖和釋放鎖,就不會出現死鎖了。

 

1三、Java集合類框架的基本接口有哪些?

集合類接口指定了一組叫作元素的對象。集合類接口的每一種具體的實現類均可以選擇以它本身的方式對元素進行保存和排序。有的集合類容許重複的鍵,有些不容許。
Java集合類提供了一套設計良好的支持對一組對象進行操做的接口和類。Java集合類裏面最基本的接口有:
Collection:表明一組對象,每個對象都是它的子元素。
Set:不包含重複元素的Collection。
List:有順序的collection,而且能夠包含重複元素。
Map:能夠把鍵(key)映射到值(value)的對象,鍵不能重複。

 

1四、什麼是迭代器(Iterator)?

Iterator接口提供了不少對集合元素進行迭代的方法。每個集合類都包含了能夠返回迭代器實例的

迭代方法。迭代器能夠在迭代的過程當中刪除底層集合的元素,可是不能夠直接調用集合的
remove(Object Obj)刪除,能夠經過迭代器的remove()方法刪除。
 
 
1五、快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什麼?

一:快速失敗(fail—fast)

          在用迭代器遍歷一個集合對象時,若是遍歷過程當中對集合對象的結構進行了修改(增長、刪除),則會拋出Concurrent Modification Exception。

          原理:迭代器在遍歷時直接訪問集合中的內容,而且在遍歷過程當中使用一個 modCount 變量。集合在被遍歷期間若是結構發生變化,就會改變modCount的值。每當迭代器使用hashNext()/next()遍歷下一個元素以前,都會檢測modCount變量是否爲expectedmodCount值,是的話就返回遍歷;不然拋出異常,終止遍歷。

      注意:這裏異常的拋出條件是檢測到 modCount!=expectedmodCount 這個條件。若是集合發生變化時修改modCount值恰好又設置爲了expectedmodCount值,則異常不會拋出。所以,不能依賴於這個異常是否拋出而進行併發操做的編程,這個異常只建議用於檢測併發修改的bug。

      場景:java.util包下的集合類都是快速失敗的,不能在多線程下發生併發修改(迭代過程當中被修改)。

    二:安全失敗(fail—safe)

      採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容,在拷貝的集合上進行遍歷。

      原理:因爲迭代時是對原集合的拷貝進行遍歷,因此在遍歷過程當中對原集合所做的修改並不能被迭代器檢測到,因此不會觸發Concurrent Modification Exception。

      缺點:基於拷貝內容的優勢是避免了Concurrent Modification Exception,但一樣地,迭代器並不能訪問到修改後的內容,即:迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝,在遍歷期間原集合發生的修改迭代器是不知道的。

          場景:java.util.concurrent包下的容器都是安全失敗,能夠在多線程下併發使用,併發修改。

 

1六、Java中的HashMap的工做原理是什麼?

Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。HashMap須要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,而後把鍵值對存儲在集合中合適的索引上。若是key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。

 

1六、HashMap和Hashtable有什麼區別?

HashMap和Hashtable都實現了Map接口,所以不少特性很是類似。可是,他們有如下不一樣點:
HashMap容許鍵和值是null,而Hashtable不容許鍵或者值是null。
Hashtable是同步的,而HashMap不是。所以,HashMap更適合於單線程環境,而Hashtable適合於多線程環境。
HashMap提供了可供應用迭代的鍵的集合,所以,HashMap是快速失敗的。另外一方面,Hashtable提供了對鍵的列舉(Enumeration)。
通常認爲Hashtable是一個遺留的類。

 

1七、數組(Array)和列表(ArrayList)有什麼區別?何時應該使用Array而不是ArrayList?

下面列出了Array和ArrayList的不一樣點:
Array能夠包含基本類型和對象類型,ArrayList只能包含對象類型。
Array大小是固定的,ArrayList的大小是動態變化的。
ArrayList提供了更多的方法和特性,好比:addAll(),removeAll(),iterator()等等。
對於基本類型數據,集合使用自動裝箱來減小編碼工做量。可是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

 

1八、ArrayList和LinkedList有什麼區別?

ArrayList和LinkedList都實現了List接口,他們有如下的不一樣點:
ArrayList是基於索引的數據接口,它的底層是數組。它能夠以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每個元素都和它的前一個和後一個元素連接在一塊兒,在這種狀況下,查找某個元素的時間複雜度是O(n)。
相對於ArrayList,LinkedList的插入,添加,刪除操做速度更快,由於當元素被添加到集合任意位置的時候,不須要像數組那樣從新計算大小或者是更新索引。
LinkedList比ArrayList更佔內存,由於LinkedList爲每個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
也能夠參考ArrayList vs. LinkedList。

 

1九、Comparable和Comparator接口是幹什麼的?列出它們的區別。

Comparable & Comparator 都是用來實現集合中元素的比較、排序的,只是 Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,因此,如想實現排序,就須要在集合外定義 Comparator 接口的方法或在集合內實現 Comparable 接口的方法。 Comparator位於包java.util下,而Comparable位於包 java.lang下 Comparable 是一個對象自己就已經支持自比較所須要實現的接口(如 String、Integer 本身就能夠完成比較大小操做,已經實現了Comparable接口) 自定義的類要在加入list容器中後可以排序,能夠實現Comparable接口,在用Collections類的sort方法排序時,若是不指定Comparator,那麼就以天然順序排序, 這裏的天然順序就是實現Comparable接口設定的排序方式。 而 Comparator 是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能知足你的要求時,你能夠寫一個比較器來完成兩個對象之間大小的比較。 能夠說一個是自已完成比較,一個是外部程序實現比較的差異而已。 用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行爲。 好比:你想對整數採用絕對值大小來排序,Integer 是不符合要求的,你不須要去修改 Integer 類(實際上你也不能這麼作)去改變它的排序行爲,只要使用一個實現了 Comparator 接口的對象來實現控制它的排序就好了
 
20、什麼是Java優先級隊列(Priority Queue)?
PriorityQueue是一個基於優先級堆的無界隊列,它的元素是按照天然順序(natural order)排序的。在建立的時候,咱們能夠給它提供一個負責給元素排序的比較器。PriorityQueue不容許null值,由於他們沒有天然順序,或者說他們沒有任何的相關聯的比較器。最後,PriorityQueue不是線程安全的,入隊和出隊的時間複雜度是O(log(n))。
 
2一、Enumeration接口和Iterator接口的區別有哪些?
Enumeration速度是Iterator的2倍,同時佔用更少的內存。可是,Iterator遠遠比Enumeration安全,由於其餘線程不可以修改正在被iterator遍歷的集合裏面的對象。同時,Iterator容許調用者刪除底層集合裏面的元素,這對Enumeration來講是不可能的。
 
2二、HashSet和TreeSet有什麼區別?
HashSet是由一個hash表來實現的,所以,它的元素是無序的。add(),remove(),contains()方法的時間複雜度是O(1)。
另外一方面,TreeSet是由一個樹形的結構來實現的,它裏面的元素是有序的。所以,add(),remove(),contains()方法的時間複雜度是O(logn)。
 
2三、Java中垃圾回收有什麼目的?何時進行垃圾回收?
垃圾回收是在內存中存在沒有引用的對象或超過做用域的對象時進行。
垃圾回收的目的是識別而且丟棄應用再也不使用的對象來釋放和重用資源。
 
2四、System.gc()和Runtime.gc()會作什麼事情?
這兩個方法用來提示JVM要進行垃圾回收。可是,當即開始仍是延遲進行垃圾回收是取決於JVM的。
 
2五、inalize()方法何時被調用?析構函數(finalization)的目的是什麼?
垃圾回收器(garbage collector)決定回收某對象時,就會運行該對象的finalize()方法 可是在Java中很不幸,若是內存老是充足的,那麼垃圾回收可能永遠不會進行,也就是說filalize()可能永遠不被執行,顯然期望它作收尾工做是靠不住的。 那麼finalize()到底是作什麼的呢?它最主要的用途是回收特殊渠道申請的內存。Java程序有垃圾回收器,因此通常狀況下內存問題不用程序員操心。但有一種JNI(Java Native Interface)調用non-Java程序(C或C++),finalize()的工做就是回收這部分的內存。
 
2六、若是對象的引用被置爲null,垃圾收集器是否會當即釋放對象佔用的內存?
不會,在下一個垃圾回收週期中,這個對象將是可被回收的。
 
2六、Java堆的結構是什麼樣子的?什麼是堆中的永久代(Perm Gen space)?
JVM的堆是運行時數據區,全部類的實例和數組都是在堆上分配內存。它在JVM啓動的時候被建立。對象所佔的堆內存是由自動內存管理系統也就是垃圾收集器回收。
堆內存是由存活和死亡的對象組成的。存活的對象是應用能夠訪問的,不會被垃圾回收。死亡的對象是應用不可訪問尚且尚未被垃圾收集器回收掉的對象。一直到垃圾收集器把這些對象回收掉以前,他們會一直佔據堆內存空間。
 
永久代是用於存放靜態文件,如Java類、方法等。持久代對垃圾回收沒有顯著影響,可是有些應用可能動態生成或者調用一些class,例如Hibernate 等,在這種時候須要設置一個比較大的持久代空間來存放這些運行過程當中新增的類,永久代中通常包含:

類的方法(字節碼...)

類名(Sring對象)

.class文件讀到的常量信息

class對象相關的對象列表和類型列表 (e.g., 方法對象的array).

JVM建立的內部對象

JIT編譯器優化用的信息

 

 

2七、串行(serial)收集器和吞吐量(throughput)收集器的區別是什麼?

吞吐量收集器使用並行版本的新生代垃圾收集器,它用於中等規模和大規模數據的應用程序。而串行收集器對大多數的小應用(在現代處理器上須要大概100M左右的內存)就足夠了。

 

2八、在Java中,對象何時能夠被垃圾回收?

當對象對當前使用這個對象的應用程序變得不可觸及的時候,這個對象就能夠被回收了。

 

2九、Java中的兩種異常類型是什麼?他們有什麼區別?

Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常。不受檢查的異常不須要在方法或者是構造函數上聲明,就算方法或者是構造函數的執行可能會拋出這樣的異常,而且不受檢查的異常能夠傳播到方法或者是構造函數的外面。相反,受檢查的異常必需要用throws語句在方法或者是構造函數上聲明。這裏有Java異常處理的一些小建議。

 

30、Java中Exception和Error有什麼區別?

Exception和Error都是Throwable的子類。Exception用於用戶程序能夠捕獲的異常狀況。Error定義了不指望被用戶程序捕獲的異常。

 

3一、throw和throws有什麼區別?

一、Throw用於方法內部,Throws用於方法聲明上
二、Throw後跟異常對象,Throws後跟異常類型
三、Throw後只能跟一個異常對象,Throws後能夠一次聲明多種異常類型
 
 
3二、異常處理完成之後,Exception對象會發生什麼變化?
Exception對象會在下一個垃圾回收過程當中被回收掉。
 
3三、finally代碼塊和finalize()方法有什麼區別?
不管是否拋出異常,finally代碼塊都會執行,它主要是用來釋放應用佔用的資源。finalize()方法是Object類的一個protected方法,它是在對象被垃圾回收以前由Java虛擬機來調用的。
 
3四、什麼是JDBC?
JDBC(Java DataBase Connectivity),是一套面向對象的應用程序接口(API),制定了統一的訪問各種關係數據庫的標準接口,爲各個數據庫廠商提供了標準的實現。經過JDBC技術,開發人員能夠用純Java語言和標準的SQL語句編寫完整的數據庫應用程序,而且真正地實現了軟件的跨平臺性。
一般狀況下使用JDBC完成如下操做:
1.同數據庫創建鏈接;
2.向數據庫發送SQL語句;
3.處理從數據庫返回的結果;
JDBC具備下列優勢:
1.JDBC與ODBC(Open Database Connectivity,即開放數據庫互連)十分類似,便於軟件開發人員理解;
2.JDBC使軟件開發人員從複雜的驅動程序編寫工做中解脫出來,能夠徹底專一於業務邏輯開發;
3.JDBC支持多種關係型數據庫,大大增長了軟件的可移植性;
4.JDBC API是面向對象的,軟件開發人員能夠將經常使用的方法進行二次封裝,從而提升代碼的重用性;
 
3五、解釋下驅動(Driver)在JDBC中的角色。
JDBC驅動提供了特定廠商對JDBC API接口類的實現,驅動必需要提供java.sql包下面這些類的實現:Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver。
在使用jdbc前,應該保證相應的Driver類已經被加載到jvm中,而且完成了類的初始化工做就好了
 
 
3六、Class.forName()方法有什麼做用?

 初始化參數指定的類,而且返回此類對應的Class 對象

 

3七、數據庫鏈接池是什麼意思?

數據庫鏈接的創建、關閉資源消耗巨大。 傳統數據庫訪問方式:一次數據訪問對應一個物理鏈接,每次操做數據庫都要打開關閉該物理鏈接,系統性能嚴重受損。 解決方案:數據庫鏈接池。系統初始運行時,主動創建足夠足夠的鏈接,組成一個池,每次應用程序請求數據庫鏈接時,無需從新打開鏈接,而是從池中取出已有的鏈接,使用完後,再也不關閉,而是歸還。

 

3八、什麼是Servlet?

Servlet是用來處理客戶端請求併產生動態網頁內容的Java類。Servlet主要是用來處理或者是存儲HTML表單提交的數據,產生動態內容,在無狀態的HTTP協議下管理狀態信息。

 

3九、說一下Servlet的體系結構。

全部的Servlet都必需要實現的核心的接口是javax.servlet.Servlet。每個Servlet都必需要直接或者是間接實現這個接口,或者是繼承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最後,Servlet使用多線程能夠並行的爲多個請求服務。

 

40、解釋下Servlet的生命週期。

Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求後:
①Web服務器首先檢查是否已經裝載並建立了該Servlet的實例對象。若是是,則直接執行第④步,不然,執行第②步。
②裝載並建立該Servlet的一個實例對象。 
③調用Servlet實例對象的init()方法。
④建立一個用於封裝HTTP請求消息的HttpServletRequest對象和一個表明HTTP響應消息的HttpServletResponse對象,而後調用Servlet的service()方法並將請求和響應對象做爲參數傳遞進去。
⑤WEB應用程序被中止或從新啓動以前,Servlet引擎將卸載Servlet,並在卸載以前調用Servlet的destroy()方法。

 

4一、如何知道是哪個客戶端的機器正在請求你的Servlet?

ServletRequest類能夠找出客戶端機器的IP地址或者是主機名。getRemoteAddr()方法獲取客戶端主機的IP地址,getRemoteHost()能夠獲取主機名。

 

4二、HTTP響應的結構是怎麼樣的?

HTTP響應由三個部分組成:
狀態碼(Status Code):描述了響應的狀態。能夠用來檢查是否成功的完成了請求。請求失敗的狀況下,狀態碼可用來找出失敗的緣由。若是Servlet沒有返回狀態碼,默認會返回成功的狀態碼HttpServletResponse.SC_OK。
HTTP頭部(HTTP Header):它們包含了更多關於響應的信息。好比:頭部能夠指定認爲響應過時的過時日期,或者是指定用來給用戶安全的傳輸實體內容的編碼格式。如何在Serlet中檢索HTTP的頭部看這裏。
主體(Body):它包含了響應的內容。它能夠包含HTML代碼,圖片,等等。主體是由傳輸在HTTP消息中緊跟在頭部後面的數據字節組成的。

 

4三、什麼是cookie?session和cookie有什麼區別?

cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶的狀態,就使用response向客戶端瀏覽器頒發一個cookie。客戶端瀏覽器會把cookie保存起來。當瀏覽器再次請求該網站時,瀏覽器就會把請求地址和cookie一同給服務器。服務器檢查該cookie,從而判斷用戶的狀態。服務器還能夠根據須要修改cookie的內容。 session是另外一種記錄客戶狀態的機制。不一樣的是cookie保存在客戶端瀏覽器中,而session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是session。客戶端瀏覽器再次訪問時只須要從該session中查找該客戶的狀態就能夠了。 若是說cookie機制是經過檢查客戶身上的「通訊證」,那麼session機制就是經過檢查服務器上的「客戶明細表」來確認客戶身份。

 

4四、什麼是HTTP隧道?

HTTP隧道是一種利用HTTP或者是HTTPS把多種網絡協議封裝起來進行通訊的技術。所以,HTTP協議扮演了一個打通用於通訊的網絡協議的管道的包裝器的角色。把其餘協議的請求掩蓋成HTTP的請求就是HTTP隧道。

 

4五、sendRedirect()和forward()方法有什麼區別?
forward是服務器內部的跳轉,瀏覽器的地址欄不會發生變化,同時能夠把request和response傳遞給後一個請求。sendRedirect()是瀏覽器方面的跳轉,要發送兩次請求,地址欄也會發生變化,同時request和response也會發生變化,從新生成新的對象。

 

4六、什麼是URL編碼和URL解碼?

URL編碼是負責把URL裏面的空格和其餘的特殊字符替換成對應的十六進制表示,反之就是解碼。

 

4七、面向對象軟件開發的優勢有哪些?

代碼開發模塊化,更易維護和修改。
代碼複用。
加強代碼的可靠性和靈活性。
增長代碼的可理解性。
面向對象編程有不少重要的特性,好比:封裝,繼承,多態和抽象。

 

4八、封裝的定義和好處有哪些?

一是用private把類的細節與外界隔離起來,從而實現數據項和方法的隱藏,而要訪問這些數據項和方法惟一的途徑就是經過類自己,類纔有資格調用它所擁有的資源(方法,數據項屬性等等)。因此第一個好處就是數據的安全性提升了。

二是經過隱藏隔離,只容許外部對類作有限的訪問,開發者能夠自由的改變類的內部實現,而無需修改使用該類的那些程序。只要那些在類外部就能被調用的方法保持其外部特徵不變,內部代碼就能夠自由改變,各取所需,利於分工。

三就是提升了代碼的重用性,封裝成工具類之後可以減小不少繁瑣的步驟。
 
 
4九、多態的定義?
多態:相同類型的引用變量,調用同一個方法時呈現出多種不一樣的行爲特徵。
對象的實例變量不具有多態性。
Java引用變量有兩個類型:編譯時類型,運行時類型
編譯時類型由聲明該變量時使用的類型決定
運行時類型由實際賦給該變量的對象決定
若是編譯時類型和運行時類型不一致,就可能出現多態(Polymorphism)
 
 
50、抽象的定義?抽象和封裝的不一樣點?
抽象:就是把現實生活中的某一類東西提取出來,用程序代碼表示,咱們一般叫作類或者接口。抽象包括兩個方面:一個是數據抽象,一個是過程抽象。數據抽象也就是對象的屬性。過程抽象是對象的行爲特徵。
封裝:把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行封裝隱藏。封裝分爲屬性的封裝和方法的封裝。
相關文章
相關標籤/搜索