閱讀671 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JAVA麵試700問(六)

1.wait(),notify()和notifyAll()的作用是什麼?

  • wait():使當前線程停止,直到另一個線程調用notify()方法或notifyAll()方法.。
  • notify():喚醒這個對象的監視器上等待的一個線程。
  • notifyAll():將引發wait()狀態的所有的線程變為就緒狀態,所有的線程繼續執行。這些線程將基於優先級以及基於JVM選擇來執行。
  • 注意:這三個方法在被調用之前必須獲得對象的鎖。

2.File類與RandomAccessFile類之間的區別是什麼?

基於操作係統的文件係統服務,比如文件、文件夾的創建,權限的核實,改變文件名等,都由java.io.File類提供。java.io.RandomAccessFile類提供對文件的隨機訪問。使用這個類同樣可以讀、寫,操作數據,同時更為方便的是,這個類可以讀寫基本類型,這有助於以結構化的方式處理數據文件。

3.什麼是同步方法和同步代碼塊?

同步方法用於控製在多線程下對對象的訪問。獲得對象的鎖後,線程才能執行同步方法。
同步代碼塊是類似於同步方法。不同之處在於同步方法是類的一部分,並明確地被另外一個方法調用。而一個同步代碼塊是由其被包含的方法執行,而這個包含同步代碼塊的方法還要被另外一個方法調用。

4.什麼是Java類加載器?什麼又是動態類加載?

類可以被JVM訪問並通過名稱來引用。JVM啟動後,這些類被JVM讀取。

所有的類加載器以一定的層次關係被JVM識別。第一個被加載的類是所謂的“初始化類”,也就是包含main方法的類。這個類是由JVM本身加載。所有其他後續類,按照它們在 ‘class chaining’中出現的順序被加載。每一個類加載器都會創建一個命名空間來唯一識別它們。每個JVM至少包含一個引導類加載器。

5.抽象類和接口之間的區別是什麼?什麼時候使用抽象類?什麼時候使用接口?

一個抽象類除了具體方法外還有一個或多個抽象方法。所有抽象方法必須被它的子類覆蓋。一個抽象類可以沒有抽象方法。而接口隻包含方法簽名。

默認情況下,一個接口中的的所有方法都是public的和abstract的。需要的時候應該為接口中的方法提供訪問說明符。接口的實現類必須提供所有接口中聲明的方法的實現。

抽象類的聲明以關鍵字abstract開始,接口以interface開始。
一個接口可以繼承任意數量的接口,一個抽象類隻能繼承一個抽象類。
接口的成員變量都是public static 的,抽象類的成員變量可以有任意聲明。

當一個類繼承自另一個類後,它還可以實現多個接口。當一個類需要實現接口所有的方法時,接口就很有用。
覆蓋抽象類的具體方法不是強製要求的。當值需要實現若幹方法,並想利用繼承的優勢的時候,就可以使用抽象類

6.ArrayList和Vector的主要區別?HashMap和HashTable的主要區別?

ArrayList和Vector的區別:
Vector是同步的,ArrayList不是。
Vector默認大小為10,ArrayList沒有默認大小。
Vector有一個方法,可以指定Vector的大小,ArrayList不行。
Vector擴容的時候成倍增長,而ArrayList以50%增長。

HashMap和Hashtable的區別:
Hashtable是同步的,Hashmap不是。
Hashtable的值不能為空,Hashmap可以。
HashMap不能保證map中元素的順序不變。
HashMap通過Map接口來實現。哈希表通過繼承Dictionary 類實現。

7.解釋Java集合框架?Java集合框架帶來什麼好處?

集合是由一組對象組成的一個對象。集合框架,讓應用程序更有效率,更少的硬編碼,不同的對象由類似的實現。使用集合框架,主要是為了集合框架的標準性和簡單性。

集合框架的又一個好處是,一組對象,沒有順序或類型類型也可以通過一個單一的對象來表示。
Java集合框架提供了以下好處:
•減少編程工作量
•提高程序的速度和質量
•允許無關的API之間協同工作
•減少學習和使用的成本
•不要去設計新的API
•促進軟件重用

