1. 程式人生 > 其它 >Java常見的面試題(二)

Java常見的面試題(二)

技術標籤:Java面試題目面試程式語言java

目錄:

1.Collection包結構,與Collections的區別
2.Java的四種引用,強弱軟虛
(1)強引用
(2)軟引用
(3)弱引用
(4)虛引用
3.泛型常用特點 (待補充)
4.final有哪些用法?
5.static都有哪些用法?

面試題:

1.Collection包結構,與Collections的區別

Collection是集合類的上級介面,子介面有 Set、List、LinkedList、ArrayList、Vector、Stack、Set;Collections是集合類的一個幫助類, 它包含有各種有關集合操作的靜態多型方法,用於實現對各種集合的搜尋、排序、執行緒安全化等操作。此類不能例項化,就像一個工具類,服務於Java的Collection框架。

2.Java的四種引用,強弱軟虛

(1)強引用

強引用是平常中使用最多的引用,強引用在程式記憶體不足(OOM)的時候也不會被回收,使用方式:

String str = new String("str");

(2)軟引用

軟引用在程式記憶體不足時,會被回收,使用方式:

// 注意:wrf這個引用也是強引用,它是指向SoftReference這個物件的,
// 這裡的軟引用指的是指向new String("str")的引用,也就是SoftReference類中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));

可用場景: 建立快取的時候,建立的物件放進快取中,當記憶體不足時,JVM就會回收早先建立的物件。

(3)弱引用

弱引用就是隻要JVM垃圾回收器發現了它,就會將之回收,使用方式:

WeakReference<String> wrf = new WeakReference<String>(str);

可用場景: Java原始碼中的 java.util.WeakHashMap 中的 key 就是使用弱引用,我的理解就是,一旦我不需要某個引用,JVM會自動幫我處理它,這樣我就不需要做其它操作。

(4)虛引用

虛引用的回收機制跟弱引用差不多,但是它被回收之前,會被放入 ReferenceQueue 中。注意哦,其它引用是被JVM回收後才被傳入 ReferenceQueue 中的。由於這個機制,所以虛引用大多被用於引用銷燬前的處理工作。還有就是,虛引用建立的時候,必須帶有 ReferenceQueue ,使用

例子:

PhantomReference<String> prf = new PhantomReference<String>(new
String("str"), new ReferenceQueue<>());

可用場景: 物件銷燬前的一些操作,比如說資源釋放等。** Object.finalize() 雖然也可以做這類動作,但是這個方式即不安全又低效

上訴所說的幾類引用,都是指物件本身的引用,而不是指 Reference 的四個子類的引用( SoftReference 等)。

3.泛型常用特點 (待補充)

泛型是Java SE 1.5之後的特性, 《Java 核心技術》中對泛型的定義是:

“泛型” 意味著編寫的程式碼可以被不同型別的物件所重用。

“泛型”,顧名思義,“泛指的型別”。我們提供了泛指的概念,但具體執行的時候卻可以有具體的規則來約束,比如我們用的非常多的ArrayList就是個泛型類,ArrayList作為集合可以存放各種元素,如Integer, String,自定義的各種型別等,但在我們使用的時候通過具體的規則來約束,如我們可以約束集合中只存放Integer型別的元素,如

List<Integer> iniData = new ArrayList<>()

使用泛型的好處?

以集合來舉例,使用泛型的好處是我們不必因為新增元素型別的不同而定義不同型別的集合,如整型集合類,浮點型集合類,字串集合類,我們可以定義一個集合來存放整型、浮點型,字串型資料,而這並不是最重要的,因為我們只要把底層儲存設定了Object即可,新增的資料全部都可向上轉型為Object。 更重要的是我們可以通過規則按照自己的想法控制儲存的資料型別。

4.final有哪些用法?

final也是很多面試喜歡問的地方,但我覺得這個問題很無聊,通常能回答下以下5點就不錯了:

(1)被final修飾的類不可以被繼承

(2)被final修飾的方法不可以被重寫

(3)被final修飾的變數不可以被改變.如果修飾引用,那麼表示引用不可變,引用指向的內容可變.

(4)被final修飾的方法,JVM會嘗試將其內聯,以提高執行效率

(5)被final修飾的常量,在編譯階段會存入常量池中.

除此之外,編譯器對final域要遵守的兩個重排序規則更好:

在建構函式內對一個final域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序

初次讀一個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序.

5.static都有哪些用法?

所有的人都知道static關鍵字這兩個基本的用法:靜態變數和靜態方法.也就是被static所修飾的變數/方法都屬於類的靜態資源,類例項所共享.

除了靜態變數和靜態方法之外,static也用於靜態塊,多用於初始化操作:

public calss PreCache{
  static{
    //執行相關操作
 }
}

此外static也多用於修飾內部類,此時稱之為靜態內部類.

最後一種用法就是靜態導包,即 import static .import static是在JDK 1.5之後引入的新特性,可以用來指定匯入某個類中的靜態資源,並且不需要使用類名,可以直接使用資源名,比如:

import static java.lang.Math.*;
public class Test{
  public static void main(String[] args){
    //System.out.println(Math.sin(20));傳統做法
    System.out.println(sin(20));
 }
}

更多面試內容請關注下期更新!