李剛老師的《瘋狂Java講義》(第三版)是個人啓蒙做品,前先後後一共看了3遍,每次都有新的認識。java
接下來的一段時間就將一些經典的知識記錄下來。程序員
1.計算機高級語言的執行方式分爲編譯型和解釋型,前者運行高效但不能跨平臺(C,C++,Object-C),後臺能夠跨平臺但效率不高(Ruby,Python)。Java比較特殊,先編譯生成.class,再在JVM中解釋。算法
2.垃圾回收機制:依靠垃圾回收算法,什麼時候回收對Java程序員而言具備透明性,所以要養成良好的習慣——對於不須要的對象,不要引用他們。(在堆中進行回收)spring
3.Java是強類型語言:全部類變量必須先聲明後使用,指定類型的變量只能接受與類型相匹配的值。編程
4.Java支持兩種類型:數組
5.強制類型轉化:形成溢出時,以前一直以爲19.745會變成19(實在汗顏),實際上是轉換成二進制後再進行截取。緩存
6.常量池:在編譯期被肯定,並已被保存在.class文件中的一些數據。包括類、方法、接口中的常量,也包括字符串常量。併發
7.switch語句:控制表達式的數據類型只能是byte,short,char,int,枚舉,String.工具
8.break和continue能夠經過標籤跳到指定的循環層測試
public class BreakTest2 { public static void main(String[] args) { outer: for (int i = 0 ; i < 5 ; i++ ) { for (int j = 0; j < 3 ; j++ ) { System.out.println("i的值爲:" + i + " j的值爲:" + j); if (j == 1) { break outer; } } } } }
9.棧和堆:
10.Arrays:Java8增長的工具類,在java.util包下,支持併發編程
// 定義一個a數組 int[] a = new int[]{3, 4 , 5, 6}; // 定義一個a2數組 int[] a2 = new int[]{3, 4 , 5, 6}; // a數組和a2數組的長度相等,每一個元素依次相等,將輸出true System.out.println("a數組和a2數組是否相等:" + Arrays.equals(a , a2)); // 經過複製a數組,生成一個新的b數組 int[] b = Arrays.copyOf(a, 6); System.out.println("a數組和b數組是否相等:" + Arrays.equals(a , b)); // 輸出b數組的元素,將輸出[3, 4, 5, 6, 0, 0] System.out.println("b數組的元素爲:" + Arrays.toString(b)); // 將b數組的第3個元素(包括)到第5個元素(不包括)賦爲1 Arrays.fill(b , 2, 4 , 1); // 輸出b數組的元素,將輸出[3, 4, 1, 1, 0, 0] System.out.println("b數組的元素爲:" + Arrays.toString(b)); // 對b數組進行排序 Arrays.sort(b); // 輸出b數組的元素,將輸出[0, 0, 1, 1, 3, 4] System.out.println("b數組的元素爲:" + Arrays.toString(b)); }
11.Java語言經過new關鍵字調用構造器。
12.this關鍵字:
public class ReturnThis { public int age; public ReturnThis grow() { age++; // return this返回調用該方法的對象 return this; } public static void main(String[] args) { ReturnThis rt = new ReturnThis(); // 能夠連續調用同一個方法 rt.grow() .grow() .grow(); System.out.println("rt的age成員變量值是:" + rt.age); } }
13.static:不要使用對象去調用static修飾的成員變量,要使用類去調用。
14.值傳遞:將實際參數的副本傳入方法內,參數自己不會受到任何影響。
15.形參可變的方法:定義方法時,在最後一個形參的類型後增長三個點(...)。多個參數值被當成數組傳入。與傳入數組相比,形參可變動加簡潔,但一個方法只能有一個可變形參。
public class Varargs { // 定義了形參個數可變的方法 public static void test(int a , String... books) { // books被當成數組處理 for (String tmp : books) { System.out.println(tmp); } // 輸出整數變量a的值 System.out.println(a); } public static void main(String[] args) { // 調用test方法 test(5 , "瘋狂Java講義" , "輕量級Java EE企業應用實戰"); } }
16.遞歸算法:一個方法調用自身,必定要向已知方向遞歸。
17.局部變量:形參(方法簽名中定義的變量),方法局部變量(在方法內定義),代碼塊局部變量(在代碼塊內定義),局部變量不屬於任何類或者實例,它老是保存在其所在方法的棧內存中。
18.封裝:類的成員變量不直接暴露,而是經過方法實現操做和訪問,以便於在方法中添加一些限制條件
19.高內聚:儘量把模塊的內部數據、功能實現細節隱藏在模塊內部獨立完成,不容許外部直接干預;低耦合:僅暴露少許的方法給外部使用。
20.靜態導入:JDK1.5增長的導包方法,用於導入包內的靜態成員 import static package...
21.構造器:
22.方法重寫(覆蓋)原則:
23.當程序建立一個子類對象時,系統不只會爲該類中定義的實例變量分配內存,也會爲它從父類繼承獲得的全部實例變量分配內存。
24.引用變量類型:
25.向上轉型:把一個子類對象直接賦值給父類引用變量;強制類型轉換:把一個父類對象賦給子類引用變量
26多態:
27.instanceof:判斷前面的對象是不是後面的類,或者其子類、實現類的實例
String str="str"; //true System.out.println(str instanceof Object); Object obj=new Object(); //false System.out.println(obj instanceof String);
28.繼承與組合:
29.初始化塊:
30.包裝類:包裝類的實例能夠與數值類型直接比較
31.toString:自定義類時,儘可能重寫類的toString方法,便於輸出實例的值
32.==與equals:
// s1直接引用常量池中的"瘋狂Java" String s1 = "瘋狂Java"; String s2 = "瘋狂"; String s3 = "Java"; // s4後面的字符串值能夠在編譯時就肯定下來 // s4直接引用常量池中的"瘋狂Java" String s4 = "瘋狂" + "Java"; // s5後面的字符串值能夠在編譯時就肯定下來 // s5直接引用常量池中的"瘋狂Java" String s5 = "瘋" + "狂" + "Java"; // s6後面的字符串值不能在編譯時就肯定下來, // 不能引用常量池中的字符串 String s6 = s2 + s3; // 使用new調用構造器將會建立一個新的String對象, // s7引用堆內存中新建立的String對象 String s7 = new String("瘋狂Java"); System.out.println(s1 == s4); // 輸出true System.out.println(s1 == s5); // 輸出true System.out.println(s1 == s6); // 輸出false System.out.println(s1 == s7); // 輸出false
33.重寫equals的條件:
34.null類型的實例能夠訪問類的靜態方法和靜態變量,在底層是經過該實例的類去訪問的
35.final:
36.宏變量:定義final變量時就爲該變量指定了初始值,並且能夠在編譯時就肯定下來,編譯器會把程序中全部用到改變量的地方直接替換成該變量的值(進入常量池)
37.不可變類:
38.緩存池:先進先出緩存實例,重寫了equals和hsahcode
class CacheImmutale { private static int MAX_SIZE = 10; // 使用數組來緩存已有的實例 private static CacheImmutale[] cache = new CacheImmutale[MAX_SIZE]; // 記錄緩存實例在緩存中的位置,cache[pos-1]是最新緩存的實例 private static int pos = 0; private final String name; private CacheImmutale(String name) { this.name = name; } public String getName() { return name; } public static CacheImmutale valueOf(String name) { // 遍歷已緩存的對象, for (int i = 0 ; i < MAX_SIZE; i++) { // 若是已有相同實例,直接返回該緩存的實例 if (cache[i] != null && cache[i].getName().equals(name)) { return cache[i]; } } // 若是緩存池已滿 if (pos == MAX_SIZE) { // 把緩存的第一個對象覆蓋,即把剛剛生成的對象放在緩存池的最開始位置。 cache[0] = new CacheImmutale(name); // 把pos設爲1 pos = 1; } else { // 把新建立的對象緩存起來,pos加1 cache[pos++] = new CacheImmutale(name); } return cache[pos - 1]; } public boolean equals(Object obj) { if(this == obj) { return true; } if (obj != null && obj.getClass() == CacheImmutale.class) { CacheImmutale ci = (CacheImmutale)obj; return name.equals(ci.getName()); } return false; } public int hashCode() { return name.hashCode(); } } public class CacheImmutaleTest { public static void main(String[] args) { CacheImmutale c1 = CacheImmutale.valueOf("hello"); CacheImmutale c2 = CacheImmutale.valueOf("hello"); // 下面代碼將輸出true System.out.println(c1 == c2); } }
39.默認方法:
40.抽象類:抽象類做爲多個子類的抽象父類,能夠被當成系統實現過程的中間產品,這個中間產品已經實現了系統的部分功能,但這個產品依然不能當成最終產品,必須由進一步的完善,
41.內部類:
42.非靜態內部類:
43.靜態內部類:
44.內部類的使用:
public class SubClass extends Out.In { //顯示定義SubClass的構造器 public SubClass(Out out) { //經過傳入的Out對象顯式調用In的構造器 out.super("hello"); } }
45.匿名內部類:
46.枚舉類:可使用枚舉類來替代靜態final常量
public class Enum { public enum Season{ spring,summer,fall,winter; } public static void main(String[] args) { Season season=Season.spring; System.out.println(season); switch (season){ case spring: System.out.println("spring"); break; case summer: System.out.println("summer"); break; case fall: System.out.println("fall"); break; case winter: System.out.println("winter"); break; } }
47.垃圾回收:
public class FinalizeTest { private static FinalizeTest ft = null; public void info() { System.out.println("測試資源清理的finalize方法"); } public static void main(String[] args) throws Exception { // 建立FinalizeTest對象當即進入可恢復狀態 new FinalizeTest(); // 通知系統進行資源回收 // System.gc(); //① // 強制垃圾回收機制調用可恢復對象的finalize()方法 // Runtime.getRuntime().runFinalization(); //② System.runFinalization(); //③ ft.info(); } public void finalize() { // 讓tf引用到試圖回收的可恢復對象,便可恢復對象從新變成可達 ft = this; } }
48.引用類型: