JavaRush /Java Blog /Random-TW /Java 開發者訪談問答分析。第16部分

Java 開發者訪談問答分析。第16部分

在 Random-TW 群組發布
朋友你好!成為開發人員需要多長時間?我問了很多不同的人,聽到了很多不同的答案。對某些人來說,一個月可能就足夠了,但對其他人來說,甚至一年都不夠。但我確信,無論你最初的能力如何,成為 Java 開發人員都是一條荊棘叢生的漫長道路。畢竟,重要的不是能力,而是頑強和努力。 Java 開發者訪談問答分析。 第 16 部分 - 1因此,今天我們繼續有目的地分析Java開發人員最熱門的面試問題。研究它們會讓你逐漸接近你所珍惜的目標。讓我們開始吧!

17. 舉出Optional使用成功和不成功的例子

假設我們有一系列的值,我們透過這些值來遍歷流,最後我們得到一些可選的結果:
Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
   .filter(str -> str.length() >= 3)
   .findAny();
正如預期的那樣,我們需要從這個Optional 中獲取值。只使用get()是不好的方法:
String result = stringOptional.get();
但是這個方法應該從Optional中取得值並將其傳回給我們嗎?這當然是真的,但如果它有意義的話。好吧,如果流中的值不同,並且最終我們收到一個空的Optional ,當我們嘗試使用get()方法從中獲取值時,將會拋出以下錯誤: Java 開發者訪談問答分析。 第 16 - 2 部分這不好。在這種情況下,最好使用以下結構:
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    在本例中,我們檢查該元素是否在Optional中。如果不是,則產生的字串具有其舊值。

  2. String result = stringOptional.orElse("default value");

    在這種情況下,我們指定一些預設值,如果Optional為空,則將其賦予結果字串。

  3. String result = stringOptional.orElseThrow(() -> new CustomException());

    在這種情況下,當Optional為空時,我們自己拋出異常。

這在應用程式中非常方便,例如使用 Spring JPA 方法 - findById(),它會傳回可選值。在這種情況下,透過此方法,我們嘗試取得該值,如果不存在,我們會拋出一些運行時異常,該異常在控制器層級使用ExceptionHandler進行處理,並轉換為狀態為404 - NOT FOUND 的HTTP回應。 Java 開發者訪談問答分析。 第 16 - 3 部分

18. 是否可以將 main 方法宣告為final?

是的,當然,沒有什麼可以阻止我們將main()方法宣告為Final。編譯器不會產生錯誤。但值得記住的是,任何方法在聲明為final之後都將成為最後一個方法——而不是被覆蓋。雖然,誰會重新定義main??? Java 開發者訪談問答分析。 第 16 - 4 部分

19. 是否可以導入同一個套件/類別兩次?可能會產生什麼後果?

是的你可以。結果?我們將有一些不必要的導入,Intelijj IDEA 將顯示為灰色,即 沒用過。 Java 開發者訪談問答分析。 第 16 - 5 部分Java 開發者訪談問答分析。 第 16 - 6 部分

20.什麼是選角?我們什麼時候可以得到 ClassCastException?

