Java總結(jié)

字符串

  • java字符串使用+進(jìn)行拼接時(shí)钟沛,編譯器會(huì)通過(guò)StringBuilder進(jìn)行優(yōu)化悠咱。但是在循環(huán)體中使用+=的時(shí)候會(huì)創(chuàng)建多個(gè)StringBuilder迎卤,可以在循環(huán)體外顯式使用StringBuilder蔗草,可以使得程序效率更高
  • Buffer是線程安全的零远,所以在單線程的情況先執(zhí)行效率低于Builder

單例的寫法

單例一般有兩種寫法,也將其稱為惡漢式和懶漢式正驻,我這里說(shuō)的是在沒(méi)有 lazy load 等考慮的情況下
沒(méi)有帶參數(shù)的寫法:

public class Singleton {
    public static final Singleton INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

帶參數(shù)的寫法:

public class Singleton {
    private volatile static Singleton sInstance;
    private static final Object LOCK = new Object();

    private Singleton(Param param){
        // do some init
    }

    public static Singleton getInstance(Param param) {
        if (sInstance == null) {
            synchronized (LOCK) {
                if (sInstance == null) {
                    sInstance = new Singleton(param);
                }
            }
        }
        return sInstance;
    }
}

關(guān)于為何需要雙重判空網(wǎng)上有很多介紹的文章弊攘,這里不再多說(shuō),需要注意的是需要使用volatile防止重排序問(wèn)題

this逃逸

this逃逸主要指在構(gòu)造方法沒(méi)有執(zhí)行完畢的情況下姑曙,其他線程獲取到了這個(gè)對(duì)象的引用襟交。需要小心在構(gòu)造方法中不要使用一些異步手段將this對(duì)象發(fā)布出去。

并發(fā) 多線程相關(guān)

  • 使用 synchronized 關(guān)鍵字同步對(duì)象的時(shí)候應(yīng)該在使用對(duì)象的地方都使用 synchronized來(lái)包裹伤靠,否則沒(méi)有同步效果
  • 將不可變的對(duì)象用 final 來(lái)修飾可以減少很多同步的問(wèn)題捣域。final并不表示對(duì)象的內(nèi)容不會(huì)變化,只是說(shuō)不能再賦值。相當(dāng)于一個(gè)指針指向的地址確定了竟宋,但是內(nèi)容沒(méi)有限制
  • 正確的中斷線程:
class MyThread extends Thread {

    public void run() {
        try {
            doSomeThing();
        } catch (InterruptedException e) {
            doCancel();
        }
    }

    public void cancel() {
        interrupt();
    }
}

還有一種方法是通過(guò)在 cancel 方法中設(shè)置標(biāo)志位來(lái)取消線程也是可以的零聚,注意將標(biāo)志位設(shè)置為 volatile 并且正確的處理中斷

  • 線程池的設(shè)置:線程池有三種系奉,計(jì)算密集線程池瞬矩、IO線程池攒磨,newThread(考慮到有可能希望某個(gè)任務(wù)及早執(zhí)行而不是在線程池中排隊(duì))。其中計(jì)算密集型線程池的大小建議為$N(cpu核數(shù))+1$蜗字,具體參見(jiàn) 《Java并發(fā)編程實(shí)戰(zhàn)》 8.2 設(shè)置線程池大小
  • 線程如果在處理不可打斷的任務(wù)打肝,應(yīng)該在出現(xiàn)中斷的時(shí)候?qū)⒅袛酄顟B(tài)保存起來(lái),然后在任務(wù)執(zhí)行完了之后挪捕,再響應(yīng)中斷
class MyThread extends Thread {
    private volatile boolean interrupted = false;
    public void run() {
        try {
            while (true) {
                try {
                    doSomeThing();
                } catch (InterruptedException e) {
                    interrupted = true;
                }
            }
        } finally {
            if (interrupted)
                Thread.currentThread().interrupted();
        }
    }
    public void cancel() {
        interrupted = true;
    }
}
  • Thread#join() 方法可以讓當(dāng)前線程等待目標(biāo)線程執(zhí)行結(jié)束粗梭,如果目標(biāo)線程已經(jīng)結(jié)束,則執(zhí)行當(dāng)前線程后面的代碼级零,否則必須等待目標(biāo)線程結(jié)束之后(如果設(shè)置了超時(shí)時(shí)間断医,超時(shí)和目標(biāo)線程結(jié)束兩個(gè)條件滿足一個(gè)即可)能執(zhí)行后面的代碼。使用join()方法解決定時(shí)任務(wù)提前結(jié)束引起的一些問(wèn)題奏纪,具體參見(jiàn) 《Java并發(fā)編程實(shí)戰(zhàn)》 7.1.4 示例:計(jì)時(shí)運(yùn)行

static

  • 使用private static編譯器會(huì)優(yōu)先考慮將方法內(nèi)聯(lián)
  • 無(wú)論實(shí)例化幾次或者調(diào)用幾次方法,static代碼段都執(zhí)行一次...比如,你創(chuàng)建了類的兩個(gè)實(shí)例,但是只有創(chuàng)建第一個(gè)實(shí)例的時(shí)候static代碼段才被執(zhí)行.創(chuàng)建第二個(gè)的時(shí)候?qū)⒉粓?zhí)行...使用類名調(diào)用靜態(tài)方法也同理
  • 在實(shí)例化一個(gè)對(duì)象的時(shí)候也被調(diào)用.而且先于構(gòu)造函數(shù)被調(diào)用.也就是說(shuō),我們創(chuàng)建一個(gè)對(duì)象,那么首先先調(diào)用static代碼段,然后再調(diào)用構(gòu)造函數(shù)

