以下均是自己對(duì)學(xué)習(xí)的理解,理解可能偏差
- java 編譯與反編譯
發(fā)展:機(jī)器語(yǔ)言--匯編語(yǔ)言--高級(jí)語(yǔ)言,例如java 。
編譯: 高級(jí)語(yǔ)言需要轉(zhuǎn)換成機(jī)器能夠識(shí)別的機(jī)器語(yǔ)言運(yùn)行,java 通過(guò)javac編譯器將.java文件編譯成.class字節(jié)碼文件,然后JVM java虛擬機(jī)將class文件轉(zhuǎn)換成機(jī)器語(yǔ)言,這就是java語(yǔ)言運(yùn)行的過(guò)程
反編譯:過(guò)程和編譯剛好相反,java反編譯即將.class文件轉(zhuǎn)換為.java文件
反編譯工具:javap、jad、cfr
編譯流程:源代碼 - 詞法分析 - 符號(hào)流 - 語(yǔ)法分析 - 語(yǔ)法樹(shù) - 語(yǔ)義分析 - 語(yǔ)法樹(shù) - 中間代碼生成 - 中間代碼 - 代碼優(yōu)化 - ---機(jī)器語(yǔ)言
問(wèn)題:編譯解釋再執(zhí)行,速度比可執(zhí)行字節(jié)碼慢很多,為解決該問(wèn)題引入JIT技術(shù)--熱點(diǎn)代碼檢測(cè)優(yōu)化,基于計(jì)數(shù)器的熱點(diǎn)探測(cè)方法--方法調(diào)用計(jì)數(shù)器,回邊計(jì)數(shù)器, 編譯優(yōu)化
JVM、java語(yǔ)言規(guī)范(如基本數(shù)據(jù)類型在所有平臺(tái)的一致性)及編譯成統(tǒng)一的.class文件保證其跨平臺(tái)性
值傳遞和引用傳遞
值傳遞:創(chuàng)建副本copy,不改變?cè)紝?duì)象
引用傳遞:不創(chuàng)建副本,可以改變?cè)紝?duì)象
Java是值傳遞,只是傳遞的內(nèi)容是基本數(shù)據(jù)類型和對(duì)象的引用,這兩者原始對(duì)象都不會(huì)被改變八種數(shù)據(jù)類型 1字節(jié)=8位(bit)
字符:char
整型:byte 1字節(jié) short 2字節(jié) int 4字節(jié) long 8字節(jié)
布爾:boolean
浮點(diǎn)型:float 4字節(jié) double 8字節(jié) 二進(jìn)制的表示,很多小數(shù)是沒(méi)法精確表示出來(lái),所以去近似值表現(xiàn)法,所以不能表示金額,建議BigDecimal 或Long
溢出,基礎(chǔ)數(shù)據(jù)類型溢出的時(shí)候并不會(huì)拋異常,也沒(méi)有任何提示
Java中,為什么byte類型的取值范圍為-128~127?
機(jī)器數(shù)、真值、原碼、反碼、補(bǔ)碼 為了運(yùn)算
除法變成乘法,,乘法變成加法,減法變成加法,計(jì)算機(jī)運(yùn)算
包裝類,自動(dòng)裝箱,自動(dòng)拆箱 --有緩存,復(fù)用,節(jié)約空間
Java中整型的緩存機(jī)制字符串的不可變性
一旦一個(gè)string對(duì)象在內(nèi)存(堆)中被創(chuàng)建出來(lái),他就無(wú)法被修改。特別要注意的是,String類的所有方法都沒(méi)有改變字符串本身的值,都是返回了一個(gè)新的對(duì)象。
如果你需要一個(gè)可修改的字符串,應(yīng)該使用StringBuffer 或者 StringBuilder。否則會(huì)有大量時(shí)間浪費(fèi)在垃圾回收上,因?yàn)槊看卧噲D修改都有新的string對(duì)象被創(chuàng)建出來(lái)。
6 String對(duì)“+”的重載
String s = "a" + "b",編譯器會(huì)進(jìn)行常量折疊(因?yàn)閮蓚€(gè)都是編譯期常量,編譯期可知),即變成 String s = "ab"
對(duì)于能夠進(jìn)行優(yōu)化的(String s = "a" + 變量 等)用 StringBuilder 的 append() 方法替代,最后調(diào)用 toString() 方法 (底層就是一個(gè) new String())
7 字符串拼接
使用+拼接字符串 --->底層使用了StringBuilder
concat方法來(lái)拼接字符串 --> 創(chuàng)建了一個(gè)字符數(shù)組
使用StringBuffer、StringBuilder可以方便的對(duì)字符串進(jìn)行拼接,StringBuilder不是線程安全
耗時(shí):StringBuilder<StringBuffer<concat<+<StringUtils.join
循環(huán)體內(nèi)不要用+
8 switch 對(duì)String的支持
switch只支持一種數(shù)據(jù)類型,那就是整型,其他數(shù)據(jù)類型都是轉(zhuǎn)換成整型之后再使用switch的。
char -> 比較ascii碼,string 比較hashcode,再通過(guò)equals進(jìn)行檢查
9 intern
JVM為了減少字符重復(fù)創(chuàng)建,節(jié)省內(nèi)存,會(huì)單獨(dú)開(kāi)辟一塊內(nèi)存,保存字符串常量,稱為字符串常量池,
當(dāng)出現(xiàn)雙引號(hào)創(chuàng)建字符串時(shí),會(huì)先檢查常量池,存在相同內(nèi)容的對(duì)象引用就返回引用,否則創(chuàng)建新的,并將引用放進(jìn)常量池,
使用intern 將字符串內(nèi)容放到常量池
10 雙親委派
JVM有四種類加載器,Bootstrap ClassLoader(加載核心類庫(kù)),Extension ClassLoader(加載擴(kuò)展類庫(kù)ext目錄),Application ClassLoader(加載當(dāng)前應(yīng)用classpath的所有類), User ClassLoader(自定義加載)

