我是fattiger--胖小虎
如果讀完覺得有收獲的話,歡迎關(guān)注贊賞。
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,多謝大家。
前言:估計(jì)很多人像我一樣,在程序的海洋里迷失了自己,為什么說迷失了自己,語(yǔ)言層出不窮,框架層出不窮,業(yè)務(wù)需求千變?nèi)f化。而你呢,如果沒有進(jìn)入一線互聯(lián)網(wǎng)公司,或者說沒有進(jìn)入好的技術(shù)氛圍的公司,在以技術(shù)為主導(dǎo)的職業(yè)生涯中,很難把自己的職業(yè)規(guī)劃好,也沒有什么清晰的目標(biāo),你所學(xué)所做的事情會(huì)受公司業(yè)務(wù)產(chǎn)品的影響,也有可能你三五年以來一直在做一些企業(yè)應(yīng)用的業(yè)務(wù),用戶量在三五百,好的上千上萬(wàn),并發(fā)就更不用說了,你最后的收獲可能就是對(duì)這塊業(yè)務(wù)比較熟悉,讓你整體挑起來這件事情,你也做不好,因?yàn)橹車娜硕己湍悴畈欢啵龊米约悍輧?nèi)的事情就好了,牽扯到別人的一點(diǎn)東西就不愿意去思考。上面提到的這樣的業(yè)務(wù)場(chǎng)景或者說這樣的技術(shù)氛圍很難讓在自己的技術(shù)成長(zhǎng)起來,導(dǎo)致技術(shù)面試一次失望一次,面試一次失望一次,最終的結(jié)果是要么不去考慮,在目前公司里一直混下去,要么有點(diǎn)血腥的人會(huì)考慮一下,心血來潮的學(xué)習(xí)一把,有多少人能把學(xué)習(xí)真正的堅(jiān)持下來,跳出你當(dāng)前的安逸,真正把自己的能力提升上去。你總說你還有時(shí)間去學(xué),而且還有人說學(xué)習(xí)什么時(shí)候都不晚,真的是這樣嗎?你是不晚,可是誰(shuí)愿意等你,你為這個(gè)不晚付出了多少的代價(jià)。如果有人看到了我寫的,而且你們的現(xiàn)狀和我描述的很相似,那么現(xiàn)在就行動(dòng)起來吧,要不你以后付出的代價(jià)會(huì)更大。心中要有清晰的目標(biāo)公司,要對(duì)自己的定位非常明確,有多少人30多歲了,還在自己的舒適區(qū),30歲之前不吃苦,往后更難熬,身邊的例子不少了,PPT寫不好被辭退,大公司大齡裁員的,90后是怎么蠶食80后飯碗的,時(shí)刻要有危機(jī)感,覺得以前荒廢了太多時(shí)光,可以和我一起從基礎(chǔ)開始,慢慢把自己的知識(shí)架構(gòu)搭建起來。接下來的博文,適合Java路線的人員,所有的知識(shí)必須較真,不要一看而過,不要一知半解,最后你能說出來多少,證明你掌握了多少,能給別人講明白到多少證明你理解有多深,千萬(wàn)不要有一知半解的狀態(tài)。這些基礎(chǔ)是你看源碼,看框架的必備知識(shí)點(diǎn),也是面試的利器。我的目的很簡(jiǎn)單就是為自己梳理知識(shí)框架的。
1. 關(guān)鍵字含義(運(yùn)算符[& | ~ ^]、位操作[>> >>> << ]、static、final、synchronzed[底層實(shí)現(xiàn)原理]、volatile[底層實(shí)現(xiàn)原理]、transient、foreach)
1.1
& 與操作 兩個(gè)位的數(shù)值都為1 則為1,否則為0。
| ?或操作 兩個(gè)位的數(shù)值有一個(gè)為1 就為1,否則為0。
~ 非操作 按位取反
^ 異或 兩個(gè)位的數(shù)值 不同為1,相同為0。
% ?取模或者說求余 結(jié)果符號(hào)和被除數(shù)保持一直 其實(shí)就是百分號(hào)左邊的值的符號(hào)
1.2
>> ?有符號(hào)左移1位 由于位移操作比算術(shù)運(yùn)算效率高,代碼中經(jīng)常用于替代除以2的操作 丟棄最高位,0補(bǔ)最低位
>>> 無符號(hào)左移1位 高位補(bǔ)0 針對(duì)負(fù)數(shù)有意義
<< ?丟棄最高位,0補(bǔ)最低位
這兩部分主要是幫助了解一下hash操作的一些操作,熟讀JDK源碼的同學(xué)都會(huì)看到,在一些hash操作的時(shí)候,這兩個(gè)操作是離不開的,目的是為了更好的把數(shù)據(jù)散列到數(shù)組中。
為什么要用一般和0xff做與操作?
主要是因?yàn)?1是一個(gè)奇質(zhì)數(shù),二進(jìn)制位都為1,所以31*i=(32-1)*i = 32*i – 1*i = (i<<5) –i 式子就是這樣轉(zhuǎn)換的結(jié)果,
這種位移與減法結(jié)合的計(jì)算相比一般的運(yùn)算快很多。
得出結(jié)論移位的操作比算術(shù)運(yùn)算要快,而為什么要快呢,其實(shí)在程序的底層,最終還是轉(zhuǎn)換成了移位操作。
還有就是31而進(jìn)制 0001 1111 ? 16+8+4+2+1 = 16 + 15 這樣實(shí)際數(shù)據(jù)與其做與操作,數(shù)據(jù)能均勻散列,
如果最后位是0,不管真是數(shù)據(jù)末尾是多少,結(jié)果都是0,只能放在偶數(shù)下標(biāo)的桶里,浪費(fèi)了好多空間,而且增加了碰撞的概率,
增加了查找的時(shí)間復(fù)雜度。
1.3 static 修飾變量、靜態(tài)塊、方法、內(nèi)部類、靜態(tài)導(dǎo)包
靜態(tài)塊何時(shí)執(zhí)行?這個(gè)例子發(fā)在父子類的案例中比較能說明類初始化順序 父類靜態(tài)塊 子類靜態(tài)塊 父類非靜態(tài)塊 父構(gòu)造函數(shù) 子非靜態(tài)塊 子構(gòu)造函數(shù)類的加載的第二個(gè)連接階段(驗(yàn)證、準(zhǔn)備、解析)中的解析階段的對(duì)靜態(tài)變量的賦初始值(0/false/null),如果是被final修飾的靜態(tài)常量,此階段直接賦最終值,否則在類初始化階段在執(zhí)行putstatic指令。
GCRoot方法區(qū)中類靜態(tài)屬性引用的對(duì)象 方法區(qū)中常量引用的對(duì)象
1.4 final 修飾變量、方法、類
宗旨是不可變 變量不能被修改 方法不能被覆蓋 類不能被繼承 不可變對(duì)象都是線程安全對(duì)象。會(huì)和finally,finalize做區(qū)別?finally代碼在return之前執(zhí)行。
1.5 synchronized
Java關(guān)鍵字 可用于修飾同步塊(同步類、同步對(duì)象)、同步方法(靜態(tài)方法、非靜態(tài)方法)。
1. 修飾一個(gè)代碼塊,被修飾的代碼塊稱為同步語(yǔ)句塊,其作用的范圍是大括號(hào){}括起來的代碼,作用的對(duì)象是調(diào)用這個(gè)代碼塊的對(duì)象;
2. 修飾一個(gè)方法,被修飾的方法稱為同步方法,其作用的范圍是整個(gè)方法,作用的對(duì)象是調(diào)用這個(gè)方法的對(duì)象;
3. 修飾一個(gè)靜態(tài)的方法,其作用的范圍是整個(gè)靜態(tài)方法,作用的對(duì)象是這個(gè)類的所有對(duì)象;
4. 修飾一個(gè)類,其作用的范圍是synchronized后面括號(hào)括起來的部分,作用主的對(duì)象是這個(gè)類的所有對(duì)象。
總結(jié) 修飾靜態(tài)方法和類的時(shí)候,鎖的整個(gè)類,所有的對(duì)象用同一把鎖。而如果是鎖的對(duì)象或者是非靜態(tài)方法,則鎖的是對(duì)象。
【實(shí)現(xiàn)原理】
修飾代碼塊的時(shí)候,會(huì)在同步塊的入口位置和退出位置分別插入monitorenter和monitorexit
修飾方法的時(shí)候,在VM層面沒有任何特別指令,而是在Class文件的方法表中把a(bǔ)ccess_flags標(biāo)志名稱為ACC_SYNCHROINZED標(biāo)志為1
和juc包中l(wèi)ock的區(qū)別:1、lock必須finally手動(dòng)釋放鎖,lock等待可中斷,可實(shí)現(xiàn)公平鎖,多條件鎖 在并發(fā)包中會(huì)詳細(xì)說明。
1.6 volatile
內(nèi)存可見 修飾的變量 在變化后 馬上更新到主內(nèi)存 所有工作內(nèi)存的變量失效 獲取主內(nèi)存信息
防止指令重排 Java編譯時(shí) 由于優(yōu)化會(huì)對(duì)指令的前后順序重新排列 volatile修飾的代碼 不會(huì)重新排序
典型的例子 修飾變量i 多線程進(jìn)行i++操作 i變量就不是線程安全的 為什么呢?
1.7 transient
transient是類型修飾符,只能用來修飾字段。在對(duì)象序列化的過程中,標(biāo)記為transient的變量不會(huì)被序列化。
ArrayList 源碼中數(shù)據(jù)對(duì)象為什么是transient?為什么要重寫序列化的讀寫方法?
1.8 foreach
循環(huán)原理 其實(shí)就是iterator 可查看反編譯后的字節(jié)碼
遍歷數(shù)組 就和for一樣
遍歷集合 是用的集合的迭代器
未完待續(xù)。。。