類型轉換,或類型轉換,是將一種資料類型轉換為另一種資料類型的過程:手動(隱式類型轉換)或自動(明確類型轉換)。 Java 開發者訪談問答分析。 第 16 - 7 部分自動轉換由編譯器執行,手動轉換由開發人員執行。基元和類別的類型轉換有些不同,因此我們將分別考慮它們。 基本型別基本型別 會自動轉換 的範例:
int value = 17;
double convertedValue = value;
正如您所看到的,除了=符號之外,這裡不需要其他操作。手動轉換原始類型的 範例:
double value = 17.89;
int convertedValue = (int)value;
在這種情況下,我們可以觀察到手動轉換,它是使用(int)實現的,其中逗號後面的部分將被丟棄,convertedValue的值為 - 17。閱讀本文中有關轉換基本類型的更多資訊。好吧,現在讓我們繼續討論對象。 引用類型 對於引用類型,可以將後代類別自動轉換為父類別。這也稱為多態性。假設我們有一個繼承自Cat類別的Lion類別。在這種情況下,自動轉換將如下所示:
Cat cat = new Lion();
但對於顯式強制轉換,一切都會變得更加複雜,因為沒有像基元那樣切斷多餘的功能。只需進行形式的明確轉換:
Lion lion= (Lion)new Cat();
你會得到一個錯誤: Java 開發者訪談問答分析。 第 16 - 8 部分事實上,你可以在Lion後代類別中加入原本不在Cat類別中的方法,然後試著呼叫它們,因為你的物件類型將變成Lion。嗯,這沒有邏輯。因此,只有當原始物件是Lion類型但後來被強制轉換為父類別時,類型縮小才可能實現:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
此外,為了提高可靠性,建議使用instanceOf構造對物件進行縮小轉換:
if (cat instanceof Lion) {
 newLion = (Lion)new Cat();
}
在本文中 閱讀有關引用類型轉換的更多資訊。

21.為什麼現代框架主要只使用未經檢查的異常?

我認為這都是因為處理檢查的異常仍然是到處重複的意大利麵條代碼,但並不是在所有情況下都真正需要。 Java 開發者訪談問答分析。 第 16 - 9 部分在這種情況下,在框架內部進行處理會更容易,以免再次將其轉移到開發人員的肩上。是的,當然,可能會出現緊急情況,但是可以以更方便的方式處理這些相同的未經檢查的異常,而無需費心在try-catch中進行處理,也無需通過方法進一步傳遞它們。只需將異常轉換為 異常處理程序中的某些 HTTP 回應就足夠了。

22.什麼是靜態導入?

當使用靜態資料(方法、變數)時,您不能建立物件本身,而是透過類別的名稱來創建,但即使在這種情況下,我們也需要對該類別的引用。一切都很簡單:它是使用常規導入添加的。但是如果我們去使用靜態方法而不寫類別名,就好像它是當前類別的靜態方法一樣怎麼辦?這可以透過靜態導入來實現!在這種情況下,我們必須編寫靜態導入和該方法的連結。例如,Math類別的靜態方法用於計算餘弦值:
import static java.lang.Math.cos;
因此,我們可以在不指定類別名稱的情況下使用該方法:
double result = cos(60);
我們也可以使用靜態導入一次性載入類別的所有靜態方法:
import static java.lang.Math.*;
Java 開發者訪談問答分析。 第 16 - 10 部分

23. hashCode() 和 equals() 方法之間有什麼關係?

根據Oracle 的規定,規則是: 如果兩個物件相等(即equals()方法傳回true),則它們必須具有相同的雜湊碼。 同時,不要忘記兩個不同的物件可以具有相同的雜湊碼。要理解為什麼equals()hashCode()總是成對重寫,請考慮以下情況:
  1. 這兩種方法都被覆蓋。

    在這種情況下,具有相同內部狀態的兩個不同物件將傳回equals() - true,而hashCode()將傳回相同的數字。

    事實證明,一切都沒問題,因為規則正在被遵守。

  2. 這兩種方法都不會被覆蓋。

    在這種情況下,具有相同內部狀態的兩個不同物件在equals()時將傳回false,因為比較是透過==運算子進行引用的。

    hashCode()方法也會傳回不同的值(很可能),因為它會產生記憶體位置位址的轉換值。但對於同一個對象,這個值將是相同的,就像本例中的equals()只有當引用指向同一個物件時才會回傳true 一樣。

    事實證明,在這種情況下一切正常並且規則得到滿足。

  3. 重寫equals(),而不是重寫hashCode()

    在這種情況下,對於具有相同內部狀態的兩個不同對象,equals()將傳回true,而hashCode()將傳回(很可能)不同的值。

    這是違反規則的,所以不建議這樣做。

  4. equals()未被覆蓋,hashCode()被覆蓋。

    在這種情況下,對於具有相同內部狀態的兩個不同對象,equals()將傳回false,而hashCode()將傳回相同的值。

    存在違反規則的情況,因此方法不正確。

