簡述
此文是對 第7講 | int和Integer有什么區(qū)別目尖? 的學習
一些知識點/筆記點:
- Java 的 8 個原始數(shù)據(jù)類型(Primitive Types诸老,boolean、byte 破停、short杯巨、char每聪、int泣矛、float、double禾蚕、long)
- 原始數(shù)據(jù)類型不是對象
- 在 Java 5 中您朽,引入了自動裝箱和自動拆箱功能(boxing/unboxing),Java 可以根據(jù)上下文换淆,自動進行轉換為包裝類
- 因為大部分數(shù)據(jù)操作都是集中在有限的哗总、較小的數(shù)值范圍,所以 Java 5 中新增了靜態(tài)工廠方法 valueOf倍试,在調用它的時候會利用一個緩存機制讯屈,帶來了明顯的性能改進。
- 自動裝箱 / 自動拆箱是發(fā)生在什么階段县习?自動裝箱是一種語法糖涮母,它們發(fā)生在編譯階段,也就是生成的字節(jié)碼是一致的躁愿。
- 代碼驗證編譯階段叛本,用Javap -v 驗證
Constant pool:
#1 = Methodref #5.#14 // java/lang/Object."<init>":()V
#2 = Methodref #15.#16 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
#3 = Methodref #15.#17 // java/lang/Integer.intValue:()I
- Integer 源碼的學習:valueOf 緩存范圍為-128 到 127; value 聲明為 private final彤钟; 定義了類似 SIZE 或者 BYTES 這樣的常量来候,考慮不同平臺的移植。
- 原始類型線程安全逸雹,并發(fā)保證或者使用 AtomicInteger营搅、AtomicLong 這樣的線程安全類
擴展
- OC 里面同樣有這種原始類型數(shù)據(jù)和引用類型之間轉換的問題
- Java 對象
- 對象由三部分組成云挟,對象頭,對象實例转质,對齊填充园欣。
- 其中對象頭一般是十六個字節(jié),包括兩部分
- 第一部分有哈希碼峭拘,鎖狀態(tài)標志俊庇,線程持有的鎖,偏向線程id鸡挠,gc分代年齡等辉饱。
- 第二部分是類型指針,也就是對象指向它的類元數(shù)據(jù)指針拣展,可以理解彭沼,對象指向它的類。
- Mark Word: 標記位 4字節(jié)备埃,類似輕量級鎖標記位姓惑,偏向鎖標記位等。
- Class對象指針:4字節(jié)按脚,指向對象對應class對象的內存地址于毙。
- 對象實際數(shù)據(jù):對象所有成員變量。
- 對齊:對齊填充字節(jié)辅搬,按照8個字節(jié)填充唯沮。