java 知識(shí)合集

String顾复、StringBufer班挖、StringBuilder

String 它是典型的Immutable(不可改變)類,被聲明成為fnal class芯砸,所有屬性也都是fnal的萧芙。也由于它的不可變性,類似拼接假丧、裁剪字符串等動(dòng)作双揪,都會(huì)產(chǎn)生新的String對(duì)象。在循環(huán)場(chǎng)景下不建議使用這些功能包帚。

StringBufer是為解決上面提到拼接產(chǎn)生太多中間對(duì)象的問(wèn)題而提供的一個(gè)類渔期,可以用append或者add方法,把字符串添加到已有序列的末尾或者指定位置。StringBufer本質(zhì)是一個(gè)線程安全的可修改字符序列疯趟,它保證了線程安全(簡(jiǎn)單粗暴各種修改數(shù)據(jù)的方法都加上synchronized關(guān)鍵字實(shí)現(xiàn)的)拘哨,也隨之帶來(lái)了額外的性能開銷,所以除非有線程安全的需要信峻,不然還是推薦使用它的后繼者宅静,也就是StringBuilder。

StringBuilder 在能力上和StringBufer沒(méi)有本質(zhì)區(qū)別站欺,但是它去掉了線程安全的部分姨夹,有效減小了開銷,是絕大部分情況下進(jìn)行字符串拼接的首選矾策。從 builder 命名來(lái)看這個(gè)類專門就是為創(chuàng)建而生磷账。

  • Immutable對(duì)象在拷貝時(shí)不需要額外復(fù)制數(shù)據(jù)。

字符串的內(nèi)部數(shù)組

  • 為了實(shí)現(xiàn)修改字符序列的目的贾虽,StringBufer和StringBuilder底層都是利用可修改的char數(shù)組(JDK 9以后是byte)逃糟,都繼承了AbstractStringBuilder。

  • 這個(gè)內(nèi)部數(shù)組應(yīng)該創(chuàng)建成多大的呢蓬豁?如果太小绰咽,拼接的時(shí)候可能要重新創(chuàng)建足夠大的數(shù)組;如果太大地粪,又會(huì)浪費(fèi)空間取募。目前的實(shí)現(xiàn)是,構(gòu)建時(shí)初始字符串長(zhǎng)度加16(這意味著蟆技,如果沒(méi)有構(gòu)建對(duì)象時(shí)輸入最初的字符串玩敏,那么初始值就是16)。我們?nèi)绻_定拼接會(huì)發(fā)生非常多次质礼,而且大概是可預(yù)計(jì)的旺聚,那么就可以指定合適的大小,避免很多次擴(kuò)容的開銷眶蕉。擴(kuò)容會(huì)產(chǎn)生多重開銷砰粹,因?yàn)橐獟仐壴袛?shù)組,創(chuàng)建新的(可以簡(jiǎn)單認(rèn)為是倍數(shù))數(shù)組造挽,還要進(jìn)行arraycopy碱璃。

字符串拼接

  • 如果在代碼拼接說(shuō) String 拼接效率低下,但是在 jdk8即使你使用 String 拼接編譯器還是會(huì)把你優(yōu)化成 StringBuilder刽宪,jdk9優(yōu)化成StringConcatFactory(暫時(shí)沒(méi)用了解過(guò))

字符串緩存厘贼、內(nèi)存

  • String在jdk6以后提供了intern()方法界酒,目的是提示JVM把相應(yīng)字符串緩存起來(lái)圣拄,以備重復(fù)使用。但是不建議使用毁欣。

  • jdk6被緩存的字符串是存在所謂PermGen里的庇谆,也就是臭名昭著的“永久代”岳掐,這個(gè)空間是很有限的,也基本不會(huì)被FullGC之外的垃圾收集照顧到饭耳。所以串述,如果使用不當(dāng),OOM就會(huì)光顧寞肖。

  • jdk7存放在堆中纲酗。

  • jdk8出現(xiàn)了MetaSpace(元數(shù)據(jù)區(qū)),就存在元空間中。

  • intern是一種顯式地排重機(jī)制新蟆,但是它也有一定的副作用觅赊,因?yàn)樾枰_發(fā)者寫代碼時(shí)明確調(diào)用,一是不方便琼稻,每一個(gè)都顯式調(diào)用是非常麻煩的吮螺;另外就是我們很難保證效率,應(yīng)用開發(fā)階段很難清楚地預(yù)計(jì)字符串的重復(fù)情況帕翻,有人認(rèn)為這是一種污染代碼的實(shí)踐鸠补。
    幸好在Oracle JDK 8u20之后,推出了一個(gè)新的特性嘀掸,也就是G1 GC下的字符串排重紫岩。它是通過(guò)將相同數(shù)據(jù)的字符串指向同一份數(shù)據(jù)來(lái)做到的,是JVM底層的改變睬塌,并不需要Java類庫(kù)做什么修改被因。
    開啟 G1 GC 后可加入這個(gè)參數(shù)開啟-XX:+UseStringDeduplication

動(dòng)態(tài)代理

深入理解RPC之動(dòng)態(tài)代理篇這篇文章針對(duì)集中動(dòng)態(tài)代理有比較詳細(xì)的分析
動(dòng)態(tài)代理的應(yīng)用場(chǎng)景比如:RPC、安全衫仑、日志梨与、事務(wù)

靜態(tài)代理

