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

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

在 Random-TW 群組發布
你好世界!持續開發對於任何開發人員來說都非常重要。畢竟,如果你停下來,就有可能無人認領並完全飛出市場:IT世界不斷發展和前進,你需要隨之前進。但即便如此,我們也不能只專注於新技術,以免忘記經典(經典話題)。今天我想繼續分析Java開發人員的「經典」主題問題。 Java 開發者訪談問答分析。 第 6 - 1 部分我注意到我的答案並不是最終權威——這只是我對這些問題的正確答案的看法,你可能不同意其中的一些答案。這很正常,所以請隨時在評論中分享您的意見。部分分析的連結位於文章末尾。Java 開發者訪談問答分析。 第 6 - 2 部分

圖書館和標準

52.什麼是休眠?JPA 和 Hibernate 有什麼不同?

我認為要回答這個問題,我們首先需要了解JPA是什麼。 JPA是一種規範,描述簡單 Java 物件的物件關係映射,並提供用於儲存、檢索和操作此類物件的 API。也就是說,正如我們所記得的,關係資料庫(DB)以許多互連表的形式呈現。JPA是一個被廣泛接受的標準它描述了物件如何與關聯式資料庫互動。正如您所看到的,JPA是抽象的、無形的東西。這就像想法本身、方法一樣。Java 開發者訪談問答分析。 第 6 - 3 部分同時,Hibernate是一個實作JPA範例的特定函式庫。也就是說,借助該庫,您可以透過代表資料庫(實體)資料的物件來使用關聯式資料庫。正如他們所說,這個庫非常接近JPA的理想,也許這就是它變得流行的原因。正如您所理解的,使用的普及是進一步開發和改進的一個很好的論點。此外,在其頻繁使用的背後有一個龐大的社區,該社區已經整理了與該工具相關的所有可能和不可能的問題。這是一本書的範例,詳細研究了這項技術的所有黑暗角落。也就是說,Hibernate 已被盡可能多地研究過,並且事實證明是可靠的。事實上,即使是 Spring 端 JPA 的理想實作通常也會在底層使用 Hibernate,這並非沒有原因。

53.什麼是級聯?在Hibernate中是如何使用的?

正如我之前所說,在 Hibernate 中,通訊是透過稱為實體的資料物件進行的。這些實體代表資料庫中的一些特定表,您還記得,在 Java 中,類別可以包含對其他類別的參考。這些關係反映在資料庫中。在資料庫中,通常,這些是外鍵(對於 OneToOne、OneToMany、ManyToOne)或中間表(對於 ManyToMany)。您可以在本文中閱讀有關實體之間關係的更多資訊。當您的實體有到其他相關實體的連結時,註解會放置在這些連結上方以指示連接類型:@OneToOne、@OneToMany、@ManyToOne、@ManyToMane,在其參數中您可以指定屬性的值 -級聯-此連線的級聯類型。JPA有與實體互動的特定方法(持久、保存、合併...)級聯類型精確地用於顯示在目標實體上使用這些方法時關聯資料的行為方式。那麼,級聯策略(級聯的類型)有哪些呢?JPA 標準暗示使用六種類型的級聯:
  • PERSIST - 儲存作業將會級聯發生(對於save()persist()方法)。也就是說,如果我們保存與其他實體關聯的實體,它們也會保存在資料庫中(如果它們尚不存在)

  • MERGE - 更新作業將會級聯發生(對於merge()方法)

  • REMOVE - 刪除操作級聯發生(remove()方法)

  • ALL - 同時包含三個級聯操作 - PERSIST - MERGE - REMOVE

JPA有持久實體的概念- 與其在資料庫中的資料關聯的實體,由當前會話(連接)控制如果變更它,但不將變更儲存到資料庫中,則其在資料庫中的資料仍然會變更。
  • DETACH相關實體將不會由會話管理(detach()方法)。也就是說,當它們發生變化時,它們在資料庫中的資料不會自動發生變化——它們從持久化狀態轉移到分離狀態(不由JPA管理的實體)

  • REFRESH - 每次使用資料庫中的資料更新實體(刷新() - 更新分離的物件)時,相關實體都會以相同的方式更新。例如,您以某種方式變更了從資料庫中取得的資料並希望傳回其原始值。在這種情況下,此操作將對您有用。

