總覽
在Internet上,Java面試問題和答案從一個網站復制到另一個網站。 這可能意味著錯誤或過時的答案可能永遠不會得到糾正。 這是一些不太正確或已經過時的問題和答案。 即是Java 5.0之前的版本。
每個提供的問題后都有兩個部分。 斜體的第一部分指示答案不完整/錯誤。 最后一部分以純格式提供完整/正確的答案。
參數可以通過幾種方式傳遞給子例程并進行解釋?
參數可以通過兩種方式傳遞。 它們通過價值傳遞,通過參考傳遞。
按值傳遞:此方法將參數的值復制到子例程的形式參數中。
通過引用傳遞:在此方法中,對參數的引用(而不是參數的值)傳遞給參數。
Java僅支持按值傳遞。 您可以按值傳遞引用,但是在Java中不能按引用傳遞。 Java引用可以描述為“通過共享調用”,但這并不常用。
什么是垃圾回收?如何明確調用它?
當某個對象不再由任何變量引用時,java會自動回收該對象使用的內存。 這稱為垃圾收集。 系統。 gc()方法可用于顯式調用它。
當對象不再具有來自Root上下文的強引用時,就可以進行清除。 具有弱參考或軟參考的對象可以清除。 沒有強引用的對象可能無法清除(即,沒有保證將運行GC,次要GC不會清除使用期限的對象)
System.gc() 提示應該運行Full GC。 可以使用命令行選項禁用它。
什么是瞬態和揮發性修飾劑?
瞬態:瞬態修飾符僅適用于變量,并且不存儲為對象持久性狀態的一部分。 暫態變量未序列化。
易失性:易失性修飾符僅適用于變量,它告訴編譯器,由易失性修改的變量可能會被程序的其他部分意外更改。
瞬態只能應用于字段,而不能應用于局部變量。 它可以應用于靜態變量,但通常會被忽略。 臨時字段不會自動序列化,但是可以通過自定義序列化進行序列化,例如writeObject和readObject()
volatile只能應用于字段,并告訴JIT而不是告訴編譯器,每次訪問都必須獲取該字段的緩存一致性副本。 (通常來自“主”內存)
解釋關鍵字transient的用法?
此關鍵字指示此成員變量的值不必與對象序列化。 當將反序列化該類時,將使用其數據類型的默認值(即,對于整數為零)來初始化此變量。
此關鍵字表示該字段不能自動序列化。 它不會自動反序列化,并保留該字段的默認值。 Integer的默認值為null 。 int的默認值為0
什么是方法重載和方法重載?
方法重載:當類中具有相同方法名,不同參數的方法被稱為方法重載時。
方法覆蓋:當類中具有相同方法名稱和相同參數的方法被稱為方法覆蓋。
當兩個方法具有相同的名稱但簽名不同時,就會發生方法重載。 簽名包括參數類型和通用類型。 可以使用不同的參數調用單個方法,而可以使用相同的參數調用兩個重載方法。 即它的簽名而不是重要的論據。
僅當子類具有與父類中的方法相同的簽名時,才發生方法重寫。
Integer和int有什么區別?
- 整數是在Java中定義的類。 lang包,而int是用Java語言本身定義的原始數據類型。 Java不會自動從一種轉換為另一種。
- 整數可以用作需要對象的方法的參數,而整數可以用于計算。
Integer是對包裝int的對象的引用。自添加自動裝箱和拆箱以來,主要區別在于Integer可以為null,并且==運算符比較Integer的引用和int類型的實際值。
Integer i1 = 1;
Integer i2 = 1;
// true as the same autoboxed Integer is used.
System.out.println(i1 == i2); Integer i3 = -200;
Integer i4 = -200;
// false as different autoboxed Integer objects are used.
System.out.println(i3 == i4);
線程的不同狀態是什么?
不同的線程狀態為就緒,運行,等待和死機。
由于Java 5.0應該是正在開發的大多數Java系統,因此Thread.State類將線程可能的狀態列出為
- NEW –尚未啟動的線程處于此狀態。
- 可運行–在Java虛擬機中執行的線程處于此狀態。
- BLOCKED –已阻塞,等待監視器鎖定的線程處于此狀態。
- 等待中–無限期等待另一個線程執行特定操作的線程處于此狀態。
- TIMED_WAITING –正在等待另一個線程執行操作的線程最多達到指定的等待時間,該線程處于此狀態。
- 終止–退出的線程處于此狀態。
所有班級的基礎班是哪一個?
java.lang.Object
對于自定義類,這是正確的。 對于基本類型,例如int.class,void.class和Object本身沒有超類。
Class parent = boolean.class.getSuperclass(); // returns null
什么是守護線程?
在后臺運行的Theards [sic]被稱為守護進程線程。 守護程序線程是一個線程,一旦進入運行狀態,該線程便沒有任何機會運行其他線程,而它也沒有任何機會運行其他線程。
守護程序線程是不會阻止JVM關閉的任何線程。 任何線程都可以視為“后臺”線程。 守護程序線程被賦予與非守護程序線程相同的優先級(基于它們的優先級)。當守護程序線程正在運行時,它不會阻止另一個線程與非守護程序線程在運行上有任何不同。
守護程序線程是低優先級的線程,它在后臺間歇地運行,為Java運行時系統執行垃圾回收操作。
垃圾收集器是守護線程的一個示例。 守護程序線程可以具有較高的優先級,并且可以一直運行。
對switch語句的每種情況的值施加什么限制?
在編譯時,switch語句的每個case值必須計算為int值
從Java 5.0開始,支持打開枚舉,從Java 7開始,支持打開String。
什么是Java Bean?
Java Bean是一種軟件組件,其設計旨在可在各種不同的環境中重用。
恕我直言:這個答案含糊不清,可能在談論任何事情。
Java Bean是“可序列化的Java對象,具有一個null構造函數,并允許使用getter和setter方法訪問屬性。”
為什么要使用同步塊與同步方法?
與同步方法相比,同步塊放置鎖的時間更短。
這可能是正確的,但不能保證。 通常,同步塊用于通過同步方法來鎖定對對象的多次調用。 IMHO用于同步塊的最常見的用途是鎖定在這以外另一個目的
Map<key, value=""> map = Collections.synchronizedMap(new LinkedHashMap<key, value="">());
// perform multiple operations in a thread safe manner
synchronized(map) {
Value value = map.get(key);
if (value == null)
map.put(key, value = new Value(key));
return value;
}
Java中哪一個更快?
for(int i = 100000; i > 0; i--) {}
for(int i = 1; i < 100001; i++) {}
答:最快的是第二個。 服務器JVM可以檢測并消除不執行任何操作的循環。 當循環迭代大約10,000次時,將編譯帶有任一循環的方法。 (基于-XX:CompileThreshold = 10000)第一個循環將花費一些時間來檢測它沒有執行任何操作,但是第二個循環將被編譯。
哪個Java運算符是正確的關聯?
=運算符是右關聯的。
根據http://introcs.cs.princeton.edu/java/11precedence/列表,從右到左的關聯運算符是。 (不止一個)
- ( ) 投
- 新對象
- ? :
- 分配= + =-= * = / =%=&= ^ = | = << = >> = >>> =
Java運行時系統生成什么類的異常?
Java運行時系統生成RuntimeException和Error異常。
恕我直言:這是對另一個問題的答案。 這是對的回答; 什么是運行時超類,未經檢查的異常?
Java運行時可以生成Error,Exception或RuntimeException。
參考: 不正確的Java核心訪談在Vanilla Java上 ,我們的JCG合作伙伴 Peter Lawrey給出了答案 。
- 每個程序員都應該知道的事情
- 正確記錄應用程序的10個技巧
- 軟件設計法則
- Java最佳實踐系列
- 生存在狂野西部開發過程中的9條提示
- 如何在不到1ms的延遲內完成100K TPS
- 提升您的休眠引擎
翻譯自: https://www.javacodegeeks.com/2011/07/incorrect-core-java-interview-answers.html