github(持續(xù)更新世澜,歡迎star,fork補(bǔ)充)
自動裝箱(autoboxing)與拆箱(unboxing)
自動裝箱是 Java 編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型之間做的一個轉(zhuǎn)化。
比如:把 int 轉(zhuǎn)化成 Integer峰搪,double 轉(zhuǎn)化成 Double等,反之就是自動拆箱辟灰。
Java中的自動裝箱與拆箱
Java 創(chuàng)建對象的幾種方式
(1) 用 new 語句創(chuàng)建對象个榕,這是最常見的創(chuàng)建對象的方法
(2) 運(yùn)用反射手段,調(diào)用 java.lang.Class 或者 java.lang.reflect.Constructor 類的 newInstance() 實(shí)例方法
(3) 調(diào)用對象的 clone() 方法
(4) 運(yùn)用反序列化手段,調(diào)用 java.io.ObjectInputStream 對象的 readObject() 方法
(1)和(2)都會明確的顯式的調(diào)用構(gòu)造函數(shù)伞矩;(3)是在內(nèi)存上對已有對象的影印笛洛,所以不會調(diào)用構(gòu)造函數(shù) (4)是從文件中還原類的對象夏志,也不會調(diào)用構(gòu)造函數(shù)乃坤。
序列化(Serializable )與反序列化(Deserialize)
對象序列化(Serializable)是指將對象轉(zhuǎn)換為字節(jié)序列的過程,而反序列化則是根據(jù)字節(jié)序列恢復(fù)對象的過程沟蔑。
序列化一般用于以下場景:
1.永久性保存對象湿诊,保存對象的字節(jié)序列到本地文件中;
2.通過序列化對象在網(wǎng)絡(luò)中傳遞對象瘦材;
3.通過序列化在進(jìn)程間傳遞對象厅须。
只有實(shí)現(xiàn)了Serializable和Externalizable接口的類的對象才能被序列化,
java.io.ObjectOutputStream代表對象輸出流食棕,它的writeObject(Objectobj)方法可對參數(shù)指定的obj對象進(jìn)行序列化朗和,把得到的字節(jié)序列寫到一個目標(biāo)輸出流中。
java.io.ObjectInputStream代表對象輸入流簿晓,它的readObject()方法從一個源輸入流中讀取字節(jié)序列眶拉,再把它們反序列化為一個對象,并將其返回憔儿。
覆蓋 (Override) 和重載 (Overload)
Java 中的方法重載發(fā)生在同一個類里面兩個或者是多個方法的方法名相同但是參數(shù)不同的情況忆植;
方法覆蓋是說子類重新定義了父類的方法,方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型朝刊。
內(nèi)存中的棧(stack)耀里、堆(heap)和靜態(tài)存儲區(qū)的用法
通常我們定義一個基本數(shù)據(jù)類型的變量,一個對象的引用拾氓,還有就是函數(shù)調(diào)用的現(xiàn)場保存都使用內(nèi)存中的椃肟妫空間;而通過new關(guān)鍵字和構(gòu)造器創(chuàng)建的對象放在堆空間咙鞍;程序中的字面量(literal)如直接書寫的100织堂、“hello”和常量都是放在靜態(tài)存儲區(qū)中。椖坛拢空間操作最快但是也很小易阳,通常大量的對象都是放在堆空間,整個內(nèi)存包括硬盤上的虛擬內(nèi)存都可以被當(dāng)成堆空間來使用吃粒。
String str = new String(“hello”);
上面的語句中 str 放在棧上潦俺,用 new 創(chuàng)建出來的字符串對象放在堆上,而“hello”這個字面量放在靜態(tài)存儲區(qū)徐勃。
強(qiáng)引用事示、弱引用、軟引用僻肖、虛引用
強(qiáng)引用:如“Object obj = new Object()”肖爵,這類引用是 Java 程序中最普遍的。只要強(qiáng)引用還存在臀脏,垃圾收集器就永遠(yuǎn)不會回收掉被引用的對象劝堪。
軟引用:它用來描述一些可能還有用,但并非必須的對象揉稚。在系統(tǒng)內(nèi)存不夠用時秒啦,這類引用關(guān)聯(lián)的對象將被垃圾收集器回收。JDK1.2 之后提供了 SoftReference 類來實(shí)現(xiàn)軟引用搀玖。
弱引用:它也是用來描述非需對象的余境,但它的強(qiáng)度比軟引用更弱些,被弱引用關(guān)聯(lián)的對象只能生存島下一次垃圾收集發(fā)生之前灌诅。當(dāng)垃圾收集器工作時芳来,無論當(dāng)前內(nèi)存是否足夠,都會回收掉只被弱引用關(guān)聯(lián)的對象猜拾。在 JDK1.2 之后即舌,提供了 WeakReference 類來實(shí)現(xiàn)弱引用。
虛引用:最弱的一種引用關(guān)系关带,完全不會對其生存時間構(gòu)成影響侥涵,也無法通過虛引用來取得一個對象實(shí)例沼撕。為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的是希望能在這個對象被收集器回收時收到一個系統(tǒng)通知。JDK1.2 之后提供了 PhantomReference 類來實(shí)現(xiàn)虛引用芜飘。
Java 7之基礎(chǔ) - 強(qiáng)引用务豺、弱引用、軟引用嗦明、虛引用
Java垃圾回收機(jī)制
在C++中笼沥,對象所占的內(nèi)存在程序結(jié)束運(yùn)行之前一直被占用,在明確釋放之前不能分配給其它對象娶牌;而在Java中奔浅,當(dāng)沒有對象引用指向原先分配給某個對象的內(nèi)存時,該內(nèi)存便成為垃圾诗良。JVM的一個系統(tǒng)級線程會自動釋放該內(nèi)存塊汹桦。垃圾收集意味著程序不再需要的對象是"無用信息",這些信息將被丟棄鉴裹。當(dāng)一個對象不再被引用的時候舞骆,內(nèi)存回收它占領(lǐng)的空間,以便空間被后來的新對象使用径荔。事實(shí)上督禽,除了釋放沒用的對象,垃圾收集也可以清除內(nèi)存記錄碎片总处。由于創(chuàng)建對象和垃圾收集器釋放丟棄對象所占的內(nèi)存空間狈惫,內(nèi)存會出現(xiàn)碎片。碎片是分配給對象的內(nèi)存塊之間的空閑內(nèi)存洞鹦马。碎片整理將所占用的堆內(nèi)存移到堆的一端胧谈,JVM將整理出的內(nèi)存分配給新的對象。
垃圾收集能自動釋放內(nèi)存空間菠红,減輕編程的負(fù)擔(dān)第岖。這使Java虛擬機(jī)具有一些優(yōu)點(diǎn)。首先试溯,它能使編程效率提高。在沒有垃圾收集機(jī)制的時候郊酒,可能要花許多時間來解決一個難懂的存儲器問題遇绞。在用Java語言編程的時候,靠垃圾收集機(jī)制可大大縮短時間燎窘。其次是它保護(hù)程序的完整性摹闽, 垃圾收集是Java語言安全性策略的一個重要部份。垃圾收集的一個潛在的缺點(diǎn)是它的開銷影響程序性能褐健。Java虛擬機(jī)必須追蹤運(yùn)行程序中有用的對象付鹿,而且最終釋放沒用的對象澜汤。這一個過程需要花費(fèi)處理器的時間。其次垃圾收集算法的不完備性舵匾,早先采用的某些垃圾收集算法就不能保證100%收集到所有的廢棄內(nèi)存俊抵。當(dāng)然隨著垃圾收集算法的不斷改進(jìn)以及軟硬件運(yùn)行效率的不斷提升,這些問題都可以迎刃而解坐梯。
一般來說徽诲,Java開發(fā)人員可以不重視JVM中堆內(nèi)存的分配和垃圾處理收集,但是吵血,充分理解Java的這一特性可以讓我們更有效地利用資源谎替。同時要注意finalize()方法是Java的缺省機(jī)制,有時為確保對象資源的明確釋放蹋辅,可以編寫自己的finalize方法钱贯。(引用自百度)
Java 垃圾收集機(jī)制
List,Map,Set
HashCode和equal方法
1、hashCode的存在主要是用于查找的快捷性侦另,如Hashtable喷舀,HashMap等,hashCode是用來在散列存儲結(jié)構(gòu)中確定對象的存儲地址的淋肾;
2硫麻、如果兩個對象相同,就是適用于equals(java.lang.Object) 方法樊卓,那么這兩個對象的hashCode一定要相同拿愧;
3、如果對象的equals方法被重寫碌尔,那么對象的hashCode也盡量重寫浇辜,并且產(chǎn)生hashCode使用的對象,一定要和equals方法中使用的一致唾戚,否則就會違反上面提到的第2點(diǎn)柳洋;
4、兩個對象的hashCode相同叹坦,并不一定表示兩個對象就相同熊镣,也就是不一定適用于equals(java.lang.Object)方法,只能夠說明這兩個對象在散列存儲結(jié)構(gòu)中募书,如Hashtable绪囱,他們“存放在同一個籃子里”。
HashCode和equal方法
用戶線程(User Thread)與守護(hù)線程(Daemon Thread)
守護(hù)線程莹捡,是指用戶程序在運(yùn)行的時候后臺提供的一種通用服務(wù)的線程鬼吵。只要當(dāng)前JVM實(shí)例中尚存在任何一個用戶線程沒有結(jié)束,守護(hù)線程就全部工作篮赢;只有當(dāng)最后一個用戶線程結(jié)束時齿椅,守護(hù)線程隨著 JVM 一同結(jié)束工作琉挖。 守護(hù)線程最典型的應(yīng)用就是 GC (垃圾回收器)。
JAVA并發(fā)編程——守護(hù)線程(Daemon Thread)