Java 開發者訪談問答分析。 第 6 - 4 部分Hibernate 支援所有這些標準級聯操作,但也引入了三個自己的操作:
  • REPLICATE - 當我們有多個資料來源並且希望資料同步時使用(Hibernate 方法 - 複製)。所有實體都必須有識別符(id),這樣它們的生成才不會出現問題(這樣同一個實體對於不同的資料庫不會有不同的id)

  • SAVE_UPDATE - 級聯保存/刪除(對於 Hibernate 方法 - saveOrUpdate

  • LOCK是DETACHED的逆操作:它將分離的實體轉移回持久化狀態,即 實體將再次被當前會話追蹤

如果未選擇級聯類型,則對實體的任何操作都不會影響與其關聯的其他實體。

54.實體類別可以是抽象的嗎?

JPA 規範的2.1 實體類別中有一行:“抽象類別和具體類別都可以是實體。” 所以答案是肯定的,抽象類別可以是一個實體,可以用@Entity註解。

55.什麼是實體管理者?他負責什麼?

首先,我想指出EntityManager是JPA 的關鍵元件之一,用於實體與資料庫的互動。一般來說,它會呼叫實體和資料庫之間的互動方法(持久、合併、刪除、分離)...但我還要注意的是,這個元件通常並不適用於整個應用程式:大多數情況下它是輕量級的,經常被刪除,並使用EntityManagerFactory建立一個新的。如果我們與JDBC進行類比,其中EntityManagerFactory將是DataSource 的類似物,那麼EntityManager又會是Connection的類似物。前面我提到了持久性實體,它是由目前連線控制的實體。因此:該實體由 EntityManager精確管理,EntityManager 與目前連線和TransactionManager密切相關,TransactionManager 負責開啟/關閉交易。進一步在下圖中可以看到實體的生命週期:Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 5EntityManager在實體處於Managed階段時對實體進行管理(此時它是持久的,因為它與EntityManager有連線)。也就是說,它不再是新的並且尚未被刪除。我們可以說,當一個實體是新的或被刪除時,它也是分開的,因為 它不由 EntityManager 管理。EntityManager 有不同的策略。也就是說,整個應用程式可以有一個單例 EntityManager,也可以每次為每個連線建立一個新的 EntityManager。如果您使用 Spring,那麼 EntityManager 的建立/刪除是在幕後自動控制的(但這並不意味著您不能自訂它^^)。值得一提的是,一個或多個 EntityManager 形成了持久化上下文持久性上下文是一個環境,​​其中實體的實例與資料庫中的類似實體同步(正如我所說,這只適用於持久性實體)。如果您深入研究JPA(我強烈推薦),您會非常非常頻繁地遇到這些概念。

56.什麼是Assert類別?為什麼要使用它?

我在JPA中沒有聽說過這樣的類,所以我假設它指的是庫的JUnit類,它用於程式碼的單元測試。這個函式庫的類別Assert是用來檢查程式碼執行的結果(assert是一個聲明,表示你在某個地方有某個狀態/資料)。例如,您正在測試一種應該創建一隻貓的方法。您運行一個方法並得到一些結果:
Cat resultOfTest = createCat();
但您需要確保它已正確創建,對嗎?因此,您之前手動創建了一隻特定的貓(expectedCat ),其參數與您期望從createCat()方法 獲得的貓的參數完全相同。接下來,您使用Assert類別來驗證結果:
Assert.assertEquals(resultOfTest, expectedCat);
如果貓不同,就會拋出AssertionError異常,這告訴我們預期的結果不收斂。Assert類別有許多不同的方法,涵蓋了驗證預期結果的許多任務。這裡是其中的一些:
  • assertTrue(<boolean>) - 作為參數接收的預期值必須為true

  • assertFalse(<boolean>) - 作為參數接收的預期值應該是false

  • assertNotEquals(<object1>, <object2>) - 使用 equals 進行比較時,作為參數接收的物件必須不同 ( false )

  • assertThrows(<ClassNameOfException>.class, <exceptionObject>) - 第二個參數應該是第一個參數指定的類別的異常(即,通常,呼叫一個方法來取代第二個參數,該方法應該拋出所需類型的異常)

細繩

57. Java 中的字串特徵

String是Java中的一個標準類,負責儲存和操作字串值(字元序列),是一個不可變的類別(我之前寫過不可變的),即 此類物件的資料在創建後就無法更改。我想立即指出,StringBuilderStringBuffer類是兩個幾乎相同的類,唯一的區別是其中一個類別用於多執行緒環境(StringBuffer)。這些類別類似於String,但不同的是,它們是可變的。也就是說,物件一旦創建,就允許修改它們表示的字串,而無需建立新物件。實際上,這些方法與標準的String方法不同,旨在滿足更改字串的需求(它們被稱為建構器並不是沒有道理的)。在本文中閱讀有關StringStringBufferStringBuilder的更多資訊。

58. 建立 String 物件有哪些不同的方法?它是在哪裡創建的?

建立字串的最常見方法是簡單地在雙括號中指定我們需要的值:
String str = "Hello World!";
您也可以直接透過new執行此操作:
String str = new String("Hello World!");
您可以從字元數組開始建立一個字串:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
由於toString方法在某個物件上運行:
String str = someObject.toString();
與任何其他方法的結果一樣,它會傳回一個字串表示形式。例如:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
如您所知,建立字串的方法可以有非常非常多。當創建String物件時,它將儲存在字串池中,我們將在下面的問題之一中更詳細地討論這一點。

59. Java中如何比較兩個字串以及如何對它們進行排序?

Java 使用雙等號==來比較值。如果我們需要比較一些簡單的值,例如int,我們會使用它。但這種方法不適用於比較成熟的物件。在這種情況下,它只會比較引用 - 無論它們是否指向同一個物件。也就是說,當比較兩個內部欄位值完全相同的物件時,透過==進行比較將得到結果false:儘管物件的欄位相同,但物件本身佔用不同的記憶體單元。String類別的物件儘管看似簡單,但仍是物件。透過==進行比較也不適用於它們(即使存在字串池)。這裡, Object類別的標準方法開始發揮作用- equals,必須在類別中重寫它才能正常工作(否則,預設情況下它使用==進行比較)。它在String類別中被重寫,因此我們只需獲取並使用它:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 6我們討論了匹配比較,現在讓我們看看排序比較。畢竟,要對某些東西進行排序,我們需要知道要按照什麼原則進行排序。為此,您可以使用標準排序集 - TreeSet您可以在本文中閱讀有關 Java 中各種集合的更多資訊。此清單基於紅黑樹演算法工作,並按照指定的排序原則對集合進行排序。正如我之前所說,您需要了解如何對某種類型的物件進行排序。比較器用於設定排序的比較方法。通常,這些需要為要排序的類別實現,但對於String,它們已經實現。因此,我們只需將所需的行添加到TreeSet中,它就會對它們進行排序:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
控制台輸出:
ABC

60.給出一個將字串轉換為字元的演算法。編寫適當的程式碼

正如我之前所說,String類別的物件有許多不同的有用方法。其中之一就是toCharArray。該方法將字串轉換為字元數組:
String str = "Hello world";
char[] charArr = str.toCharArray();
接下來我們有一個可以透過索引呼叫的字元數組:
char firstChar = charArr[0]; // H

61. 如何將字串與位元組陣列相互轉換?編寫適當的程式碼

與toCharArray方法類似,String類別有一個getBytes方法,它傳回字串的位元組數組:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
今天的分析部分已經到了邏輯的終點。感謝您的關注!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 7
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION