<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 核心面試問題 – 第 3 部分 > 原文: [https://howtodoinjava.com/interview-questions/core-java-interview-questions-series-part-3/](https://howtodoinjava.com/interview-questions/core-java-interview-questions-series-part-3/) 在 [**面試問題系列中:第 1 部分**](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-1/ "Core java interview questions series : Part?1")和[**第 2 部分**](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-2/ "Core java interview questions series : Part?2"),我們討論了面試官通常會問的一些重要問題。 現在是推進該討論的時候了。 在這篇文章中,我將在下面給出的問題列表中進行討論。 ```java Deep copy and shallow copy? What is synchronization? Class level locking and object level locking? Difference between sleep() and wait()? Can you assign null to this reference variable? What if the difference between && and &?? How to override equals and hashCode() methods? Explain all access modifiers? What is garbage collection? Can we enforce it? What is native keyword? What is serialization? Explain the catches? ``` ## 深拷貝和淺拷貝? 克隆是原始副本的精確副本。 在 Java 中,它實質上意味著能夠創建狀態與原始對象相似的對象。`clone()`方法提供了此功能。 淺拷貝應盡可能少地重復。 默認情況下,Java 克隆是淺表復制或“逐字段復制”,即,由于`Object`類不了解將在其上調用`clone()`方法的類的結構。 因此,JVM 被要求克隆時,請執行以下操作: 1)如果該類只有原始數據類型成員,則將創建該對象的全新副本,并返回對該新對象副本的引用。 2)如果該類包含任何類類型的成員,則僅復制對那些成員的對象引用,因此原始對象和克隆對象中的成員引用都引用同一對象。 深層副本會復制所有內容。 集合的深層副本是兩個集合,原始集合中的所有元素都重復了。 在這里,我們想要一個獨立于原始版本的克隆,對克隆進行更改不應影響原始版本。 *深度克隆要求滿足以下規則。* 1. 無需單獨復制原始類型。 2. 原始類中的所有成員類都應支持克隆,而上下文中原始類的`clone`方法應在所有成員類上調用`super.clone()`。 3. 如果任何成員類不支持克隆,則必須在克隆方法中創建該成員類的新實例,并將其所有屬性一一復制到新的成員類對象中。 這個新的成員類對象將在克隆對象中設置。 [在此處詳細了解克隆](//howtodoinjava.com/java/cloning/a-guide-to-object-cloning-in-java/ "A guide to object cloning in?java")。 ## 什么是同步? 對象級鎖定和類級鎖定? ***同步***是指多線程。 同步的代碼塊一次只能由一個線程執行。 Java 支持執行多個線程。 這可能會導致兩個或多個線程訪問相同的字段或對象。 同步是使所有并發線程在執行中保持同步的過程。 同步避免了由于共享內存視圖不一致而導致的內存一致性錯誤。 當方法聲明為已同步時; 該線程持有該方法對象的監視器。如果另一個線程正在執行同步方法,則該線程將被阻塞,直到該線程釋放監視器。 Java 中的同步是使用`syncronized`關鍵字實現的。 您可以在類中的已定義方法或塊上使用`syncronized`關鍵字。 關鍵字不能與類定義中的變量或屬性一起使用。 ***對象級別鎖定***是一種機制,當您要同步非靜態方法或非靜態代碼塊,以便僅一個線程將能夠在給定實例的代碼上執行代碼塊時, 類。 應該始終這樣做以確保實例級數據線程安全。 ***類級別鎖定***可防止多個線程在運行時進入所有可用實例中的任何同步塊。 這意味著,如果在運行時有 100 個`DemoClass`實例,則一次只能在一個實例中的任何一個線程上執行`demoMethod()`,而所有其他實例將被其他線程鎖定。 為了確保靜態數據線程的安全,應該始終這樣做。 [在此處了解有關同步的更多信息。](//howtodoinjava.com/java/multi-threading/thread-synchronization-object-level-locking-and-class-level-locking/ "Thread synchronization, object level locking and class level?locking") ## `sleep()`和`wait()`之間的區別? `sleep()`是一種用于將進程保留幾秒鐘或所需時間的方法,但是如果使用`wait()`方法,線程將進入等待狀態,直到我們調用`notify()`或`notifyAll()`。 主要區別在于,`wait()`釋放鎖定或監視器,而`sleep()`不在等待期間釋放任何鎖或監視器。 通常,“等待”用于線程間通信,而“睡眠”用于引入執行暫停。 `Thread.sleep()`在一段時間內將當前線程發送到“不可運行”狀態。 該線程將保留其已獲取的監視器 - 即,如果該線程當前處于同步塊或方法中,則其他線程無法進入該塊或方法。 如果另一個線程調用`t.interrupt()`,它將喚醒睡眠線程。 請注意,`sleep`是一種靜態方法,這意味著它始終會影響當前線程(正在執行`sleep`方法的線程)。 一個常見的錯誤是調用`t.sleep()`,其中`t`是一個不同的線程。 即使這樣,當前線程仍將睡眠,而不是`t`線程。 `object.wait()`將當前線程發送到“不可運行”狀態,就像`sleep()`一樣,但要稍加調整。 `Wait`是在對象而不是線程上調用的; 我們將此對象稱為“鎖定對象”。 在調用`lock.wait()`之前,當前線程必須在鎖對象上進行同步。 然后,`wait()`釋放此鎖定,并將線程添加到與該鎖定關聯的“等待列表”。 稍后,另一個線程可以在同一個鎖對象上同步并調用`lock.notify()`。 這將喚醒原始的等待線程。 基本上,`wait()`/`notify()`就像`sleep()`/`interrupt()`一樣,僅活動線程不需要直接指針指向睡眠線程,而僅需要指向共享鎖對象的指針。 [在此處詳細閱讀區別。](//howtodoinjava.com/java/multi-threading/difference-between-sleep-and-wait/ "Difference between sleep() and?wait()?") ## 可以為`this`引用變量分配`null`嗎? 沒有。 你不能。在 Java 中,賦值語句的左側必須是變量。 “`this`”是一個特殊的關鍵字,始終代表當前實例。 這不是任何變量。 同樣,不能將`null`分配給“`super`”或任何此類關鍵字。 ## `&&`和`&`之間是否有區別? `&`是按位的,`&&`是邏輯的。 * `&`求值操作的雙方。 * `&&`求值操作的左側,如果為真,則繼續并求值右側。 [請閱讀此處以深入了解。](https://en.wikipedia.org/wiki/Bitwise_operation "bitwise operations") ## 如何覆蓋`equals`和`hashCode()`方法? `hashCode()`和`equals()`方法已在`Object`類中定義,`Object`類是 Java 對象的父類。 因此,所有 java 對象都繼承這些方法的默認實現。 `hashCode()`方法用于獲取給定對象的唯一整數。 當此對象需要存儲在類似數據結構的`HashTable`中時,此整數用于確定存儲桶位置。 默認情況下,對象的`hashCode()`方法返回存儲對象的內存地址的整數表示形式。 顧名思義,`equals()`方法用于簡單地驗證兩個對象的相等性。 默認實現只是檢查兩個對象的對象引用以驗證它們的相等性。 以下是在覆蓋這些函數時要記住的要點。 1. 始終使用對象的相同屬性來生成`hashCode()`和`equals()`兩者。 在本例中,我們使用了員工 ID。 2. `equals(`)必須一致(如果未修改對象,則必須保持返回相同的值)。 3. 只要`a.equals(b)`,則`a.hashCode()`必須與`b.hashCode()`相同。 4. 如果覆蓋一個,則應覆蓋另一個。 [在此處閱讀更多有趣的事實以及指南。](//howtodoinjava.com/java/related-concepts/working-with-hashcode-and-equals-methods-in-java/ "Working with hashCode and equals methods in?java") ## 解釋所有訪問修飾符? Java 類,字段,構造器和方法可以具有四種不同的訪問修飾符之一: ***`private`*** 如果將方法或變量標記為私有,則只有同一類內的代碼才能訪問該變量或調用該方法。 子類中的代碼無法訪問變量或方法,也不能從任何外部類中進行代碼。 如果將一個類標記為私有,則沒有外部類可以訪問該類。 不過,對于類來說,這實際上沒有多大意義。 因此,訪問修飾符`private`主要用于字段,構造器和方法。 ***默認*** 通過根本不編寫任何訪問修飾符來聲明默認訪問級別。 默認訪問級別意味著與類相同的包中的類本身內的代碼+類內的代碼可以訪問類,字段,構造器或方法。 因此,默認訪問修飾符有時也稱為包訪問修飾符。 如果子類聲明了默認的可訪問性,則子類不能訪問父類中的方法和成員變量,除非子類與父類位于同一包中。 ***`protected`*** `protected`訪問修飾符的作用與默認訪問權限相同,除了子類還可以訪問超類的受保護方法和成員變量。 即使子類與超類不在同一個包中,也是如此。 ***`public`*** 公開訪問修飾符意味著所有代碼都可以訪問類,字段,構造器或方法,無論訪問代碼位于何處。 | ***修飾符*** | *相同的類* | *相同的包* | *子類* | *其他包* | | --- | --- | --- | | `public` | Y | Y | Y | Y | | `protected` | Y | Y | Y | N | | 默認 | Y | Y | N | N | | `private` | Y | N | N | N | ## 什么是垃圾回收? 我們可以執行嗎? 垃圾回收是許多現代編程語言(例如 Java 和 .NET 框架中的語言)中的自動內存管理功能。 使用垃圾回收的語言通常在 JVM 之類的虛擬機中解釋或運行。 在每種情況下,運行代碼的環境還負責垃圾回收。 GC 具有兩個目標:應釋放所有未使用的內存,并且除非程序不再使用它,否則不應釋放任何內存。 你能強迫垃圾收集嗎? 不,`System.gc()`盡可能接近。 最好的選擇是調用`System.gc()`,這只是向垃圾收集器提示您要它進行收集。 由于垃圾收集器是不確定的,因此無法強制立即收集。 另外,在`OutOfMemoryError`文檔下,它聲明除非 VM 在完全垃圾回收后未能回收內存,否則不會拋出該錯誤。 因此,如果在出現錯誤之前一直分配內存,那么您將已經強制執行完整的垃圾回收。 [在此處詳細了解垃圾收集。](//howtodoinjava.com/java/garbage-collection/revisiting-memory-management-and-garbage-collection-mechanisms-in-java/ "Revisiting memory management and garbage collection mechanisms in?java") ## 什么是`native關鍵字? 詳細解釋? 將`native`關鍵字應用于方法,以指示該方法是使用 JNI 在本地代碼中實現的。 它標記了一種方法,它將以其他語言而不是 Java 來實現。 過去曾使用本機方法來編寫對性能至關重要的部分,但隨著 Java 變得越來越快,這種方法現在已不那么普遍了。 當前需要本機方法 * 您需要從 Java 調用用其他語言編寫的庫。 * 您需要訪問只能從其他語言(通常為 C)訪問的系統或硬件資源。 實際上,許多與真實計算機交互的系統功能(例如磁盤和網絡 IO)只能執行此操作,因為它們調用了本機代碼。 使用本機代碼庫的缺點也很重要: 1. JNI/JNA 傾向于破壞 JVM 的穩定性,尤其是當您嘗試做一些復雜的事情時。 如果您的本機代碼錯誤地執行了本機代碼內存管理,則很有可能會使 JVM 崩潰。 如果您的本機代碼是不可重入的,并且從多個 Java 線程中調用,則壞事……會偶爾發生。 等等。 2. 帶有本機代碼的 Java 比純 Java 或純 C/C++ 更難調試。 3. 本機代碼可能為其他平臺無關的 Java 應用引入重要的平臺依賴項/問題。 4. 本機代碼需要一個單獨的構建框架,并且也可能存在平臺/可移植性問題。 ## 什么是序列化? 解釋漁獲物? 在計算機科學中,在數據存儲和傳輸的上下文中,序列化是將數據結構或對象狀態轉換為一種格式的過程,該格式可以稍后在相同或另一臺計算機環境中存儲和恢復。 當根據序列化格式重新讀取生成的一系列位時,可以使用它來創建原始對象的語義相同的克隆。 Java 提供了自動序列化,該序列化要求通過實現`java.io.Serializable`接口來標記對象。 實現該接口會將類標記為“可以序列化”,然后 Java 將在內部處理序列化。 在`Serializable`接口上沒有定義任何序列化方法,但是可序列化類可以選擇定義具有某些特殊名稱和簽名的方法,如果定義了這些特殊名稱和簽名,這些方法將在序列化/反序列化過程中被調用。 對象序列化后,其類中的更改會破壞反序列化過程。 要確定您的類中將來的變化,這些變化將是兼容的,而其他變化將被證明是不兼容的,請在此處閱讀完整的[**指南**](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/ "A mini guide for implementing serializable interface in?java")。 簡而言之,我在這里列出: **不兼容的更改** * 刪除字段 * 將類上移或下移 * 將非靜態字段更改為靜態或將非瞬態字段更改為瞬態 * 更改原始字段的聲明類型 * 更改`writeObject`或`readObject`方法,使其不再寫入或讀取默認字段數據 * 將類從可序列化更改為可外部化,反之亦然 * 將類從非枚舉類型更改為枚舉類型,反之亦然 * 刪除`Serializable`或`Externalizable` * 將`writeReplace`或`readResolve`方法添加到類 **兼容的更改** * 新增字段 * 添加/刪除類 * 添加`writeObject`/`readObject`方法(首先應調用`defaultReadObject`或`defaultWriteObject`) * 刪除`writeObject`/`readObject`方法 * 添加`java.io.Serializable` * 更改對字段的訪問 * 將字段從靜態更改為非靜態或將瞬態更改為非瞬態 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看