Java常見面試題——僅供實習

注:從網絡整理而來。紅字爲不理解,待查閱內容java

1.面向對象的特徵有哪些方面?程序員

抽象,就是將具備一致屬性和行爲的對象抽象成一個類,只強調本質的屬性和行爲,先不考慮具體的細節。sql

繼承,子類自動共享父類的屬性和行爲。單重繼承是指子類只繼承一個父類的屬性和行爲,多重繼承是子類能夠繼承多個類的屬性和行爲。編程

多態,相同的函數做用在不一樣的對象上會得到不一樣的結果。設計模式

封裝,只給用戶看用戶須要看的東西。數組

 

2.int 和 Integer 有什麼區別安全

Java 提供兩種不一樣的類型:原始類型(或內置類型)和引用類型。Java爲每一個原始類型提供了封裝類。網絡

Int是java的原始數據類型,Integer是java爲int提供的封裝類。
原始類型     封裝類
boolean     Boolean
char          Character
byte          Byte
short        Short
int            Integer
long         Long
float         Float
double      Double多線程

引用類型和原始類型具備不一樣的特徵和用法,它們包括:大小和速度問題等。另外,對象引用實例變量的缺省值爲 null,而原始類型實例變量的缺省值與它們的類型有關。ide

3.String 和StringBuffer的區別
      JAVA平臺提供了兩個類:String和StringBuffer,它們能夠儲存和操做字符串。

     String類提供了數值不可改變的字符串。而StringBuffer類提供的字符串能夠進行修改,常使用StringBuffers來動態構造字符數據。

4.說出ArrayList,Vector, LinkedList的存儲性能和特性
     ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,它們都容許直接按序號索引元素,可是插入元素要涉及數組元素移動等內存操做,因此索引數據快而插入數據慢。

    Vector因爲使用了synchronized方法(線程安全),一般性能上較ArrayList差。

    LinkedList使用雙向鏈表實現存儲,按序號索引數據須要進行前向或後向遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入速度較快。

5.Collection 和 Collections的區別。
  Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
      Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。

6.HashMap和Hashtable的區別。

      HashMap是Map接口的實現,容許鍵(key)和值(value)爲null,使用containsKey()和containsValue()來判斷是否含有某數據。

      Hashtable繼承Dictionary類,不容許值爲null,使用contains()判斷是否含有某數據。

      最大不一樣時HashMap不支持線程安全,所以,多線程訪問時必須提供外同步方法,使用方法爲Map map = Collections.synchronizedMap(new HashMap());)

      Hashtable支持線程安全,多線程訪問不需提供外同步方法。

7.final, finally, finalize的區別。
  final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
      finally是異常處理語句結構的一部分,表示老是執行。
      finalize是Object類的一個方法,在垃圾收集器GC執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。

8.sleep() 和 wait() 有什麼區別?

     sleep()是Thread類裏的方法,調用並不釋放鎖,即佔有資源等待。通常給sleep()指定時間,時間一到,線程處於可運行狀態。能夠在任意地方使用sleep(),但使用時須要捕捉InterpretedException。

     wait()是Object類裏的方法,調用釋放鎖,即釋放資源後進入被釋放資源的等待池等待被notify。通常不給wait()指定時間,由於時間一到,線程也只是轉入到就緒狀態。wait()必須和notify()/notifyAll()在同步控制方法中一塊兒使用。

9.Overload和Override的區別。Overloaded的方法是否能夠改變返回值的類型?

    Overload是重載,是同一個類中的多態的體現。相同名字的函數改變參數個數或者參數類型能夠實現重載。

    Override是重寫,是父類和子類之間的多態的體現。若子類中定義的函數與父類中某函數具備相同的名稱和參數,則該方法被重寫。

    Overload重載的方法能夠改變返回值的類型。
10.error和exception有什麼區別?

    error表示恢復很困難的嚴重問題,如內存溢出。程序並不能處理這樣的狀況。

    exception指程序中的問題。在程序中,能夠throw,也能夠被捕捉進行處理。

11.abstract class和interface有什麼區別?

    interface中有:

          變量(public、static、final),由於是static的,因此不經過對象訪問;由於是final的,因此聲明時須要有value(指定的或默認的)且該值不能修改。

          函數(public、static、abstract),不能有函數體實現,也就是函數聲明後面沒有{},直接跟;。

    abstract class中有:

          變量

          抽象函數,即沒有方法體的函數

          通常函數

     interface體現的是「like a」,而abstract class體現的是「is a」,能夠根據這個含義在實際應用中靈活使用接口或者抽象類。

     interface是實現(implement),abstract class是繼承(extends)。

     interface能夠繼承多個interface,而且一個類能夠實現多個interface,而一個類只能繼承一個abstract class。

     abstract class能夠實現interface。
12.內存分配的幾種方式?

     棧(Heap),由系統申請和釋放,存放函數的參數和局部變量。

     堆(Heap),由程序員申請。

     全局變量區,由系統申請和釋放存放全局變量或者靜態變量。

     常量區,存放常量字符串。

     代碼區,存放代碼。

13.heap和stack有什麼區別?

    棧(Heap),由系統申請和釋放,存放函數的參數和局部變量。棧的容量是有限的。存取效率高。

    堆(Heap),由程序員申請。堆的容量和虛擬內容有關。

14.GC是什麼? 爲何要有GC?GC有什麼優勢?

  GC是垃圾收集器的意思(Gabage Collection)。對象一旦被建立,GC就會監控它的內存地址,大小等使用狀況,採用有向圖的方法標記對象爲可達或者不可達,當對象爲不可達時,GC就會回收它。

     也可使用System.gc()主動進行垃圾回收,可是JVM回收垃圾的時間並不能獲得肯定。

     Java中的垃圾回收機制可使程序員不去關注內存回收的狀況,專一於本身的程序。

15.給我一個你最多見到的runtime exception。

    IndexOutOfBoundException越界

    NumberFormatException是Sring類型轉換成數字類型型時出錯。
16.List, Set, Map是否繼承自Collection接口?
     List,Set是,Map不是

     List元素是有序可重複的,實現有ArrayList,Vector。

     Set元素是無序不可重複的,實現有HashSet,TreeSet。

 17.equals()和==的區別?

     ==是判斷對象在內存中的地址是否相等。

     equals()是Object類裏的方法,其實現使用==,因此,是判斷對象在內存中地址是否相等。可是,在一些特殊類(如Integer,String)中,該方法被重寫,能夠判斷內容是否相同。

18.是否能夠繼承String類?
    String類是final類故不能夠繼承。

19.swtich是否能做用在byte上,是否能做用在long上,是否能做用在String上?
    switch(expr1)中,expr1是一個整數表達式。所以傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能做用於swtich。

20.try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?
    會執行,在return前執行。

21.兩個對象值相同(x.equals(y) == true),但卻可有不一樣的hash code,這句話對不對?
   須要看這兩個對象是什麼。若是是String、Integer,會出現這樣的狀況,由於此時equals()是比較兩個對象的內容。對於 通常的對象,equals()比較的是內存中的地址,因此,若是地址相同,則hash code也會相同。

22.編程題: 寫一個Singleton出來。
   Singleton模式保證該類只有一個對象,而且易於訪問。

 1    public class Singleton{
 2 
 3         private static Singleton instance;//private保證其餘類不能直接訪問Singleton的對象,static保證能夠直接使用Singleton的名字,而非再在類外定義Singleton的對象。
 4 
 5         private Singleton()
 6 
 7         {
 8 
 9           //do something
10 
11         }  
12 
13         public static Singleton getInstance()//使Singleton的對象易於訪問
14 
15         {
16 
17           if(instance==null) instance=new Singleton();
18 
19           return instance;
20         } 
22 
23 }

23.Java的接口和C++的虛類的相同和不一樣處。
    因爲Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象裏面的方法或屬性,現有的單繼承機制就不能知足要求。與繼承相比,接口有更高的靈活性,由於接口中沒有任何實現代碼。當一個類實現了接口之後,該類要實現接口裏面所     有的方法和屬性,而且接口裏面的屬性在默認狀態下面都是public static,全部方法默認狀況下是public.一個類能夠實現多個接口。