8.對象的淺克隆和深克隆的主要區別?

Shallow cloning and deep cloning in Java – April 02, 2009 at 17:00 PM by Vidya Sagar

淺克隆隻克隆了對象的引用。
深克隆克隆對象本身。
兩者的區別用Java實例不好理解,但如果用數據庫來想會更好理解:
如果實體需要“級聯刪除”被刪除那就就要深克隆。如果“級聯刪除”是沒有必要刪除就需要淺克隆。

Shallow cloning and deep cloning in Java – July 31, 2009 at 14:00 PM by Amit Satpute

當對象被淺複製的時候,結果是複製的結果和原來的引用指向相同的對象。由於這個原因,原來的引用對對象的改變會映射到複製的結果。
當對象被深克隆時,對象的值也被複製,由於兩個對象維持獨立的引用,對對象的改變不會相互影響。

9.final,finally finalize()的區別?

Final, finally and finalize() in Java – April 02, 2009 at 17:00 PM by Vidya Sagar

• final

final成員變量的值不能被改變。
final方法不能被重寫。
final類不能被繼承。

• finally

這是一個語句塊,咱try /catch塊後這個語句塊一定會被執行。

• finalize()

當對象要被GC回收時,這個方法會執行。

Final, finally and finalize() in Java – April 02, 2009 at 17:00 PM by Vidya Sagar
• final – 一個關鍵字/訪問修飾符用於定義常量。

• finally – 除了try塊調用了System.exit(0), finally塊總是與try和catch塊一起。這是確保在發生error/exception的情況下,finally塊都能執行。finally不僅用於異常處理,還可以用於清理代碼,比如返回值,continue或break語句的使用,I/O流的關閉等,在finally塊中執行清理代碼是一種良好的編程習慣。

• finalize()  -此方法與垃圾回收相關。在係統清理資源之前,這個方法會被調用。

10.什麼是類型轉換?什麼是向上轉型和向下轉型?什麼情況下會拋出ClassCastException異常?

Type casting and down casting in Java – April 02, 2009 at 17:00 PM by Vidya Sagar

“類型轉換”:把對象從一種類型轉換為另一種類型的表達式。
向上轉型是把子類轉換成父類,例如把子類的引用賦予父類的引用。
向下轉型是把父類轉換為子類,例如把父類的引用賦予子類的引用。
無效的類型轉換會拋出ClassCastException。它表示該應用程序試圖將對象轉換為子類,但這個子類而不是對象的實例。當試圖向容器中插入不兼容的對象時也會拋出這個異常。

Type casting and down casting in Java – July 31, 2009 at 14:00 PM by Amit Satpute

將類型的值從一種類型到另一種類型叫做類型轉換。
如:

1 int i =10;
2 float x = (float) i;

向上和向下轉型和類有關。
如:

Parent p = new Child();

11.有幾種內部類,分別是什麼?

Different types of inner classes in Java – April 02, 2009 at 17:00 PM by Vidya Sagar

有4種類型的內部類 – 成員內部類,局部內部類,靜態內部類和匿名內部類。
1.成員內部類-類(外部類)的成員。
2.局部內部類-這是一個塊中定義的內部類。
3.靜態內部類-類似於靜態成員,這個類本身是靜態的。
4.匿名內部類-類沒有名稱,隻能實現一個接口或繼承自一個抽象類。

外部類不能任意訪問內部類的成員。要做到這一點,外部類必須創建其內部類的對象(靜態內部類除外)。內部類可以訪問所有的外部類的成員,因為內部類就像是一個類的成員。
匿名內部類是使用的場景如下:一個對象創建後, 調用單一的方法,調用完成後立即回收對象。多用於事件驅動編程。
嵌套類用於AWT,Swing和applet。動作事件發生後匿名內部類或被調用。

12.什麼是Java包?