事先寫好代理類,可以手工編寫文狱,也可以用工具生成粥鞋。缺點(diǎn)是每個(gè)業(yè)務(wù)類都要對(duì)應(yīng)一個(gè)代理類,非常不靈活瞄崇。

動(dòng)態(tài)代理

運(yùn)行時(shí)自動(dòng)生成代理對(duì)象呻粹。缺點(diǎn)是生成代理代理對(duì)象和調(diào)用代理方法都要額外花費(fèi)時(shí)間。

JDK動(dòng)態(tài)代理:基于Java反射機(jī)制實(shí)現(xiàn)苏研,必須要實(shí)現(xiàn)了接口的業(yè)務(wù)類才能用這種辦法生成代理對(duì)象等浊。新版本也開始結(jié)合ASM機(jī)制。

cglib動(dòng)態(tài)代理:基于ASM機(jī)制實(shí)現(xiàn)摹蘑,通過(guò)生成業(yè)務(wù)類的子類作為代理類筹燕。

基本數(shù)據(jù)類型和引用數(shù)據(jù)類型

緩存機(jī)制

緩存機(jī)制并不是只有Integer才有,同樣存在于其他的一些包裝類,比如:

  • Boolean撒踪,緩存了true/ false對(duì)應(yīng)實(shí)例过咬,確切說(shuō),只會(huì)返回兩個(gè)常量實(shí)例Boolean.TRUE/ FALSE制妄。
  • Short掸绞,同樣是緩存了-128到127之間的數(shù)值。
  • Byte耕捞,數(shù)值有限衔掸,所以全部都被緩存。
  • Character俺抽,緩存范圍'\ u0000' 到 '\ u007F'具篇。
    繼續(xù)深挖緩存,I nteger的緩存范圍雖然默認(rèn)是-128到127凌埂,但是在特別的應(yīng)用場(chǎng)景驱显,比如我們明確知道應(yīng)用會(huì)頻繁使用更大的數(shù)值,這時(shí)候應(yīng)該怎么辦呢瞳抓?
-XX:AutoBoxCacheMax=N

緩存上限值實(shí)際是可以根據(jù)需要調(diào)整的埃疫,JVM提供了參數(shù)設(shè)置:

自動(dòng)拆裝箱的注意點(diǎn)

建議避免無(wú)意中的裝箱逛犹、拆箱行為锤窑,尤其是在性能敏感的場(chǎng)合,創(chuàng)建10萬(wàn)個(gè)Java對(duì)象和10萬(wàn)個(gè)整數(shù)的開銷可不是一個(gè)數(shù)量級(jí)的苟蹈,不管是內(nèi)存使用還是處理速度横蜒,光是對(duì)象頭的空間占用就已經(jīng)是數(shù)量級(jí)的差距了胳蛮。

Integer 內(nèi)存結(jié)構(gòu)組成

  1. Mark Word: 標(biāo)記位 4字節(jié),類似輕量級(jí)鎖標(biāo)記位丛晌,偏向鎖標(biāo)記位等仅炊。
  2. Class對(duì)象指針: 4字節(jié),指向?qū)ο髮?duì)應(yīng)class對(duì)象的內(nèi)存地址澎蛛。
  3. 對(duì)象實(shí)際數(shù)據(jù):對(duì)象所有成員變量抚垄。
  4. 對(duì)齊:對(duì)齊填充字節(jié),按照8個(gè)字節(jié)填充谋逻。
    Integer占用內(nèi)存大小呆馁,4+ 4+ 4+ 4= 16字節(jié)。

集合

狹義的集合框架

Map

Map

LinkedHashMap

LinkedHashMap通常提供的是遍歷順序符合插入順序毁兆,它的實(shí)現(xiàn)是通過(guò)為條目(鍵值對(duì))維護(hù)一個(gè)雙向鏈表浙滤。注意,通過(guò)特定構(gòu)造函數(shù)气堕,我們可以創(chuàng)建反映訪問(wèn)順序的實(shí)例纺腊,所謂的put畔咧、get、compute等摹菠,都算作“訪問(wèn)”盒卸。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骗爆,一起剝皮案震驚了整個(gè)濱河市次氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摘投,老刑警劉巖煮寡,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異犀呼,居然都是意外死亡幸撕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門外臂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坐儿,“玉大人,你說(shuō)我怎么就攤上這事宋光∶部螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵罪佳,是天一觀的道長(zhǎng)逛漫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赘艳,這世上最難降的妖魔是什么酌毡? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蕾管,結(jié)果婚禮上枷踏,老公的妹妹穿的比我還像新娘。我一直安慰自己掰曾,他們只是感情好呕寝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婴梧,像睡著了一般下梢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞蹭,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天孽江,我揣著相機(jī)與錄音,去河邊找鬼番电。 笑死岗屏,一個(gè)胖子當(dāng)著我的面吹牛辆琅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播这刷,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼婉烟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了暇屋?” 一聲冷哼從身側(cè)響起似袁,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咐刨,沒(méi)想到半個(gè)月后昙衅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡定鸟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年而涉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片联予。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啼县,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沸久,到底是詐尸還是另有隱情季眷,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布麦向,位于F島的核電站瘟裸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诵竭。R本人自食惡果不足惜话告,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卵慰。 院中可真熱鬧沙郭,春花似錦、人聲如沸裳朋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲤嫡。三九已至送挑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暖眼,已是汗流浹背惕耕。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诫肠,地道東北人司澎。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓欺缘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挤安。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谚殊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容