層次依次降低,雙親委派:當(dāng)一個(gè)類加載器收到類加載請(qǐng)求,不會(huì)馬上去加載,而是委托給父類加載器加載,父類加載器無(wú)法加載時(shí),才由當(dāng)前指定的類加載器加載。
實(shí)現(xiàn)方法:loadClass(),重寫loadClass可破壞雙親委派機(jī)制,不想破壞,重寫findClass(),loadClass父加載失敗會(huì)調(diào)用自身的findClass()方法,很多框架會(huì)主動(dòng)破壞雙親委派機(jī)制,比如Tomcat作為web容器,可能部署多個(gè)服務(wù),服務(wù)可能引用相同jar,但版本不一致,采用默認(rèn)雙親委派,無(wú)法加載多個(gè)相同類,所以為了實(shí)現(xiàn)隔離,優(yōu)先加載web應(yīng)用自身定義的類
隨著jdk發(fā)展,模塊化技術(shù)應(yīng)用,加載機(jī)制也變成復(fù)雜的網(wǎng)狀結(jié)構(gòu)
雙親委派
11 Java內(nèi)存模型
計(jì)算機(jī)硬件,CPU 和內(nèi)存執(zhí)行速度的差異,增加緩存,多線程情況下存在緩存一致性問(wèn)題,對(duì)代碼的亂序執(zhí)行,為指令重排
軟件:對(duì)應(yīng)的是可見(jiàn)性問(wèn)題(一個(gè)線程的修改,其他線程要能看到),原子性(一個(gè)操作必須連續(xù)完成,不能終端),有序性(必須保證多線程下的執(zhí)行順序)
原子性: synchronized(影響性能)->需要通過(guò)字節(jié)碼指令monitorenter和monitorexit保證
可見(jiàn)性: volatile(被其修飾的變量在被修改后可以立即同步到主內(nèi)存)、final、synchronized
有序性: volatile(禁止指令重排優(yōu)化)、synchronized
12 Java 虛擬機(jī)鎖優(yōu)化技術(shù)

自旋鎖:時(shí)間很短的線程,時(shí)刻檢查共享資源是否可以被訪問(wèn),因?yàn)榈却龝r(shí)間很短,放棄處理器執(zhí)行時(shí)間,等待被喚醒會(huì)很慢
鎖消除:(逃逸分析)判斷鎖對(duì)象是否只被一個(gè)線程訪問(wèn),即無(wú)線程安全問(wèn)題
鎖粗化:大部分時(shí)候減小鎖的范圍、粒度,避免不必要的阻塞,但如果連續(xù)對(duì)同一對(duì)象反復(fù)加鎖解鎖,相當(dāng)耗費(fèi)資源,這種情況可以適當(dāng)放寬加鎖范圍
鎖消除、鎖粗化、偏向鎖、適應(yīng)性自旋鎖盡在Java虛擬機(jī)server模式下起作用,運(yùn)行Java時(shí)添加-server參數(shù)
13 集合
Collection、List、Set
ArrayList:可改變大小的數(shù)組,查詢、修改性能好(數(shù)據(jù)量大),擴(kuò)容50%
LinkedList:雙鏈表,添加、刪除性能好,實(shí)現(xiàn)了Queue接口,比List多offer(0,peek(),poll()等方法,
Vector:安全,擴(kuò)容100%