<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Java 核心面試問題 – 第 1 部分 > 原文: [https://howtodoinjava.com/interview-questions/core-java-interview-questions-series-part-1/](https://howtodoinjava.com/interview-questions/core-java-interview-questions-series-part-1/) 您打算學習核心 Java 嗎? 還是計劃在未來幾天進行面試? 不用擔心,請閱讀下面給出的所有**面試問題**,以刷新您的概念,并可能在最佳 Java 列表中添加一些新內容。 ```java Interview Questions List How to create a immutable object in Java? Count all benefits? Is Java Pass by Reference or Pass by Value? What is the use of the finally block? Is finally block in Java guaranteed to be called? When finally block is NOT called? Why there are two Date classes; one in java.util package and another in java.sql? What is Marker interface? Why main() in java is declared as public static void main? What is the difference between creating String as new() and literal? How does substring() inside String works? Explain the working of HashMap. Difference between interfaces and abstract classes? When do you override hashCode and equals()? ``` ## 如何用 Java 創建不可變的對象? 算上所有好處? 不變類是一種一旦創建便無法更改其狀態的類。 在這里,對象狀態本質上是指存儲在類的實例變量中的值,無論它們是原始類型還是引用類型。 要使類不可變,需要遵循以下步驟: 1. 不要提供設置器方法或修改字段或字段引用的對象的方法。 設置器方法旨在更改對象的狀態,這是我們在此要避免的。 2. 將所有字段設為`final`和`private`。 聲明為`private`的字段將無法在該類之外訪問,將其設置為`final`將確保即使您不小心也無法更改它們。 3. 不允許子類覆蓋方法。 最簡單的方法是將類聲明為`final`。 Java 中的最終類不能被覆蓋。 4. 永遠記住,您的實例變量將是可變的或不可變的。 標識它們并返回具有所有可變對象(對象引用)復制內容的新對象。 不變的變量(原始類型)可以安全地返回,而無需付出額外的努力。 另外,您應該記住不變類的以下好處。 面試期間您可能需要它們。 不變的類: * 易于構建,測試和使用 * 自動是線程安全的,并且沒有同步問題 * 不需要復制構造器 * 不需要克隆的實現 * 允許`hashCode`使用延遲初始化,并緩存其返回值 * 用作字段時不需要防御性地復制 * 制作好`Map`鍵和`Set`元素(這些對象在集合中時不得更改狀態) * 在構造時就建立了其類不變式,因此無需再次檢查 * 始終具有“**失敗原子性**”(Joshua Bloch 使用的術語):如果不可變對象拋出異常,則永遠不會處于不希望或不確定的狀態。 看一下這篇在 Java 中[**編寫的示例**](//howtodoinjava.com/java/related-concepts/how-to-make-a-java-class-immutable/ "How to make a java class immutable")。 ## Java 是按引用傳遞還是按值傳遞? Java 規范說 Java ***都是按值傳遞***。 在 Java 中,沒有“*引用傳遞*”之類的東西。 這些術語與方法調用關聯,并將變量作為方法參數傳遞。 好吧,原始類型總是按值傳遞而不會造成任何混淆。 但是,應該在復雜類型的方法參數的上下文中理解該概念。 在 Java 中,當我們將復雜類型的引用作為任何方法參數傳遞時,總是將內存地址一點一點地復制到新的引用變量中。 見下圖: ![pass-by-value](https://img.kancloud.cn/83/6f/836fcc3915b88ae2d46b535603098a1b_597x300.png) 在上面的示例中,第一個實例的地址位被復制到另一個引用變量,因此導致兩個引用都指向存儲實際對象的單個存儲位置。 請記住,再次引用`null`不會使第一次引用也為`null`。 但是,從任一引用變量更改狀態也會對其他參考產生影響。 > 在此處詳細閱讀: [**Java 是值或引用傳遞?**](//howtodoinjava.com/java/related-concepts/java-is-pass-by-value-lets-see-how/) ## `finally`塊的用途是什么? Java 中的`finally`塊是否可以保證被調用? 何時不調用`finally`塊? 當`try`塊退出時,`finally`塊總是執行。 這樣可以確保即使發生意外異常也執行`finally`塊。 但是`finally`不僅可以用于異常處理,還可以使清除代碼意外地被`return`,`continue`或`break`繞過。 將清除代碼放在`finally`塊中始終是一個好習慣,即使沒有異常的情況也是如此。 如果在執行`try`或`catch`代碼時退出 JVM,則`finally`塊可能不會執行。 同樣,如果執行`try`或`catch`代碼的線程被中斷或殺死,則即使整個應用繼續運行,`finally`塊也可能不會執行。 ## 為什么有兩個`Date`類; 一個在`java.util`包中,另一個在`java.sql`中? `java.util.Date`代表一天中的日期和時間,`java.sql.Date`僅代表日期。 `java.sql.Date`的補碼為`java.sql.Time`,僅代表一天中的某個時間。 `java.sql.Date`是`java.util.Date`的子類(擴展)。 因此,`java.sql.Date`中發生了什么變化: – `toString()`生成不同的字符串表示形式:`yyyy-mm-dd` – 一種`static valueOf(String)`方法,從具有上述表示形式的字符串中創建日期 – 獲取器和設置器數小時 ,不建議使用分鐘和秒 `java.sql.Date`類與 JDBC 一起使用,并且不應包含時間部分,即小時,分鐘,秒和毫秒應為零…但是該類未強制執行。 ## 解釋標記接口? 標記接口模式是計算機科學中的一種設計模式,與**提供有關對象**的運行時類型信息的語言一起使用。 **它提供了一種方法,可將元數據與該語言不明確支持此類的類相關聯。** 在 Java 中,它用作未指定方法的接口。 在 Java 中使用標記接口的一個很好的例子是[Serializable](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/ "A mini guide for implementing serializable interface in?java")接口。 一個類實現此接口,以指示可以將其非瞬態數據成員寫入字節流或文件系統。 標記接口的*主要問題*是,接口定義用于實現類的協定,并且該協定被所有子類繼承。 這意味著**您不能“取消實現”標記**。 在給定的示例中,如果創建不想序列化的子類(可能是因為它依賴于瞬態),則必須訴諸顯式拋出`NotSerializableException`。 ## 為什么將 Java 中的`main()`聲明為`public static void`? ***為什么公開?*** `main`方法是`public`,因此它可以在任何地方訪問,并且對于可能希望使用它啟動應用的每個對象都可以訪問。 在這里,我并不是說 JDK / JRE 具有類似的原因,因為`java.exe`或`javaw.exe`(對于 Windows)使用 Java 本機接口(JNI)調用來調用方法,因此,無論使用哪種訪問修飾符,他們都可以通過任何一種方式來調用它。 ***為什么是靜態?*** 假設我們沒有像`static`那樣的主要方法。 現在,要調用任何方法,您需要它的一個實例。 對? 眾所周知,Java 可以有重載的構造器。 現在,應該使用哪一個,重載的構造器的參數從何而來。 ***為什么`void`?*** 因此,沒有任何將值返回給實際調用此方法的 JVM 的用途。 應用唯一想與調用過程進行通信的是:正常終止或異常終止。 使用`System.exit(int)`已經可以實現。 非零值表示異常終止,否則一切正常。 ## 將 String 創建為`new()`和字面值之間有什么區別? 當我們使用`new()`創建`String`時,它會在堆中創建并添加到字符串池中,而使用字面值創建的`String`僅在字符串池中創建,而字符串池僅存在于堆的永久區域中。 那么,您真的需要非常深入地了解字符串池的概念,才能回答此問題或類似問題。 我的建議...“認真學習”[字符串類和字符串池](//howtodoinjava.com/java/string/interview-stuff-about-string-class-in-java/ "String pool concepts")。 ## `String`中的`substring()`如何工作? Java 中的`String`與其他任何編程語言一樣,都是字符序列。 這更像是用于該`char`序列的工具類。 此`char`序列在以下變量中維護: ```java /** The value is used for character storage. */ private final char value[]; ``` 要在不同情況下訪問此數組,請使用以下變量: ```java /** The offset is the first index of the storage that is used. */ private final int offset; /** The count is the number of characters in the String. */ private final int count; ``` 每當我們從任何現有的字符串實例創建子字符串時,`substring()`方法都只會設置`offset`和`count`變量的新值。 內部`char`數組不變。 如果不小心使用`substring()`方法,這可能是內存泄漏的原因。 [在此處了解更多信息](//howtodoinjava.com/java/string/interview-stuff-about-string-class-in-java/ "interview stuff about string class")。 ## 解釋`HashMap`的工作。 如何解決重復沖突? 你們大多數人都會同意,`HashMap`是當今面試中最喜歡討論的話題。 如果有人要我描述“`HashMap`如何工作?”,我只是回答:“**關于哈希**的原理”。 就這么簡單。 現在,以最簡單的形式進行哈希處理是一種在對屬性應用任何公式/算法之后為任何變量/對象分配唯一代碼的方法。 **定義的映射是:“將鍵映射到值的對象”**。 很容易..對嗎? 因此,`HashMap`有一個內部類`Entry`,它看起來像這樣: ```java static class Entry<k ,V> implements Map.Entry<k ,V> { final K key; V value; Entry<k ,V> next; final int hash; ...//More code goes here } ``` 當某人嘗試將鍵值對存儲在`HashMap`中時,會發生以下情況: * 首先,檢查鍵對象是否為空。 如果`key`為`null`,則值存儲在`table[0]`位置。 因為`null`的哈希碼始終為 0。 * 然后,下一步,通過調用鍵的`hashCode()`方法,使用鍵的哈希碼計算哈希值。 該哈希值用于計算數組中用于存儲`Entry`對象的索引。 JDK 設計人員很好地假設可能存在一些編寫不當的`hashCode()`函數,它們可能返回非常高或很低的哈希碼值。 為解決此問題,他們引入了另一個`hash()`函數,并將對象的哈希碼傳遞給此`hash()`函數,以將哈希值帶入數組索引大小的范圍內。 * 現在,調用`indexFor(hash, table.length)`函數來計算用于存儲`Entry`對象的精確索引位置。 * 這是主要部分。 現在,我們知道兩個不相等的對象可以具有相同的哈希碼值,如何將兩個不同的對象存儲在相同的數組位置(稱為存儲桶)中。 答案是`LinkedList`。 如果您還記得的話,`Entry`類的屬性為`next`。 此屬性始終指向鏈中的下一個對象。 這正是`LinkedList`的行為。 因此,在發生碰撞的情況下,`Entry`對象以`LinkedList`形式存儲。 當`Entry`對象需要存儲在特定索引中時,`HashMap`檢查是否已經有一個項目? 如果尚無項目,則`Entry`對象存儲在此位置。 如果已經有一個對象位于計算索引上,則檢查其`next`屬性。 如果為`null`,則當前`Entry`對象成為`LinkedList`中的`next`節點。 如果`next`變量不為空,則遵循步驟直到`next`被求值為空。 如果我們添加另一個具有與之前輸入相同的鍵的值對象,該怎么辦。 從邏輯上講,它應該替換舊值。 怎么做的? 好吧,在確定`Entry`對象的`index`位置之后,在對計算索引上的`LinkedList`進行迭代時,`HashMap`為每個`Entry`對象調用關鍵對象上的`equals()`方法。 `LinkedList`中的所有這些`Entry`對象將具有相似的哈希碼,但`equals()`方法將測試真實相等性。 如果`key.equals(k)`為`true`,則兩個鍵都被視為相同的鍵對象。 這將僅導致替換`Entry`對象中的`value`對象。 這樣,`HashMap`確保鍵的唯一性。 ## 接口和抽象類之間的區別? 如果您正在面試初級程序員,這是一個非常常見的問題。 好吧,最明顯的區別如下: * 在 Java 接口中聲明的變量默認為`final`。 抽象類可能包含非最終變量。 * Java 接口是隱式`abstract`,不能具有實現。 Java 抽象類可以具有實現默認行為的實例方法。 * 默認情況下,Java 接口的成員是公開的。 Java 抽象類可以具有類成員通常的風格,例如`private`或`abstract`等。 * Java 接口應使用關鍵字“`implements`”實現; Java 抽象類應使用關鍵字“`extends`”來擴展。 * Java 類可以實現多個接口,但只能擴展一個抽象類。 * 接口是絕對抽象,不能實例化; Java 抽象類也無法實例化,但是可以在存在`main()`的情況下調用。 從 Java8 開始,您可以在接口中定義[**默認方法**](//howtodoinjava.com/java8/default-methods-in-java-8/)。 * 抽象類比接口要快一些,因為接口涉及在 Java 中調用任何覆蓋方法之前進行的搜索。 在大多數情況下,這并不是顯著的差異,但是如果您正在編寫時間緊迫的應用,那么您可能不想無所事事。 ## 何時覆蓋`hashCode()`和`equals()`? `hashCode()`和`equals()`方法已在`Object`類中定義,該類是 Java 對象的父類。 因此,所有 java 對象都繼承這些方法的默認實現。 `hashCode()`方法用于獲取給定對象的唯一整數。 當此對象需要存儲在類似數據結構的`HashTable`中時,該整數用于確定存儲桶位置。 默認情況下,對象的`hashCode()`方法返回并以整數形式表示存儲對象的內存地址。 顧名思義, `equals()`方法用于簡單地驗證兩個對象的相等性。 默認實現只是檢查兩個對象的對象引用以驗證它們的相等性。 請注意,通常有必要在每次覆蓋此方法時都覆蓋`hashCode`方法,以維護`hashCode()`方法的常規約定,該約定規定相等的對象必須具有相等的哈希碼。 * `equals()`必須定義一個相等關系(它必須是**自反,對稱和可傳遞**)。 另外,它必須是一致的(如果未修改對象,則它必須保持返回相同的值)。 此外,`o.equals(null)`必須始終返回`false`。 * `hashCode()`也必須保持一致(如果未根據`equals()`修改對象,則它必須保持返回相同的值)。 兩種方法之間的關系為: 每當`a.equals(b)`時,`a.hashCode()`必須與`b.hashCode()`相同。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看