24.多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?
    多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
    同步的實現方面有兩種,分別是synchronized,wait與notify

25.進程、線程的基本概念、基本狀態以及狀態之間的關係

   進程是計算機中資源分配的基本單位,是程序的一次運行。

   線程是計算機中調度的基本單位,每一個程序至少都有一個線程。

   基本狀態是:就緒、運行、阻塞或掛起、結束。

   運行start(),處於就緒狀態,運行run()方法,處於運行狀態,wait()是被掛起,dead()表示結束。

26.簡述邏輯操做(&,|,^)與條件操做(&&,||)的區別。

    條件操做只能操做布爾型,邏輯操做不只能夠操做布爾型,並且能夠操做數值型

    條件操做會產生短路(肯定這個語句的結果後,後面的部分就再也不執行),邏輯操做不會產生短路。

27.j2ee經常使用的設計模式?說明工廠模式。

  Factory(工廠模式)

  Singleton(單例模式)

  Adapter(適配器模式)
工廠模式:工廠模式是一種常常被使用到的模式,根據工廠模式實現的類能夠根據提供的數據生成一組類中某一個類的實例,一般這一組類有一個公共的抽象父類而且實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做。首先須要定義一個基類,該類的子類經過不一樣的方法實現了基類中的方法。而後須要定義一個工廠類,工廠類能夠根據條件生成不一樣的子類實例。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。

28.排序都有哪幾種方法?

   插入排序:直接插入排序、希爾排序

   交換排序:冒泡排序、快速排序

   選擇排序:簡單選擇排序、堆排序

   二路歸併排序

   技術排序

29.JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別表明什麼意義?在try塊中能夠拋出異常嗎?

    Java中每一個異常都是一個對象,是Throwable類或其餘子類的實例。

    throws用於函數聲明的最後,代表該函數可能會發生的異常

    throw語句明確的拋出異常

    try語句塊裏是可能發生異常的程序,緊跟在try後面應該是catch語句塊來捕捉「異常」的類型

    finally是無論語句塊發生什麼異常,總會執行的語句

30.一個「.java」源文件中是否能夠包括多個類(不是內部類)?有什麼限制?

    能夠。可是必須只有一個public的類的名字與文件名相同。
31.java中有幾種方法能夠實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法爲什麼不推薦使用?
    有兩種實現方法,分別是繼承Thread類與實現Runnable接口
    用synchronized關鍵字修飾同步方法
反對使用stop(),是由於它不安全。它會解除由線程獲取的全部鎖定,並且若是對象處於一種不連貫狀態,那麼其餘線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這以前得到的鎖定。此時,其餘任何線程都不能訪問鎖定的資源,除非被「掛起」的線程恢復運行。對任何線程來講,若是它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會形成死鎖。因此不該該使用suspend(),而應在本身的Thread類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()從新啓動線程。舉例

32.java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
   字節流,字符流。字節流繼承於InputStream OutputStream,字符流繼承於InputStreamReader OutputStreamWriter。 

33.java中會存在內存泄漏嗎,請簡單描述。

   Java中內存泄露是指可以可達,可是不會再被使用的對象。而C/C++中內存泄露是指找不到,沒法被回收的對象。

34.是否能夠從一個static方法內部發出對非static方法的調用?
   不能夠。這個在程序挑錯裏可能會出現。

  例如:

1 public class Something {
2 public static void main(String[] args) {
3 Something s = new Something();
4 System.out.println("s.doSomething() returns " + doSomething());
5 }
6 public String doSomething() {
7 return "Do something ...";
8 }
9 }

答案: 錯。看上去在main裏call doSomething沒有什麼問題,畢竟兩個methods都在同一個class裏。但仔細看,main是static的。static method不能直接call non-static methods。可改爲"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能訪問non-static instant variable。

35.說出一些經常使用的類,包,接口,請各舉5個

   經常使用的類:String、Integer、Math、FileReader、FileWriter

   經常使用的包:java.util、java.io、java.sql、java.lang、java.awt

   經常使用的接口:Runnable、List、Set、Map、Document

後續待補充

相關文章
相關標籤/搜索