1. 程式人生 > >java基礎面試題(二)

java基礎面試題(二)

1、JDK和JRE的區別?

java執行時的環境(JRE)是將要執行java的java虛擬機器。他同時包含了執行applet需要的瀏覽器外掛。java開發工具包(JDK)是完整的java軟體開發包。包含了JRE、編譯器、和其他的工具,可以讓開發者開發。編譯、執行java應用程式;

2、什麼是java虛擬機器?

java虛擬機器是一個可以執行java位元組碼的虛擬機器程序。

3、為什麼java被成為“與平臺無關的程式語言”?

因為java虛擬機器知道底層硬體平臺的指令長度和其他特性;

4、是否可以在static環境中訪問非static變數?

不可以,static變數是屬於類的,在任何例項中的值是一樣的,如果不用例項來訪問非static變數,編譯會報錯。

5、什麼是值傳遞和引用傳遞?

值傳遞:可以理解為傳遞的是一個物件的副本,對這個副本做出改變,不會影響到原物件。

引用傳遞:傳遞的是物件的引用,外部對引用物件的改變會影響到所有物件上;

6、程序和執行緒有什麼區別?

程序是執行著的應用程式,而執行緒是程序內部的一個執行序列。一個程序可以有多個執行緒。執行緒又叫輕量級程序;

7、 建立執行緒有幾種方式?

三種。繼承Thread類、實現Runnable介面、應用程式可以使用Executor框架來建立執行緒池。

實現Runnable介面的這種方式更受歡迎,因為不需要繼承類,因為java只能單繼承。如果繼承了Thread

類就不能繼承別的了。執行緒池的效率也非常高,很容易實現和使用。

8、概括和解釋下執行緒的幾種可用狀態?

就緒(Runnable):執行緒準備執行,不一定立馬就能開始執行。

執行中(Running):程序正在執行執行緒的程式碼。

等待中(Waiting):執行緒處於阻塞狀態,等待外部的處理結束;

睡眠中(Sleeping):執行緒被強制睡眠;

I/O阻塞(Blocked on I/O):等待I/O操作完成。

同步阻塞(Blocked on Synchronization):等待獲取鎖;

死亡(Dead):執行緒完成執行;

9、什麼是死鎖(deadlock)?

兩個程序都在等待對方執行完畢後執行,這個時候就發生了死鎖。結果就是兩個程序都陷入了無限的等待中。

10、如何確保N個執行緒可以訪問N個資源的同時又不導致死鎖?

指定獲取鎖的順序,並強制執行緒按照指定的順序去獲取鎖,因為,如果所有的執行緒都以同樣的順序來加鎖和釋放鎖,

就不會出現死鎖。

11、HashMap和Hashtable的區別?

不同點:HashMap允許鍵和值為null而Hashtable不允許鍵或值為null、Hashtable是同步的,而HashMap不是,

因此HashMap適合單執行緒而Hashtable適合多執行緒、HashMap提供了可供應用的迭代的鍵的集合,Hashtable提供了

對鍵的列舉;

12、陣列(Array)和集合(ArrayList)有什麼區別?什麼時候該用Array而不是ArrayList?

陣列和集合的不同點:

Array可以包含基本型別和物件型別、ArrayList只能包含物件型別;

Array大小事固定的,ArrayList大小事動態變化的;

ArrayList提供了更多的方法和特性,如:addAll(),removeAll(),iteratot()等了;

對於基本型別資料,集合使用自動裝箱來減少編碼工作量 。

13、ArrayList和LinkedList有什麼區別?

ArrayList是基於索引的資料介面,它的底層是陣列。LinkedList是以元素列表形式儲存他的資料,每一個元素

都是和它前一個和後一個連結在一起的。

相對於ArrayList,LinkedList的插入,新增、刪除操作速度更快,因為元素被新增到集合任意位置的時候,

不需要像陣列那樣重新計算大小和更新索引。

LinkedList比ArrayLList更佔用記憶體

14、Comparable和Comparator介面是幹什麼的?有何區別?

java提供了只包含compareTo()方法的Comparable介面,這個方法用來給兩個物件排序。返回負數、0、正數

表示< 、 = 、 > ;

java提供了包含compare()和equrals()方法的Comparator介面。compare()方法用來排序,equrals()方法

用來比較傳入的引數是否和comparator相等。

15、什麼是Java堆?

JVM的堆是執行時資料區,所有類的例項和陣列都在堆上分配記憶體,它在jvm啟動的時候建立。堆記憶體是由存活物件

和死亡物件組成的,存活物件是應用可以訪問的,死亡物件是不可被訪問但尚未被垃圾收集器回收的物件,一直到垃圾回收

把這些物件回收掉之前,他們會一直佔用堆的記憶體。

16、java中,物件什麼時候可以被垃圾回收?

當物件對當前使用這個物件的應用程式變的不可觸及的時候,這個物件就可以被回收。也就是無法再呼叫的物件。

17、throw和throws的區別?

throw是針對物件的,在程式碼塊內的,即捕獲方法內的異常並丟擲。

throws是針對方法的,即方法的異常資訊丟擲。

可以理解為throw是主動的,在方法內主動捕獲並丟擲,throws是被動的,在方法上沒有捕獲異常處理,直接throws的。

18、什麼是JDBC?

JDBC是允許使用者在不同資料庫之間進行選擇的一個抽象層,JDBC允許開發者用java寫資料庫應用程式,

而不需要關心底層特定的資料庫的細節。

19、解釋下驅動(Driver)在JDBC中的角色?

JDBC驅動提供了特定廠商對JDBC API介面類的實現,驅動必須要提供java.sql包下面這些類的實現:

Connection、Statement、PreparedStatement、CallableStatement、ResultSet、Driver。

20、Class.forName()方法有什麼作用?

這個方法用來載入跟資料庫建立連線的驅動。

21、PreparedStatement比Statement有什麼優勢?

預編譯、效能好、可以重用。

22、什麼事資料庫連線池?

 在應用伺服器啟動的時候建立很多個數據庫連線,並維護在一個池中,連線請求由池中的連線提供,

使用完畢後返回給池中,以用於將來滿足更多的請求。

23、什麼是Servlet?

Servlet是用來處理客戶端請求,併產生動態網頁內容的java類。Servlet主要是用來處理或儲存HTML表單提交的資料。

產生動態內容,在無狀態HTTP協議下管理狀態資訊。

24、解釋一下Servlet的生命週期?

對每一個客戶端的請求,Servlet引擎載入Servlet,呼叫它的init()方法。完成Servlet的初始化。然後Servlet物件通過為每一次請求單獨呼叫service()方法來處理,最後呼叫Servlet的destroy()方法來把Servlet刪除。

25、doGet()和doPost()的區別?

doGet():會把名值對追加到url後,因為url有字元限制,所有限制傳引數,並且引數可見,不安全

doPost():請求引數值放在請求體內,無引數限制,引數不可見,安全。

26、什麼是Servlet鏈?

Servlet鏈是把一個Servlet的輸出傳送給另一個Servlet方法,第二個的輸出再發給第三個,以此類推。鏈條上最後一個

負責把響應發給客戶端。

27、sendRedirect()和forward()方法有什麼區別?

sendRedirect()方法建立一個新的請求,而forward()只是把請求轉發到一個新的目標上。重定向(redirect)之後,

之前請求作用域內的物件就失效了,因為會產生新的請求,而轉發(forward)之後,之前請求作用於的物件還能訪問。

一般認為sendRedirect()比forward()要慢。

28、什麼事jsp?

jsp頁面是包含了靜態資料和jsp元素兩種型別的文字的文字文件。

29、jsp有何優點?

jsp頁面是被動態編譯成Servlet 的,因此開發者可以很容易的更新展示程式碼。

jsp頁面可以被預編譯;

jsp頁面可以很容易和靜態模板結合;