github(持續更新,歡迎star,fork補充)
自動裝箱(autoboxing)與拆箱(unboxing)
自動裝箱是 Java 編譯器在基本數據類型和對應的對象包裝類型之間做的一個轉化。
比如:把 int 轉化成 Integer,double 轉化成 Double等,反之就是自動拆箱。
Java中的自動裝箱與拆箱
Java 創建對象的幾種方式
(1) 用 new 語句創建對象,這是最常見的創建對象的方法
(2) 運用反射手段,調用 java.lang.Class 或者 java.lang.reflect.Constructor 類的 newInstance() 實例方法
(3) 調用對象的 clone() 方法
(4) 運用反序列化手段,調用 java.io.ObjectInputStream 對象的 readObject() 方法
(1)和(2)都會明確的顯式的調用構造函數;(3)是在內存上對已有對象的影印,所以不會調用構造函數 (4)是從文件中還原類的對象,也不會調用構造函數。
序列化(Serializable )與反序列化(Deserialize)
對象序列化(Serializable)是指將對象轉換為字節序列的過程,而反序列化則是根據字節序列恢復對象的過程。
序列化一般用于以下場景:
1.永久性保存對象,保存對象的字節序列到本地文件中;
2.通過序列化對象在網絡中傳遞對象;
3.通過序列化在進程間傳遞對象。
只有實現了Serializable和Externalizable接口的類的對象才能被序列化,
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Objectobj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,并將其返回。
覆蓋 (Override) 和重載 (Overload)
Java 中的方法重載發生在同一個類里面兩個或者是多個方法的方法名相同但是參數不同的情況;
方法覆蓋是說子類重新定義了父類的方法,方法覆蓋必須有相同的方法名,參數列表和返回類型。
內存中的棧(stack)、堆(heap)和靜態存儲區的用法
通常我們定義一個基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用內存中的棧空間;而通過new關鍵字和構造器創建的對象放在堆空間;程序中的字面量(literal)如直接書寫的100、“hello”和常量都是放在靜態存儲區中。棧空間操作最快但是也很小,通常大量的對象都是放在堆空間,整個內存包括硬盤上的虛擬內存都可以被當成堆空間來使用。
String str = new String(“hello”);
上面的語句中 str 放在棧上,用 new 創建出來的字符串對象放在堆上,而“hello”這個字面量放在靜態存儲區。
強引用、弱引用、軟引用、虛引用
強引用:如“Object obj = new Object()”,這類引用是 Java 程序中最普遍的。只要強引用還存在,垃圾收集器就永遠不會回收掉被引用的對象。
軟引用:它用來描述一些可能還有用,但并非必須的對象。在系統內存不夠用時,這類引用關聯的對象將被垃圾收集器回收。JDK1.2 之后提供了 SoftReference 類來實現軟引用。
弱引用:它也是用來描述非需對象的,但它的強度比軟引用更弱些,被弱引用關聯的對象只能生存島下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。在 JDK1.2 之后,提供了 WeakReference 類來實現弱引用。
虛引用:最弱的一種引用關系,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。為一個對象設置虛引用關聯的唯一目的是希望能在這個對象被收集器回收時收到一個系統通知。JDK1.2 之后提供了 PhantomReference 類來實現虛引用。
Java 7之基礎 - 強引用、弱引用、軟引用、虛引用
Java垃圾回收機制
在C++中,對象所占的內存在程序結束運行之前一直被占用,在明確釋放之前不能分配給其它對象;而在Java中,當沒有對象引用指向原先分配給某個對象的內存時,該內存便成為垃圾。JVM的一個系統級線程會自動釋放該內存塊。垃圾收集意味著程序不再需要的對象是"無用信息",這些信息將被丟棄。當一個對象不再被引用的時候,內存回收它占領的空間,以便空間被后來的新對象使用。事實上,除了釋放沒用的對象,垃圾收集也可以清除內存記錄碎片。由于創建對象和垃圾收集器釋放丟棄對象所占的內存空間,內存會出現碎片。碎片是分配給對象的內存塊之間的空閑內存洞。碎片整理將所占用的堆內存移到堆的一端,JVM將整理出的內存分配給新的對象。
垃圾收集能自動釋放內存空間,減輕編程的負擔。這使Java虛擬機具有一些優點。首先,它能使編程效率提高。在沒有垃圾收集機制的時候,可能要花許多時間來解決一個難懂的存儲器問題。在用Java語言編程的時候,靠垃圾收集機制可大大縮短時間。其次是它保護程序的完整性, 垃圾收集是Java語言安全性策略的一個重要部份。垃圾收集的一個潛在的缺點是它的開銷影響程序性能。Java虛擬機必須追蹤運行程序中有用的對象,而且最終釋放沒用的對象。這一個過程需要花費處理器的時間。其次垃圾收集算法的不完備性,早先采用的某些垃圾收集算法就不能保證100%收集到所有的廢棄內存。當然隨著垃圾收集算法的不斷改進以及軟硬件運行效率的不斷提升,這些問題都可以迎刃而解。
一般來說,Java開發人員可以不重視JVM中堆內存的分配和垃圾處理收集,但是,充分理解Java的這一特性可以讓我們更有效地利用資源。同時要注意finalize()方法是Java的缺省機制,有時為確保對象資源的明確釋放,可以編寫自己的finalize方法。(引用自百度)
Java 垃圾收集機制
List,Map,Set
HashCode和equal方法
1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲結構中確定對象的存儲地址的;
2、如果兩個對象相同,就是適用于equals(java.lang.Object) 方法,那么這兩個對象的hashCode一定要相同;
3、如果對象的equals方法被重寫,那么對象的hashCode也盡量重寫,并且產生hashCode使用的對象,一定要和equals方法中使用的一致,否則就會違反上面提到的第2點;
4、兩個對象的hashCode相同,并不一定表示兩個對象就相同,也就是不一定適用于equals(java.lang.Object)方法,只能夠說明這兩個對象在散列存儲結構中,如Hashtable,他們“存放在同一個籃子里”。
HashCode和equal方法
用戶線程(User Thread)與守護線程(Daemon Thread)
守護線程,是指用戶程序在運行的時候后臺提供的一種通用服務的線程。只要當前JVM實例中尚存在任何一個用戶線程沒有結束,守護線程就全部工作;只有當最后一個用戶線程結束時,守護線程隨著 JVM 一同結束工作。 守護線程最典型的應用就是 GC (垃圾回收器)。
JAVA并發編程——守護線程(Daemon Thread)