1. 程式人生 > >企業面試問題-java基礎

企業面試問題-java基礎

  1. Java基礎部分
  1. 在登入時進行後臺驗證後臺獲取到loginpass與資料庫對比一直?
  2. Java中的方法覆蓋(Overwrite)和方法過載(Overloading)是什麼意思?

過載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的引數列表各不相同(即引數個數或型別不同)。

重寫Override表示子類中的方法可以與父類的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向物件程式設計的多型性的一種表現。

  1. 介面和抽象類的區別是什麼?

抽象類:含有abstract修飾的類即為抽象類,抽象類不能建立例項物件。含有abstract方法的類必須定義為抽象類,抽象類中的方法不必是抽象的。抽象類中定義抽象方法必須在具體子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract型別。

介面:可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract型別,介面中的成員變數型別預設為public static final。

下面比較一下兩者的語法區別

  1. 抽象類可以有構造方法,介面中不能有構造方法。
  2. 抽象類中可以有普通成員變數,介面中沒有普通成員變數
  3. 抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
  4. 抽象類中的抽象方法的訪問型別可以使public、protected和預設型別,但介面中的抽象方法只能是public型別的,並且預設修飾即為public abstract型別。
  5. 抽象類中可以包含靜態方法,介面中不能包含靜態方法
  6. 抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問型別可以任意,但介面中定義的變數只能是public static final型別,並且預設即為public static final型別。
  7. 一個類可以實現多個介面,但只能繼承一個抽象類。
  1. 建立執行緒有幾種不通的方式?
  1. 自定義類繼承Thread類方式
  2. 自定義類實現Runnable介面方式
  1. Java集合框架的基本介面有哪些?

Collection介面

  • List介面
  • Set介面

Map介面

  1. BlockingQueue是什麼?

1.BlockingQueue:支援兩個附加操作的 Queue,這兩個操作是:檢索元素時等待佇列

變為非空,以及儲存元素時等待空間變得可用。

2.BlockingQueue 不接受 null 元素。

3.BlockingQueue 可以是限定容量的。

4.BlockingQueue 實現是執行緒安全的。Queue不是執行緒安全的。因此可以將Blockingqueue用於用於生產者-消費者模式。

對於BlockingQueue佇列而然,如果BlockQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒,同樣,如果BlockingQueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue裡有空間才會被喚醒繼續操作。

  1. Java中的兩種異常型別是什麼?

Error:稱為錯誤,由java虛擬機器生成並丟擲,包括動態連結失敗,虛擬機器錯誤等,程式對其不做處理。

Exception:所有異常類的父類,其子類對應了各種各樣的可能出現的異常事件,一般需要使用者顯示的宣告或捕獲。

Runtime Exception:一類特殊的異常,如被0除、陣列下標超範圍等,其產生比較頻繁,處理麻煩,如果顯示的宣告或捕獲將會對程式可讀性和執行效率影響很大。因此由系統自動檢測並將它們交給預設的異常處理程式(使用者可不必對其處理)。

  1. Final,finallyfinalize的區別?

final用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內部類要訪問區域性變數,區域性變數必須定義成final型別。

finally是異常處理語句結構的一部分,表示總是執行。

finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提高垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫。

  1. Java中如何實現序列化,有什麼意義?

序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決物件流讀寫操作時可能引發的問題(如果不進行序列化可能會存在資料亂序的問題)。

要實現序列化,需要讓一個類實現Serializable介面,該介面是一個標識性介面,標註該類物件是可被序列化的,然後使用一個輸出流來構造一個物件輸出流並通過writeObject(Object)方法就可以將實現物件寫出(即儲存其狀態);如果需要反序列化則可以用一個輸入流建立物件輸入流,然後通過readObject方法從流中讀取物件。序列化除了能夠實現物件的持久化之外,還能夠用於物件的深度克隆。

  1. 多執行緒問題
  2. 都用過什麼設計模式

單例設計模式

工廠設計模式

模板設計模式

裝飾設計模式

代理設計模式

介面卡設計模式

  1. 寫一個單例模式出來

餓漢模式

public class Single {

//私有本類中的建構函式

private Single(){}

//建立本類物件

private static Single s = new Single();

//對外提供獲取本來物件方法

public static Single getInstance(){

return s;

}

}

注意問題:

  由於外界無法建立Single物件,沒有物件,那就無法呼叫getInstance方法,這時需要將getInstance方法靜態化,這樣外界就可以通過類名直接呼叫該方法。

懶漢模式

public class Single

{

//私有建構函式

private Single(){}

//在本類中建立本類物件

private static Single instance = null;

//對外提供靜態訪問方法,獲取本類例項物件

public static Single getInstance(){  

if(instance == null )  // 這裡會有執行緒安全問題

{

instance = new Single();

}

return instance;

}

}

class SingleDemo

{

public static void main(String[] args)

{

//獲取Single類的例項物件s

Single s = Single.getInstance();

//獲取Single類的例項物件s2

Single s2 = Single.getInstance();

System.out.println(s==s2); //true

}

}