特色php
三種核心機制
css
注意,Java 語言是跨平臺(write once run anywhere)的,JVM 不是跨平臺的。Java 的跨平臺經過 JVM 實現。html
三大平臺(技術架構)前端
關於 JVM - JRE - JDKjava
關於 Java.exe - Javac.exe正則表達式
關於 Java 的配置算法
Java程序執行步驟: .java源文件,先編譯 -> .class(與平臺無關的字節碼文件) -> 後解釋,經過 JVM -> 特定平臺的機器碼 編程
package packageName; import | import static packageName; public classDefinition | interfaceDefinition | EnumDefinition {} classDefinition | interfaceDefinition | EnumDefinition {}
注:一個源文件中只能有一個public類,不然編譯器找不到應該執行的main方法,可是一個源文件中能夠有多個非public類。一個源文件中也只能有一個public接口。一個源文件中也只能有一個public枚舉類。設計模式
關於訪問修飾符數組
垃圾回收
只負責在合適時間回收堆內存中處於不可達狀態的對象。強制(建議)進行垃圾回收方法:
finalize:默認機制,Object 類的實例方法: protected void finalize() throws Throwable
虛引用:主要用於追蹤對象被垃圾回收的狀態。虛引用必須與引用隊列聯合使用
JAR包 :Java 檔案文件,Java Archive File。
注意事項
Java類庫
[修飾符] class 類名 { 初始化塊;成員變量;構造器;方法;內部類; }
[1]. Scanner 類
基於正則表達式的文本掃描器:輸入流、文件、字符串。
[2]. System/Runtime 類
與程序的運行平臺/運行時環境交互:環境變量、系統屬性以及文件加載、垃圾回收和資源清理。
System.identityHashCode(Object obj):根據指定對象的地址精確計算到的hashCode值,identityHashCode值惟一標識對象。
Java 程序和 Runtime 實例一對一,getRuntime() 獲取。Runtime 類能夠單獨啓動一個進程運行操做系統的命令:rt.exec("命令");
[3]. String/Math 類
[4]. Random/ThreadLocalRandom 類
減小多線程資源競爭,保證線程安全行性,靜態 current() 方法獲取 ThreadLocalRandom 對象。
Random rand = new Random(System.currentTimeMillis());
[5]. BigDecimal 類
解決 double 類型精度丟失問題、精確計算浮點數,建立方法:
· 基於 String 的構造器建立:new BigDecimal(String str);
· 以 double 參數建立:BigDecimal.valueOf(double value);
[6]. Date/Calender 類
Date 類不推薦使用。Calender 類是抽象類,靜態方法 getInstance() 獲取 Calender 對象,Calender 支持較好的容錯性。注意,其 set() 方法有延遲修改的性質,能夠避免觸發屢次沒必要要的計算。
[7]. 其餘經常使用方法
· MessageFormat:格式化字符串;
· NumberFormat:格式化數字;
· (Simple)DateFormat:格式化時間、日期;
=> DateTimeFormatter 格式器類:格式化日期時間、字符串解析;
類單繼承,extends,Java類只能有一個直接父類。java.lang.Object類是全部類的父類。接口多實現,implements。
java.lang.Object
class MyObj implements Cloneable { public MyObj clone(){ return (MyObj)super.clone(); } }
Java規定:
Objects 工具類:空指針安全的
[1]. Objects.requireNonNull(obj):對方法的形參做輸入校驗;
protected ~ final
protected:容許子類重寫父類方法,但不容許其餘類訪問,final是不容許子類重寫父類方法。
final:[1]. 變量不可變,方法不可重寫,類不能被繼承; [2]. 定義宏變量;
不可變類
該類的對象建立後,對象的實例變量不可變。注意,包含引用類型成員變量的不可變類須要提供保護措施。
[1]. private final 成員變量;
[2]. 帶參的構造器初始化[1]的成員變量,僅提供getter()方法;
this ~ super
this 是調用同一個類中重載的構造,super 是調用父類的構造器。
構造器 ~ 初始化塊
對Java對象執行指定的初始化操做。構造函數是給相應的對象初始化操做。
初始化塊在建立Java對象時隱式執行且在構造器以前。初始化塊沒有名字標識,修飾符只能爲static,靜態初始化塊先於普通初始化塊執行。
關於構造代碼塊和構造方法的關係(最好經過反編譯一個類來了解)
instanceof ~ (type)
objA instanceof classB,判斷引用類型對象objA是不是classB類或是其子類、實現類的實例。objA 的編譯時類型要麼是classB,要麼與classB有父子繼承關係,不然編譯錯誤。 在強制類型轉換(type)以前,先進行instanceof判斷,避免出現ClassCastException異常。相似 C# 中的 is 運算符。
if(objA instanceof classB) classB objB = (classB)objA;
組合 ~ 繼承
類的2種複用機制,組合是把舊類對象做爲新類的(private)成員變量進行整合用於實現新類的功能,繼承是(is-a)關係,組合是(has-a)關係;二者開銷僅差一個private成員變量。
abstract ~ final ~ static ~ private
abstract類只能被繼承,abstract方法必須由子類重寫。
[1]. abstract不能與final同時修飾類或方法;
[2]. abstract不能與static同時修飾方法,但能夠同時修飾內部類;
[3]. abstract不能與private同時修飾方法;
接口 ~ 抽象類
抽象類:abstract,多個類的模板,模板模式;
接口:interface,多個類應遵照的公共行爲規範,面向接口耦合和通訊;
[1]. 成員變量:靜態常量,默認 public static final ;
[2]. 方法:抽象方法,默認 public abstract,同時Java8容許在接口裏定義默認方法(default)和類方法(static),注意接口沒有構造方法
[3]. 內部類,內部接口,內部枚舉,默認 public static;
多態
數據成員:父類和子類有相同的成員變量,多態下訪問的是父類的成員變量
成員方法
優勢:成員內部類做爲外部類的成員,能夠訪問外部類的任何成員
場景:A類和B類,A類想直接訪問B類的成員,而B類又需創建A類的對象來訪問A類中的成員。這時,應該將A類定義成B類的內部類。
做用域
相互訪問
注意,內部類不能被外部類的子類重寫(類的限定名確定不一樣)。
非靜態內部類
實例相關,非靜態內部類對象裏保存外部類對象的引用,依存於外部類對象;非靜態內部類裏不能定義靜態成員(至於爲何,能夠考慮類的加載過程,並參考 http://bbs.csdn.net/topics/90510249);
外部類訪問內部類:(new innerClass()).innerVar;
非靜態內部類的構造器必須經過外部類對象調用;非靜態內部類的子類的對象也依存於外部類對象;
靜態內部類
static,類相關,靜態內部類對象保存外部類的引用,依存於外部類;接口的內部類默認是 public static;
外部類訪問內部類:[1]. (new innerStaticClass()).innerVar;[2]. innerStaticClass.innerStaticVar;
靜態內部類的構造器經過外部類調用;
匿名內部類
匿名內部類不能重複使用,必須繼承一個父類或實現一個接口。被匿名內部類訪問的局部變量默認是 final。最經常使用的建立匿名內部類的狀況是須要建立某個只有抽象方法的接口類型的對象。
注意,上面介紹的內部類都是成員內部類,還有一種特殊的內部類是定義在外部類的成員函數中,叫局部內部類,局部內部類只能訪問該成員函數的 final 屬性。
Java8 引入 Lamba 表達式升級簡化匿名內部類、匿名方法,容許建立函數式接口的實例。Lambda 表達式的目標類型能且必須是明確的函數式接口,函數式接口只能聲明一個抽象方法。
[1]. 建立臨時對象; [2]. 賦值;
格式:(形參列表)->{代碼塊/方法體}
方法引用 ~ 構造器引用
當方法體只有一條代碼時,能夠用方法引用和構造器引用替代 Lambda 表達式。
格式:類名::類方法/實例方法/new
本質:利用簡潔的語法建立函數式接口的實例! 關於匿名內部類和 Lamba 表達式的異同自行百度。
枚舉類顯式繼承 java.lang.Enum 類,java.lang.Enum 類實現了 java.lang.Comparable 和 java.lang.Serializable 兩個接口。
1. public static <T extends Enum<T>> T valueOf(Class<T> enumType, string name)
靜態方法,用於返回指定枚舉類中指定名稱的枚舉值,以枚舉類 SeasonEnum 爲例:
-- SeasonEnum se = Enum.valueOf(SeasonEnum.class, "SPRING" );
-- SeasonEnum se = SeasonEnum.valueOf( "SPRING" );
2. 返回枚舉常量名稱、索引值
-- SeasonEnum.SPRING;
-- SeasonEnum.SPRING.name();
-- SeasonEnum.SPRING.toString();
-- SeasonEnum.SPRING.ordinal(); // 索引值
3. 抽象枚舉類
枚舉類中利用 abstract 定義抽象方法,枚舉類默認修飾爲 abstract,同時每一個枚舉值必須顯式實現抽象方法。
Java 集合分爲 List、Set、Map、Queue 四種體系,接口 Collection 和 Map 是 Java 集合框架的根接口,List、 Set 和 Queue 接口派生於 Collection 接口。非類型安全,以 Object 類型存儲,須要強制類型轉換。
Collection
-- Iterator iterator():用於遍歷集合元素;
-- Object[] toArray():集合轉化爲數組;
-- void removeIf(Predicate filter):批量刪除知足條件的元素,入參爲 Lambda 表達式;
-- Stream stream(Predicate filter):返回集合對象對應的 Stream 對象;(Stream 編程,利用 Stream 對象的彙集操做簡化對集合的操做),幾個流式 API:
[I]. filter(Predicate predicate):入參爲 Lambda 表達式,過濾 Stream 對象中不符合條件的元素;
[II]. toArray():將流 Stream 對象轉換爲數組;
[III]. forEach(Consumer action):入參爲 Lambda 表達式,遍歷流 Stream 對象中的元素;
List:有序、可重複
線性表接口,提供索引訪問、插入、刪除、替換。額外方法,入參都可爲 Lambda 表達式:
void sort(Comparator c); void replaceAll(UnaryOperator operator); ListIterator listIterator();
其中,ListIterator 接口繼承於 Iterator 接口,增長了前向迭代功能,專用於操做 List。
[1]. ArrayList(使用頻率很是高) - Vector(線性安全的ArrayList)
List 接口的實現類,基於數組,默認長度10,每次擴容增加60%(1.5倍,(oldCapacity * 3)/2 + 1),封裝了一個容許動態再分配的 Object[] 數組。ArrayList 非線程安全(單線程效率高),Vector 線程安全(多線程安全,效率低),性能低於 ArrayList。繼承於 Vector 類的 Stack 子類也是線程安全的。推薦 Object get(int index) 隨機訪問元素。
[2]. LinkedList
類 LinkedList 既實現 List 接口,也實現 Deque 接口,基於鏈表。推薦 Iterator 迭代器隨機訪問元素。
Collection接口繼承接口Iterable,Collection體系都具有獲取自身迭代器的方法,只不過每一個子類集合都進行了重寫(由於數據結構不一樣)
ListIterator:List的特有迭代器,在迭代過程當中支持添加或修改元素。而其餘普通的迭代器,僅僅支持獲取和刪除操做。
小結:性能 ArrayList > LinkedList。
Queue:隊列集合
提供 offer() 和 poll() 入隊和出隊。
[1]. Deque -> ArrayDeque
接口 Deque 繼承於 Queue 接口,表明"雙端隊列",能夠做爲"棧"使用。
Iterator descendingIterator();逆向迭代雙端隊列
類 ArrayDeque 既實現 Deque接口,也實現 List 接口,能夠做爲"棧"使用,基於數組。
[2]. PriorityQueue
優先級隊列,不容許 null 值。排序功能、元素非FIFO,排序方法參見 TreeSet。
Set:無序、不可重複
[1]. HashSet -> LinkedHashSet
HashSet 是 Set 接口的實現類,非線程安全。底層哈希表實現,按 Hash 算法 存儲元素(根據元素的 hashCode 值計算存儲位置並判重),元素值能夠爲null,存取和查找速度快。2 個 HashSet 元素相等的充要條件:
obj1.hashCode()==obj2.hashCode() && obj1.equals()==obj2.equals();
元素的哈希值經過元素的hashcode方法獲取,首先判斷兩個元素的哈希值,若是哈希值同樣,接着會比較equals方法,若是equls爲true,視爲同一個元素,若是equals爲false就不是同一個元素(存儲位置:同一個hashCode位置上能夠存放多個元素。)。
注:爲保證 HashSet 功能的實現,hashCode() 和 equals() 方法是否重寫須要保持同步。
~> LinkedHashSet
HashSet 的子類。利用鏈表維護元素的插入順序,性能略低於 HashSet。
[2]. SortSet -> TreeSet
TreeSet 是 SortedSet 接口的實現類。按 紅黑樹 的數據結構有序存儲同類型元素:
當元素自身不具有比較性,或者元素自身具有的比較性不是所需的,此時須要讓容器自身具有比較性。
定義一個類實現Comparator接口,實現compare方法,並將該接口的子類對象做爲參數傳遞給TreeSet集合的構造函數。
class MyComparator implements Comparator { public int compare(Object o1, Object o2) { } }
當Comparable比較方式及Comparator比較方式同時存在,以Comparator比較方式爲主。
2 個 TreeSet 元素相等的充要條件:
0 == this.compareTo(obj) // 天然排序 0 == (Comparator對象 | Lambda表達式).compare(t1,t2) // 定製排序
注:爲保證 TreeSet 功能的實現,天然排序中 compareTo() 和 equals() 方法須保持同步。
~> SortedSet
SortedSet 接口繼承自 Set 接口。
[3]. EnumSet
枚舉類型元素的有序集合類,以枚舉值在 Enum 類中的定義順序決定集合中元素的順序,元素不容許爲null。Enum 對象在內部以 位向量 的形式存儲,緊湊高效、佔用內存小、運行效率好。
EnumSet es = EnumSet.Allof/noneOf(Season.class);
小結:EnumSet 是全部 Set 實現類中性能最好的,性能 HashSet > TreeSet。HashSet、TreeSet、EnumSet 均線程不安全。
Map:映射集合
關係一對一, Map 的 key 值集合是 Set,value 集合是 List,Map 提供 Entry 內部類封裝 key-value對,經過 get(Object key)/remove(Object key) 獲取和刪除元素。
HashMap - Hashtable -> LinkedHashMap
HashMap 非線程安全、key和value 容許爲 null,Hashtable 線程同步安全,key和value 不容許爲 null,性能 HashMap > Hashtable。2 個 key 值相等的充要條件:
obj1.hashCode()==obj2.hashCode() && obj1.equals()==obj2.equals();
2 個 value 相等的充要條件:
obj1.equals()==obj2.equals();
注:爲保證 HashMap-Hashtable 功能實現,hashCode()和equals()方法是否重寫需保持同步。
~> LinkedHashMap:
HashMap 的子類。利用雙向鏈表維護元素的插入順序,性能略低於 HashSMap。
~> Properties:
Hashtable 的子類,key和value 均爲 String 類型的 Map,store()和load() 存儲和加載 屬性文件。
SortedMap -> TreeMap
類 TreeMap 是 SortedMap 接口的實現類。按 紅黑樹 有序存儲同類型元素:參考 TreeSet。
EnumMap
內部以數組形式保存,緊湊高效,key 值不能爲 null,必須與枚舉類關聯。
小結:性能 HashMap > TreeMap,EnumMap 性能最好。
Iterator:迭代器,必須依附於 Collection 對象。
- boolean hasNext():
- Object next():
- void remove():用於刪除集合裏 next() 方法上一次返回的元素;
- void forEachRemaining(Consumer action):利用 Lambda 表達式遍歷集合元素;
注:Iterator 迭代器採用 fast-fail 快速失敗機制,迭代 Collection 集合時,集合元素不能被修改,不然當即拋出 ConcurrentModificationException 異常。
Collections:集合工具類,靜態方法
[1]. 排序、查找、替換等
- void sort/reverse/swap/shuffle/retate(List list): 排序/反轉/交換/隨機排序/旋轉
- int binarySearch(List list, Object key):二分查找
- void fill(List list, Object obj):元素填充
- boolean replaceAll(List list, Object oldObj, Object newObj):元素替換
[2]. 同步控制
提供 synchronizedXxx() 方法將指定集合包裝程線程同步的集合,解決多線程併發訪問集合時的線程安全問題。
Arrays:集合工具類,靜態方法
參考
[1]. 泛型知識點總結;
[2]. Java總結篇系列:Java泛型;
Java 的異常機制主要依賴於 try,catch,finally,throw,throws 五個關鍵字。其中,finally 用於回收在 try 塊中打開的物理資源,throw 用於自行拋出異常的實例,throws 用於方法簽名中聲明該方法可能拋出異常、並由上一級調用者處理該異常。Java 的非正常狀況有 2 類:Error 和 Exception,均繼承於 Throwale 類。
Runtime 異常(運行時異常),RuntimeException 類及其子類的實例,靈活易用。
Java的異常體系
全部的異常類均在 java.lang 包中。
其中,Throwable 描述錯誤和異常,Error(錯誤)表示不可治癒,Exception(異常)表示可治癒,異常包括運行時異常和非運行(編譯)時異常。
異常處理方式
優勢
使用注意
自定義異常 :自定義異常類須要提供 2 個構造器。
1 public class MyException extends Exception | RuntimeException 2 { 3 public MyException(){} 4 public MyException(String msg){ 5 this.super(msg); 6 } 7 public MyException(Throwable t){ // 支持異常的鏈式處理 8 this.super(t); 9 } 10 }
異常鏈 :鏈式處理
捕獲 1 個異常後接着拋出另外一個異常,同時把原始異常的信息保存下來的機制。
GUI(Graphic User Interface)編程,圖形界面組件庫(AWT + Swing)+ 事件處理機制。
· AWT,抽象窗口工具集,Abstract Window Toolkit。 基本的窗口框架,重量級組件、依賴底層平臺;
· Swing,輕量級組件,100% Java 實現,跨平臺性能好。採用 MVC 設計模式,實現 GUI 組件的顯示邏輯和數據邏輯的分離,靈活性好;
關於 MySQL 的基礎,請參考 MySQL 初識 - sqh;
關於 JDBC 的基礎,請參考 JDBC 初識 - sqh;
Annotation,接口,封裝元數據,修飾程序元素、提供爲其設置元數據的方法,容許在源文件中嵌入補充信息,相似 C# 中的特性。程序經過反射能獲取指定元素的 Annotation 對象、進而提取註解中的元數據。Java 8 支持重複註解,須要 @Repeatable 修飾。訪問和處理 Annotation 的工具爲 APT,Annotation Processing Tool,對源代碼文件進行檢測,執行嚴格的代碼檢查。
- java.lang 包下的基本 Annotation:
· @Override:限定子類必須重寫父類的方法,只能修飾方法;
· @Deprecated:標記已過期;
· @Suppress Warnings:抑制編譯器警告;
· @Safe Varargs:專用於抑制堆污染 Heap pollution 警告;
· @FunctionalInterface:函數式接口聲明,要求接口只能包含一個抽象方法,只能修飾接口;
- java.lang.annotation 包下的 元Annotation:
· @Retention:指定 Annotation 的生命週期;
RetentionPolicy.RUNTIME:
編譯器將 Annotation 記錄在 .class 文件中,運行時能夠經過 JVM 或反射獲取 Annotation 信息;
· @Target:指定 Annotation 修飾的目標程序元素,全部程序元素的父接口爲 AnnotatedElement;
· @Documented:指示被修飾的 Annotation 接口將被 javadoc 工具提取成文檔;
· @Inherited:Annotation 具備父子繼承性;
自定義 Annotation:默認繼承 Annotation 接口
public @interface AnnotationName{...}
其中,Annotation 定義中,成員變量必須以無形參方法的形式定義,能夠用 default 指定初始值。
AnnotatedElement 接口:用於提取 Annotation 信息,實例方法
- getAnnotation(xxx):獲取程序元素上的指定註解;
- getAnnotations(): 獲取程序元素上的全部註解;
- isAnnotationPresent(xxx)():判斷程序元素上是否存在指定註解;
具體參考 Java 輸入輸出體系學習 - sqh;
具體參考 Java 多線程學習 - sqh;
具體參考 Java 網絡編程學習 - sqh;
關於默認構造方法
泛型通配符 ?
限定泛型通配符的邊界
? extends T:接收T類型或者T的子類型 ? super T:接收T類型或者T的父類型
JDK5中的泛型容許在編寫集合代碼時,限制集合的處理類型,從而把原來程序運行時可能發生問題轉變爲編譯時問題,提升程序可讀性和穩定性。
關於數據類型間的強制類型轉換
一個數字,若沒有類型標識,默認是 int 類型
// 會進行強制類型轉換,若是超出類型能表示的範圍,會報錯,反之不會 byte b1 = 10; // ok byte b1 = 1000; // 編譯失敗 byte b1 = 10; byte b2 = 20; byte b3 = 10 + 20; // ok byte b3 = b1 + b2; // 編譯失敗 b2 = b1 + b2; // 編譯失敗 b2 += b1; // ok, Java 編譯器已經默認對 += 進行強制類型轉換
== 與 equals()
直接量 「hello」 與 new String(「hello」)
構造器new 與 valueOf()
後自增/減在JVM中的運行原理
int i = 0; [1]. i++; // i = 1 [2]. i = i++; // i = 0
JVM會先聲明一個臨時變量保存自增/減以前的值,最後返回該值做爲表達式的值
第一步:int temp = i; // temp = 0; 第二步:i++; // i = i + 1; 第三步:return temp, 做爲表達式的值
注意,i 在該過程當中的變化:i = 0 ------> 1 ------> 0
Static
靜態修飾符,其成員在方法區(數據共享區),優先於對象存在,做爲對象的共享數據。
關於實例變量和靜態變量
關於快捷鍵
Alt + /:內容提示 Ctrl + 1:快速修復,編譯異常提示 Ctrl + shift + O:導包 Ctrl + /:單行註釋 Alt+上下鍵:代碼位置切換 Ctrl + Shift + F:格式化代碼塊 Ctrl+Shift+/或\:多行註釋 Ctrl+Shift+X/Y:大小寫轉換 查看源代碼:(1)Ctrl+單擊 須要查看源碼的類;(2)Ctrl+Shift+T