強(qiáng)引用鉴嗤、弱引用、軟引用序调、虛引用

強(qiáng)引用

強(qiáng)引用是使用最普遍的引用醉锅。當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤发绢,使程序異常終止硬耍,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題

Object o=new Object();   //  強(qiáng)引用

軟引用

如果一個(gè)對(duì)象只具有軟引用,則內(nèi)存空間足夠边酒,垃圾回收器就不會(huì)回收它经柴;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存甚纲。只要垃圾回收器沒(méi)有回收它口锭,該對(duì)象就可以被程序使用朦前。軟引用可用來(lái)實(shí)現(xiàn)內(nèi)存敏感的高速緩存介杆。

String str=new String("abc");                                     // 強(qiáng)引用
SoftReference<String> softRef=new SoftReference<String>(str);     // 軟引用

弱引用

弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中韭寸,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象春哨,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存恩伺。不過(guò)赴背,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。

String str=new String("abc");    
WeakReference<String> abcWeakRef = new WeakReference<String>(str);
str=null;

虛引用

虛引用顧名思義凰荚,就是形同虛設(shè)燃观,與其他幾種引用都不同,虛引用并不會(huì)決定對(duì)象的生命周期便瑟。如果一個(gè)對(duì)象僅持有虛引用缆毁,那么它就和沒(méi)有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收到涂。
幾種引用方式在垃圾回收時(shí)候的區(qū)別


Java中父類與子類中靜態(tài)代碼段脊框、非靜態(tài)代碼段和構(gòu)造方法的執(zhí)行過(guò)程

執(zhí)行流程為:
父類靜態(tài)代碼段->子類靜態(tài)代碼段->父類非靜態(tài)代碼段->父類構(gòu)造方法->子類非靜態(tài)代碼段->父類構(gòu)造方法
在子類的構(gòu)造方法執(zhí)行前必然會(huì)執(zhí)行父類的構(gòu)造方法,如果指明了super(params)践啄,則執(zhí)行父類中對(duì)應(yīng)的構(gòu)造方法浇雹,否則執(zhí)行默認(rèn)沒(méi)有參數(shù)的構(gòu)造方法
參考:

  1. http://blog.csdn.net/mazhimazh/article/details/19752475
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屿讽,隨后出現(xiàn)的幾起案子昭灵,更是在濱河造成了極大的恐慌,老刑警劉巖伐谈,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虎锚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衩婚,警方通過(guò)查閱死者的電腦和手機(jī)窜护,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)非春,“玉大人柱徙,你說(shuō)我怎么就攤上這事∑骊迹” “怎么了护侮?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)储耐。 經(jīng)常有香客問(wèn)我羊初,道長(zhǎng),這世上最難降的妖魔是什么什湘? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任长赞,我火速辦了婚禮,結(jié)果婚禮上闽撤,老公的妹妹穿的比我還像新娘得哆。我一直安慰自己,他們只是感情好哟旗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布贩据。 她就那樣靜靜地躺著栋操,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饱亮。 梳的紋絲不亂的頭發(fā)上矾芙,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音近上,去河邊找鬼蠕啄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛戈锻,可吹牛的內(nèi)容都是我干的歼跟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼格遭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哈街!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拒迅,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骚秦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后璧微,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體作箍,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年前硫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胞得。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屹电,死狀恐怖阶剑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情危号,我是刑警寧澤牧愁,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站外莲,受9級(jí)特大地震影響猪半,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偷线,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一磨确、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淋昭,春花似錦俐填、人聲如沸安接。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至歇式,卻和暖如春驶悟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背材失。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工痕鳍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龙巨。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓笼呆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親旨别。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诗赌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 一、運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存:方法區(qū)秸弛、虛擬機(jī)棧铭若、本地方法棧、堆递览、程序計(jì)數(shù)器叼屠,...
    加油小杜閱讀 1,518評(píng)論 1 15
  • 作者:閉關(guān)寫代碼 鏈接:https://www.nowcoder.com/discuss/3244 來(lái)源:牛客網(wǎng) ...
    MrWang915閱讀 308評(píng)論 0 0
  • 一:java概述:1绞铃,JDK:Java Development Kit镜雨,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,649評(píng)論 0 11
  • 面向?qū)ο?抽象:關(guān)注屬性和行為儿捧,不關(guān)注行為的細(xì)節(jié)繼承:讓變化中的軟件系統(tǒng)有了一定的延續(xù)性冷离,同時(shí)繼承也是封裝程序中可...
    wangxiaoda閱讀 349評(píng)論 0 0
  • Java SE 基礎(chǔ): 封裝、繼承纯命、多態(tài) 封裝: 概念:就是把對(duì)象的屬性和操作(或服務(wù))結(jié)合為一個(gè)獨(dú)立的整體西剥,并盡...
    Jayden_Cao閱讀 2,108評(píng)論 0 8