企業面試問題-java基礎
- Java基礎部分
- 在登入時進行後臺驗證,後臺獲取到loginpass與資料庫值對比一直?
- Java中的方法覆蓋(Overwrite)和方法過載(Overloading)是什麼意思?
過載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的引數列表各不相同(即引數個數或型別不同)。
重寫Override表示子類中的方法可以與父類的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向物件程式設計的多型性的一種表現。
- 介面和抽象類的區別是什麼?
抽象類:含有abstract修飾的類即為抽象類,抽象類不能建立例項物件。含有abstract方法的類必須定義為抽象類,抽象類中的方法不必是抽象的。抽象類中定義抽象方法必須在具體子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract型別。
介面:可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract型別,介面中的成員變數型別預設為public static final。
下面比較一下兩者的語法區別
- 抽象類可以有構造方法,介面中不能有構造方法。
- 抽象類中可以有普通成員變數,介面中沒有普通成員變數
- 抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
- 抽象類中的抽象方法的訪問型別可以使public、protected和預設型別,但介面中的抽象方法只能是public型別的,並且預設修飾即為public abstract型別。
- 抽象類中可以包含靜態方法,介面中不能包含靜態方法
- 抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問型別可以任意,但介面中定義的變數只能是public static final型別,並且預設即為public static final型別。
- 一個類可以實現多個介面,但只能繼承一個抽象類。
- 建立執行緒有幾種不通的方式?
- 自定義類繼承Thread類方式
- 自定義類實現Runnable介面方式
- Java集合框架的基本介面有哪些?
Collection介面
- List介面
- Set介面
Map介面
- BlockingQueue是什麼?
1.BlockingQueue:支援兩個附加操作的 Queue,這兩個操作是:檢索元素時等待佇列
2.BlockingQueue 不接受 null 元素。
3.BlockingQueue 可以是限定容量的。
4.BlockingQueue 實現是執行緒安全的。Queue不是執行緒安全的。因此可以將Blockingqueue用於用於生產者-消費者模式。
對於BlockingQueue佇列而然,如果BlockQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒,同樣,如果BlockingQueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue裡有空間才會被喚醒繼續操作。
- Java中的兩種異常型別是什麼?
Error:稱為錯誤,由java虛擬機器生成並丟擲,包括動態連結失敗,虛擬機器錯誤等,程式對其不做處理。
Exception:所有異常類的父類,其子類對應了各種各樣的可能出現的異常事件,一般需要使用者顯示的宣告或捕獲。
Runtime Exception:一類特殊的異常,如被0除、陣列下標超範圍等,其產生比較頻繁,處理麻煩,如果顯示的宣告或捕獲將會對程式可讀性和執行效率影響很大。因此由系統自動檢測並將它們交給預設的異常處理程式(使用者可不必對其處理)。
- Final,finallyfinalize的區別?
final用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內部類要訪問區域性變數,區域性變數必須定義成final型別。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提高垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫。
- Java中如何實現序列化,有什麼意義?
序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決物件流讀寫操作時可能引發的問題(如果不進行序列化可能會存在資料亂序的問題)。
要實現序列化,需要讓一個類實現Serializable介面,該介面是一個標識性介面,標註該類物件是可被序列化的,然後使用一個輸出流來構造一個物件輸出流並通過writeObject(Object)方法就可以將實現物件寫出(即儲存其狀態);如果需要反序列化則可以用一個輸入流建立物件輸入流,然後通過readObject方法從流中讀取物件。序列化除了能夠實現物件的持久化之外,還能夠用於物件的深度克隆。
- 多執行緒問題
- 都用過什麼設計模式
單例設計模式
工廠設計模式
模板設計模式
裝飾設計模式
代理設計模式
介面卡設計模式
- 寫一個單例模式出來
餓漢模式
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
}
}