當項目的規模變大後,項目文件的管理變得非常繁瑣。較小的項目可以將相關的文件存儲在單個位置。
包可以有效地用來管理需要編寫很多代碼的問題。
不同功能的文件可以保存在不同的包中,有類似或相關功能的文件可以保存在同一包中。
例如:文件中的java.io包中的文件包含I / O相關的功能,而在java.net包中的文件包含與網絡相關的功能。
包是類的集合,可以避免命名空間的衝突。
多個有相同名字的文件不能放在同一個包中。
一個類層次結構可以創建和保存在一個包中。

包也可以被看作是一個類的容器類。

13.什麼是Java本地方法?

Native methods in Java – posted by Amit SatputeJava

應用程序可以調用C,C ++或匯編代碼。這樣做有時是為了性能,有時為了使用底層操作係統的係統服務或者操作係統的GUI API。具體步驟為:

* 編寫和編譯java代碼
* 然後創建一個C頭文件
* 創建Ç存根文件
* 編寫C代碼
* 創建共享代碼庫(或DLL)
* 運行應用程序
Native methods in Java – posted by Vidya Sagar

可以用java調用c或者c++的代碼。這個過程是處於性能的考慮,或訪問底層操作係統。JNI框架就是為了執行這樣的程序而設計的。

14.什麼是Java反射API?

Reflection API in Java – posted by Amit Satpute

用反射API可以在運行獲取類或者對象的相關信息。反射類可以在運行時動態調用另一個類的方法。使用反射類你可以獲得一個實例的字段,並且改變字段的內容。反思API包含的java.lang.Class類和java.lang.reflects中的類:Field, Method, Constructor, Array, 和Modifier.

Reflection API in Java – posted by Vidya Sagar

反射是一個用於檢查在JVM中運行的應用程序的運行時行為的一個過程。反射API允許運行時創建一個不知道類名的類的實例。定製的處理類可以在沒有編譯的情況下嵌入係統。所有這些處理類都是繼承基類“MassageProcessor’而得到的。

15.解釋私有構造器的作用。

Java private constructor – August 11, 2008, 19:00 pm by Amit Satpute

私有構造函數不能被任何派生類訪問也不能被其他任何類訪問。所以,如果對象尚未初始化,你必須提供一個public 的方法來調用私有構造函數,或者如果它已經被初始化,你就用這個public方法返回對象的實例。
這種方法對不能被被實例化的對象很有用。

Java private constructor – Feb 27, 2009, 17:35 pm by Vidya Sagar

私有構造器可以阻止其包含類和子類的外部實例化。對象可以被創建,但創造是在內部完成。
私有構造可在下列情況下使用:
類隻有static的字段以及方法
一個隻有static final 字段的類
單例模式
工廠方法
類型安全的枚舉類

16.什麼是靜態初始化塊?

Static Initializers in Java – posted by Amit Satpute

靜態初始化塊可以被看做一個,沒有名字,沒有參數,沒有返回值的成員。沒有必要從類定義之外引用它。語法:

static
{
//CODE
}

靜態初始化塊中的代碼是由JVM進行類加載時執行。
因為它是在類加載時自動執行,參數對它來說沒有任何意義,所以靜態初始化塊沒有一個參數列表。

Static Initializers in Java – posted by Vidya Sagar

靜態初始化塊是一個名為’static’的代碼塊。一個類可以包含一個或多個靜態初始化塊。靜態初始化塊中的代碼會先於構造器中的代碼執行,並且按照各靜態初始化快在類中的順序執行。當類被加載的時候,靜態初始化中的代碼會被執行。
例如:

class Test
{
static int stNumber;
int number;
Test()
{
number = 10;
}
static
{
stNumber=30;
}
…… // other methods here

}

在上麵的例子中,靜態初始化塊中的代碼先執行,然後用才是構造器中的代碼。

17.&和&&的區別?

Java – Boolean & operator and the && operator – Feb 28, 2010 at 16:16 PM by Vidya Sagar

&&用於兩個關係式的邏輯與運算
&用於兩個數的按位與運算

18.什麼是任務的優先級和它是如何被調度的?

Java – task’s priority – Feb 28, 2010 at 16:16 PM by Vidya Sagar

