Java有自動的垃圾回收器,不須要人工回收內存,例如,文件或使用了系統資源的另外一個對象的句柄。在這種狀況下,當資源的再也不須要時,將其回收和再利用將顯得十分重要。能夠爲任何一個類添加 finalize 方法。finalize 方法將在垃圾回收器清除對象以前調用 。在實際應用中,不要依賴於使用finalize 方法回收任何短缺的資源 , 這是由於很難知道這個方法何時纔可以調用。(這點實際上是和net機制是同樣的)html
Java包概念其實就是net中命名空間java
綜上所述 : • 只能在繼承層次內進行類型轉換 。 • 在將超類轉換成子類以前 ,應該使用instanceof 進行檢查。segmentfault
abstract中能夠包含具體實現,不能被實例化,同C#是同樣的。數組
Java 中它容許在運行時肯定數組的大小數據結構
對象中的數據稱爲實例域 ( instance field ) , 操縱數據的過程稱爲方法 ( method )app
數組列表(ArryList)的容量與數組的大小有一個很是重要的區別。若是爲數組分配 100 個元素的存儲空間,數組就有100 個空位置可使用 。而容量爲 100 個元素的數組列表只是擁有保存 100 個元素的潛力 ( 實際上,從新分配空間的話 , 將會超過100 ) , 可是在最初 ,甚至完成初始化構造以後 ,數組列表根本就不含有任何元素 。jvm
一旦可以確認數組列表的大小再也不發生變化,就能夠調用 trimToSize 方法 。這個方法將存儲區域的大小調整爲當前元素數量所須要的存儲空間數目。垃圾回收器將回收多餘的存儲空間。spa
有時,須要將 int 這樣的基本類型轉換爲對象。全部的基本類型都冇一個與之對應的類。。例如,Integer 類對應基本類型 int.一般,這些類稱爲包裝器( wrapper ).net
裝箱和拆箱是編譯器承認的,而不是虛擬機。編譯器在生成類的字節碼時,插人必要的方法調用。虛擬機只是執行這些字節碼 。線程
除非全部繼承的方法都有意義,不然不要使用繼承
在覆蓋方法事,不要改變預期的行爲 假如我就是要這樣設計,Holiday類繼承GregorianCalendar類,那麼我只能把共有方法add覆蓋成合理的代碼,或者什麼都不作,或者拋出一個異常。可是add方法變味了,變的不像我當初設計的那樣了。這裏做者的意思是:不要這樣,在覆蓋父類中的方法時,不要偏離最初的設計想法。
使用多態,而非類型信息
有了抽象類爲何還要引入接口?
使用抽象類表示通用屬性存在這樣一個問題:每一個類只能擴展於一個類。 接口能夠提供多重繼承的大多數好處,同時還能避免多重繼承的複雜性和低效性。
接口中支持靜態方法
public interface InterfaceA { static void getName() { System.out.println("6666"); } }
默認方法
public interface InterfaceA { default void getName() { System.out.println("6666"); } }
默認方法解決衝突
超類優先
內部類是一種編譯器現象,與虛擬機無關。編譯器將會把內部類翻譯成用$分隔外部類名與內部類名的常規類文件,而虛擬機則對此一無所知。
TalkingClock$TimePrinter.class
內部類:http://www.javashuo.com/article/p-qxqvuwlq-eb.html
http://www.javashuo.com/article/p-ykcbqdos-da.html
若是在子類中覆蓋了超類的一個方法,子類方法中聲明的受查異常不能比超類方 法中聲明的異常更通用( 也就是說,子類方法中能夠拋出更特定的異常,或者根本不拋出任何異常。特別須要說明的是,若是超類方法沒有拋出任何受查常,子類也不能拋出任何受查異常。
帶資源的try語句 try - with - resources ) 的最簡形式爲 : try ( Resource res = . . . ) { work with res }
try塊退出時,會自動調用res.close。
靜態的Thread.getAllStackTrace()方法,它能夠產生全部線程的堆棧軌跡。
Map<Thread,StackTraceElement[ ]> map = Thread.getAl1StackTraces(); for ( Thread t : map .keySet()) { StackTraceElement[ ] frames = map.get( t ) ; analyze frames }
全局日誌記錄器
Logger.getClobal().info()
關閉/開啓全部級別記錄
Logger.getClobal().setLevel(Level.OFF)
Level.ALL
獲取記錄器
private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp")
修改日誌管理器配置
配置文件地址:jre/lib/1ogging.properties
日誌管理器在VM啓動過程當中初始化,這在 main 執行以前完成。若是在main中調用 System.setProperty("java.util.logging.config.file",file) ,也會調用LogManager.readConfiguration( )來從新初始化曰志管理器。
前期泛型程序設計是用繼承實現的,ArrayList類只維護一個Object引用的數組:
public class ArrayList{ private Object [ ] elementData; public Object get ( int i ) { } public void add ( Object o ) { } }
這種方式存在的問題:
public static <T extends Coiparab1e> T min(T[] a) { }
一個類型變量或通配符能夠有多個限定,T extends Comparable & Serializable 限定類型用 「 & 」 分隔,而逗號用來分隔類型變量
https://www.cnblogs.com/DebugLZQ/archive/2012/09/03/2669383.html
http://www.javashuo.com/article/p-stdyutiz-ga.html
https://blog.csdn.net/tianshiainiforever/article/details/51698863
http://www.javashuo.com/article/p-rqpfykzm-dz.html
Iterator 接口的 remove 方法將會刪除上次調用 next 方法時返回的元素。 在決定刪除某個元素以前應該先看一下這個元素是很具備實際意義的。然而,若是想要刪除指定位置上的元素,仍然須要越過這個元素。若是調用remove以前沒有調用 next 將是不合法的。若是這樣作,將會拋出一個 IllegalStateException 異常。
Iterator<String> it = c.iterator(); it.next(); it.remove();
優先級隊列使用了一個優雅且高效的數據結構,稱爲堆( heap )。堆(可不是jvm中的堆)是一個能夠自我調整的二叉樹,對樹執行添加( add ),和刪除 ( remore ) 操做,可讓最小的元素移動到根,而沒必要花費時間對元素進行排序。