1.JDK和JRE的區(qū)別:
- JRE是Java運行時環(huán)境滑肉,包括bin文件(JVM)和lib文件(類庫包各,沒有javac)靶庙。
- JDK是Java開發(fā)工具包问畅,包括JRE,include(java和JVM交互用的頭文件)六荒。
通常安裝的eclipse护姆、idea等IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時只要求你選中JRE路徑掏击。
2.final和static
- final修飾變量卵皂,不能修改;修飾方法砚亭,不能覆蓋渐裂;修飾類,不能繼承钠惩。
- static修飾的方法和類柒凉,存儲在方法區(qū),隨類一起被加載篓跛。static不能和abstract
- static 不能和abstract一起修飾方法膝捞,必須有實現(xiàn)。
- static不能修飾接口,抽象類蔬咬。
3.自動裝箱是Java編譯器在基本數(shù)據(jù)類型和對應的對象包裝類型間的轉(zhuǎn)化鲤遥,即int轉(zhuǎn)化為Integer,自動拆箱是Integer調(diào)用其方法將其轉(zhuǎn)化為int。
4.覆蓋||重寫(override)
- 必須有繼承林艘。重寫方法的方法名稱盖奈、參數(shù)列表必須與原方法的相同,返回類型可以相同也可以是原類型的子類型(從Java SE5開始支持)狐援。
- 重寫方法不能比原方法訪問性權限小钢坦。
- 重寫方法不能比原方法拋出更多的異常。
- final方法不能被重寫的啥酱。
- private方法不能被重寫爹凹,否則在其子類中只是新定義了一個方法,并沒有對其進行重寫镶殷。
- static方法不能被重寫禾酱。因為靜態(tài)方法是在編譯時把靜態(tài)方法和類的引用類型進行匹配。
- 重寫是發(fā)生在運行時的绘趋。因為編譯期編譯器不知道無法確定該去調(diào)用哪個方法颤陶,JVM會在代碼運行時決定。
5.重載(overload)
- 發(fā)生在同一個類中陷遮,方法名相同滓走。
- 返回類型可以不同,但只有返回類型不同不構成重載拷呆。
- 重載是編譯時多態(tài)闲坎,重寫是運行時多態(tài)疫粥。
6.繼承時靜態(tài)語句塊茬斧,非靜態(tài)語句塊,構造函數(shù)的運行順序梗逮。
- 父類靜態(tài)語句塊 子類靜態(tài)語句塊>父類非靜態(tài)語句塊>父類構造方法 >子類非靜態(tài)語句塊>子類構造方法项秉。
7.String
- final,因此不可繼承
- JDK9之前慷彤,char 16位——private final char value[];
- JDK9之后娄蔼,byte 8位——private final byte[] value
- String 支持多種編碼,如果不指定編碼的話底哗,它可能使用兩種編碼岁诉,分別為 LATIN1 和 UTF16。LATIN1 可能比較陌生跋选,其實就是 ISO-8859-1 編碼涕癣,屬于單字節(jié)編碼。而 UTF16 為雙字節(jié)編碼前标,它使用1個或2個16位長的空間存儲坠韩。
String s = "abc";
String ss = new String("abc");// 兩個對象距潘,一個是靜態(tài)存儲區(qū)的"abc",一個是用new創(chuàng)建在堆上的對象。
String a = "Programming";
String b = new String("Programming");
String c = "Program" + "ming";
System.out.println(a == b);//false
System.out.println(b == c);//false
System.out.println(a == c);//true
System.out.println(a.equals(b));//true
System.out.println(a.equals(c));//true
System.out.println(a.intern() == b.intern());//true
和StringBuffer只搁,StringBuilder的區(qū)別
- String 不可變音比,因此是線程安全的
- StringBuilder可變。不是線程安全的
- StringBuffer 可變氢惋。是線程安全的洞翩,內(nèi)部使用 synchronized 來同步
String.intern()
String s3 = s1.intern(); //首先把 s1 引用的對象放到 String Pool(字符串常量池)中,然后返回這個對象引用明肮。因此 s3 和 s1 引用的是同一個字符串常量池的對象菱农。
8.抽象的(abstract)方法是否可同時是靜態(tài)的(static),是否可同時是本地方法(native),是否可同時被synchronized修飾?
答:都不能柿估。抽象方法需要子類重寫循未,而靜態(tài)的方法是無法被重寫的,因此二者是矛盾的秫舌。本地方法是由本地代碼(如C代碼)實現(xiàn)的方法的妖,而抽象方法是沒有實現(xiàn)的,也是矛盾的足陨。synchronized和方法的實現(xiàn)細節(jié)有關嫂粟,抽象方法不涉及實現(xiàn)細節(jié),因此也是相互矛盾的墨缘。
9.接口和抽象類
- 先繼承后實現(xiàn)星虹,單繼承多實現(xiàn)。(class X extends C implements A,B)
- 接口可以繼承接口镊讼。抽象類可以實現(xiàn)(implements)接口宽涌,抽象類可繼承具體類,但前提是具體類必須有明確的構造函數(shù)蝶棋。
- 抽象類可以包含抽象方法和非抽象方法卸亮,但接口只有抽象方法。
- 接口方法和字段默認是public玩裙。
- 接口不能有構造函數(shù)兼贸,抽象類可以。
- 接口的初始化不會引起其父接口的初始化吃溅。
- 抽象類與普通類最大的區(qū)別是抽象類不能實例化溶诞,需要繼承抽象類才能實例化其子類。
- 接口中可以有默認的方法實現(xiàn)决侈。
- 接口的字段默認都是 static 和 final 的螺垢。(聲明時必須賦值)
10.在Java 中,如何跳出當前的多重嵌套循環(huán)?
- 在最外層循環(huán)前加一個標記如A甩苛,然后用break A;可以跳出多重循環(huán)蹂楣。(Java中支持帶標簽的break和continue語句,作用有點類似于C和C++中的goto語句讯蒲,但是就像要避免使用goto一樣痊土,應該避免使用帶標簽的break和continue,因為它不會讓你的程序變得更優(yōu)雅墨林,很多時候甚至有相反的作用赁酝,所以這種語法其實不知道更好)
11.Object
方法:
public final native Class<?> getClass()
public native int hashCode()
public boolean equals(Object obj)
protected native Object clone() throws CloneNotSupportedException
public String toString()
public final native void notify()
public final native void notifyAll()
public final native void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait() throws InterruptedException
protected void finalize() throws Throwable {}
12.equals
- 基本類型,== 判斷兩個值是否相等旭等,基本類型沒有 equals() 方法酌呆。
- 引用類型,== 判斷兩個實例是否引用同一個對象搔耕,而 equals() 判斷引用的對象是否等價隙袁。
【equals判斷過程】首先判斷是否是同一個對象的引用,若是則返回true弃榨,否則菩收,則判斷是否屬于同一個類類(instanceof),是則將Object轉(zhuǎn)型鲸睛,然后繼續(xù)判斷關鍵域娜饵,否則返回false。
13.hashcode
- 在覆蓋 equals() 方法時應當總是覆蓋 hashCode() 方法官辈,保證等價的兩個實例散列值也相等箱舞。
一個數(shù)與 31 相乘可以轉(zhuǎn)換成移位和減法:31*x == (x<<5)-x,編譯器會自動進行這個優(yōu)化拳亿。
@Override
public int hashCode() {
int result = 17;
result = 31 * result + x;
result = 31 * result + y;
result = 31 * result + z;
return result;
}
14.深拷貝和淺拷貝
https://blog.csdn.net/bigconvience/article/details/25025561
15.異常
【分類】Throwable 是所有異常的父類
Throwable分為兩種: Error 和 Exception晴股。其中 Error 用來表示 JVM 無法處理的錯誤
Exception 分為兩種:
- 受檢異常 :需要用 try...catch... 語句捕獲并進行處理,并且可以從異常中恢復风瘦;
- 非受檢異常 :是程序運行時錯誤队魏,例如除 0 會引發(fā) Arithmetic Exception公般。
image.png
16.反射
【弊端】
- 由于反射會額外消耗一定的系統(tǒng)資源万搔,因此如果不需要動態(tài)地創(chuàng)建一個對象,那么就不需要用反射官帘。
- 反射調(diào)用方法時可以忽略權限檢查瞬雹,因此可能會破壞封裝性而導致安全問題。
用法:
1.在運行時判斷任意一個對象所屬的類刽虹;
2.在運行時構造任意一個類的對象酗捌;
3.在運行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調(diào)用private方法);
4.在運行時調(diào)用任意一個對象的方法
參考資料:
https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md
17.HashMap可以通過下面的語句進行同步:
Map m = Collections.synchronizeMap(hashMap);