一個任務的優先級是一個整數值。這個值用於各個任務之間執行的相對順序。調度是任務執行的順序它被任務調度器控製。任務調度器會嚐試讓具有較高優先級的任務在優先級較低的任務之前執行。

Java – task’s priority – Jan 15, 2009 at 8:10 am by Amit Satpute
優先級是一個整數值。
任務調度器會根據這個值來確定何時執行這個任務。

19.搶占式調度和時間分片之間的區別是什麼?

Java – Preemptive scheduling and time slicing – Feb 28, 2010 at 16:16 PM by Vidya Sagar

搶占式調度:具有最高優先級的任務將被執行,直到它進入等待或死亡狀態。
時間分片:任務執行特定的和預先確定的時間片,然後重新進入就緒任務池。調度器的任務根據優先級以及其他因素來確定下一個要執行的任務。

Java – Preemptive scheduling and time slicing – Jan 15, 2009 at 8:10 am by Amit Satpute

如果某一個任務正在運行並且所使用的調度方法是搶占式調度,那麼如果存在比正在執行的任務更高優先級的另一個任務,那麼正在執行的任務將會被具有更高優先級的任務搶占。
在時間分片的調度方法中,任務會執行特定的時間片。
任務執行完後,如果存在具有更高優先級的另一項任務,調度器要執行的下一個任務取決於任務的優先級以及其他因素。

20.什麼是同步的,為什麼它很重要?

Java – synchronization – Feb 28, 2010 at 16:16 PM by Vidya Sagar

在多線程中訪問共享資源時,隻有一個線程可以在同一時間訪問一個指定的資源,稱為同步。
同步用於防止多線程造成的數據的不一致。
對於多線程,同步具有控製多個線程對共享資源訪問的能力。在非同步時,可能有一個線程真在修改一個共享變量,同時另一個線程在更新相同的共享數據。

Java – synchronization – Jan 15, 2009 at 8:10 am by Amit Satpute

線程通過訪問共享字段和對象實現通信。
然而,有線程衝突和內存不一致的可能性。
同步是用來防止這種情況。
在同步中,如果一個對象對多個線程是可見的,所有讀取或寫入該對象的變量,通過同步的方式進行。

21.如何使用Observer類和Observable接口?

Java – Observer and Observable – Jan 15, 2009 at 8:10 am by Amit Satpute

Observable 類代表一個可觀察的對象。
要被觀察的對象可以用Observable 類的子類來表示。
當Observable實例發生改變時 ,應用程序調用Observable對象的notifyObservers方法,通知它的所有Observer,這些Observer會調用它們的update()方法響應通知。

22.什麼是ResultSetMetaData的?

Java – What is ResultSetMetaData? – Jan 15, 2009 at 8:10 am by Amit Satpute

ResultSetMetaData的是一個對象,用於獲取ResultSet對象的類型和列的屬性的信息。
如下:

ResultSet resultSet1 = statement1.executeQuery(“SELECT a, b, c FROM TABLE2″);
ResultSetMetaData rsmd = rs.getMetaData();

23.解釋CacheRowset,JdbcRowSet的和的WebRowSet。

Java – CacheRowset, JDBCRowset and WebRowset – Jan 15, 2009 at 8:10 am by Amit Satpute

JdbcRowSet是一種保持連接的rowset ,它使用JDBC驅動保持和數據源的連接。
CachedRowSet和WebRoeSet是不保持連接的結果集,僅當它們讀取或者寫入數據的時候才和數據源連接。

如下幾個例子:
Example 1:

JdbcRowSet j = new JdbcRowSetImpl();
j.setCommand(“SELECT * FROM TABLE_NAME);
j.setURL(“jdbc:myDriver:myAttribute”);
j.setUsername(“XXX”);
j.setPassword(“YYYo”);
j.execute();
Example 2:
ResultSet rs = stmt.executeQuery(“SELECT * FROM AUTHORS”);
CachedRowSet crset = new CachedRowSetImpl();
crset.populate(rs);
Example 3:
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
wrs.absolute(2)
wrs.updateString(1, “stringXXX”);

24.解釋一類的靜態和非靜態成員之間的差異。

Java – difference between Static and Non-Static fields – Feb 22, 2009 at 10:10 am by Vidya Sagar

靜態成員屬於類。該類的對象不能有這些字段的副本。這些字段由類來直接引用。例如:Employee. company。無需創建該類的一個實例,這些字段也可被訪問。

非靜態字段由類的所有對象訪問。每個對象有非靜態字段的一個副本。要使用非靜態字段,必須先創建類的實例。

25.instanceof關鍵字的作用。

Java – Describe the use of “instanceof” keyword. – with answers posted on July 22, 2008 at 8:10 am

“instanceof” 用於檢查一個對象是什麼類型。

26.垃圾回收機製有什麼缺點?

Java – What is the disadvantage of garbage collector? – with answers posted on July 22, 2008 at 8:10 am

盡管垃圾收集器在它自己的線程中運行,但仍然對性能有影響。它增加了開銷,因為JVM必須跟蹤所有未被引用的對象,然後釋放這些未引用的對象。
垃圾收集器可使用“的System.gc”或“Runtime.gc”來強製執行。

27.資源清理(Finalization)的作用?

Java – What is the purpose of finalization? – July 06, 2009 at 10:00 AM

Finalization通過調用finalized()實現。Finalization的目的是為了對象得到清理之前執行某些操作。此方法在GC之前執行必要的清理工作,也就是消除’orphan objects’.

28.定義類和對象並使用Java的例子解釋。

Java – Define class and object. – Feb 14, 2009 at 8:10 am by Vidya Sagar

類:類是一個封裝了數據和在數據上的操作的程序結構。在麵向對象的編程中,類可以看成對象的藍圖。
對象:一個對象是屬於某個類的程序結構,具有狀態和行為。
例如 Employee 是一個類
具有的唯一標識的一個Employee 是一個對象的一個​​例子。

class Employee
{
// instance variables declaration
// Methods definition
}

一個employee 對象是一個特定的employee

Employee vismay =new Employee();

vismay 是此對象的引用。

29.解釋類和實例?

Java – Explain class vs. instance with example using java. – Feb 16, 2009 at 19:50 am by Vidya Sagar

一類是封裝了數據和操作上的操作的程序結構。它是一個對象的藍圖。
一個對象可以被稱為一個類的一個“實例”。
類中聲明的變量和方法,除方法中的變量外都被稱為實例變量,他們在每個對象中都有一份拷貝。一旦對象被創建,可以說,創建了一個類的實例。
類變量和方法創建一次,而每次創建一個對象都會創建實例變量和成員

30.什麼是方法?說出幾種方法的簽名。

Java – What is a method? Provide several signatures of the methods – July 06, 2009 at 10:00 AM

java方法是一組執行任務的語句。一個方法要被放在類中。
方法簽名:方法的名字,返回類型和參數的數目組成方法簽名。

一個成員可以有以下方法簽名:
訪問說明符- public, private, protected 等
訪問修飾符- static, synchronized等
返回類型- void, int, String 等
方法的名字-
參數

31.創建類實例的方法有幾種?分別給出描述。

Java – Explain how to create instance of a class by giving an example. – Feb 18, 2009 at 9:10 am by Vidya Sagar

Java 有三種創建類實例的方法:

* 用 new 操作符

* 用 Class.forName(classname).newInstance() method

* 用 clone() 方法

32.什麼是單例類?有什麼用途?

Java – What is singleton class? Where is it used? – Feb 18, 2009 at 9:10 am by Vidya Sagar

一個類可以定義為單例類,當且僅當它隻能創建一個類的實例。當應用中想隻適用類的一個實例時單例類會很有用。
以下是一些單例類的用途。
1.對對象的訪問進行控製。
2.當全局範圍需要”just-in-time”實例化的時候。

最後更新:2017-05-23 09:31:34

  上一篇:go  JAVA異常處理
  下一篇:go  基本的try-cathc-finally異常處理