package Nov2016;
import java.util.LinkedList;
import java.util.List;
public class Ques1125 {
public static void main(String[] args){
List list01 = new LinkedList();
List list02 = new LinkedList(){};
List list03 = new LinkedList(){{}};
System.out.println(list01.getClass() == list02.getClass());
System.out.println(list02.getClass() == list03.getClass());
System.out.println(list01.getClass() == list03.getClass());
}
}
| 寫法 | 語法本質 | 編譯產物 | getClass() 結果 |
|---|---|---|---|
new LinkedList() | 普通實例化 | LinkedList.class | class java.util.LinkedList |
new LinkedList(){} | 匿名內部類,**無實例初始化塊** | Ques1125$1.class | class Nov2016.Ques1125$1 |
new LinkedList(){{}} | 匿名內部類,**含空實例初始化塊** | Ques1125$2.class | class Nov2016.Ques1125$2 |
false
false
false
list01 是 LinkedList 直接實例,getClass() == LinkedList.class → true(但這裡比較的是引用相等性)。list02、list03 分別是兩個不同的匿名內部類,編譯器生成 Ques1125$1 和 Ques1125$2 兩個獨立 .class 文件。getClass() 返回不同的 Class 對象**== 比較全部為 false。// 這樣寫會產生什麼?
Map map = new HashMap<>() {{
put("k1", "v1");
put("k2", "v2");
}};
YourClass$1,持有外部類引用(可能導致記憶體洩漏)。Serializable。Map.of("k1","v1","k2","v2")、Guava ImmutableMap.of()、或靜態工廠方法。匿名內部類每次聲明即生成新類型,getClass() 必不相等。面試考察點:
1. 語法糖本質(編譯器生成 Outer$N.class)
2. 雙大括號初始化的副作用(內存洩漏、序列化麻煩、類爆炸)
3. == 比較 Class 對象時比較的是同一個 ClassLoader 加載的同一個類。