正如您所看到的,只有當equals()hashCode()都被重寫或根本沒有被重寫 時,該規則才能執行。在本文中閱讀有關equals()hashCode()Java 開發者訪談問答分析。 第 16 - 11 部分的更多資訊。

24.什麼時候使用BufferedInputStream和BufferedOutputStream類別?

InputStream用於從某個資源逐字節讀取數據,OutputStream用於逐字節寫入資料。但逐字節操作可能非常不方便,並且需要額外的處理(以便正常讀取/寫入文字)。其實就是為了簡化這樣的位元組記錄,引入了BufferedOutputStream,並且引入了BufferedInputStream用於讀取。這些類別只不過是累積資料的緩衝區,允許您不是逐字節處理數據,而是按整個資料包(陣列)處理資料。建立時,BufferedInputStream在其建構函式中接收一個InputStream類型的實例,從中讀取資料:
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in是從控制台讀取資料的InputStream物件。也就是說,使用這個BufferedInputStream對象,我們可以透過將資料寫入傳遞的陣列來從InputStream讀取資料。這實際上是InputStream類別的一種包裝器。此範例中的arr 陣列是從BufferedInputStream接收資料的陣列。反過來,它使用另一個數組從InputStream讀取數據,預設該數組的大小為 2048 位元組。BufferedOutputStream也是如此: OutputStream類型的實例必須傳遞給建構函數,我們將在整個陣列中寫入資料:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out是一個OutputStream對象,它將資料寫入控制台。lush()方法將資料從BufferedOutputStream傳送到OutputStream ,在進程中刷新BufferedOutputStream。如果沒有這個方法,就不會記錄任何內容。與前面的範例類似:arr是將資料寫入BufferedOutputStream的陣列。從那裡,它們被寫入到另一個陣列中的OutputStream ,預設情況下,該陣列的大小為 512 位元組。在文章中閱讀有關這兩個類別的更多資訊。

25. java.util.Collection 和 java.util.Collections 類別之間有什麼區別?

Collection是一個接口,是集合層次結構的頭部。它引入了允許您建立、包含和修改整個物件組的類別。為此提供了許多方法,例如add()remove()contains()等。Collection類別的主要介面:
  • Set是一個接口,描述包含無序唯一(非重複)元素的集合。

  • 列表是一個接口,描述儲存有序物件序列的資料結構。這些物件接收它們自己的索引(編號),您可以使用它與它們互動:獲取、刪除、更改、覆蓋。

  • 佇列是一個接口,它描述了一種以佇列形式儲存元素的資料結構,遵循FIFO 先進先出的規則。

Java 開發者訪談問答分析。 第 16 - 12 部分閱讀有關集合的更多資訊。 Collections是一個實用程式類,提供許多不同的實用程式方法。例如:
  • addAll(Collection<? super T> collection, T...element) - 將傳遞的T類型元素加入到collection

  • copy(List<? super T> dest, List<? extends T> src) - 將清單src中的所有元素複製到dest中的清單。

  • emptyList() - 傳回一個空列表。

  • max(Collection<? extends T> collection, Comparator<? super T> comp) - 根據指定比較器指定的順序傳回給定集合的最大元素。

  • unmodificList(List<? extends T> list) - 傳回傳遞清單的不可修改表示形式。

Collections中有很多這樣各種方便的方法。 這些方法的完整清單可以在 Oracle 網站上Java 開發者訪談問答分析。 第 16 - 13 部分找到。我說他們舒服並不是沒有道理的。畢竟,它們都是靜態的。也就是說,您不需要每次都建立此類的物件來呼叫其必要的方法。您只需輸入類別的名稱,呼叫所需的方法並傳遞所有必需的參數。總而言之,Collection是集合框架的根介面。Collections是一個輔助類,用於更方便地處理屬於集合結構中某個類型的物件。好了,這就是今天的全部。一切順利!Java 開發者訪談問答分析。 第 16 - 14 部分
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION