最近要做兩個基于JavaWeb的網絡系統,想起我那渣得可憐的Java功底。。。淚崩!于是花了三天時間大體上上復習了一下java的重要知識,mark一記。
目錄
一.基礎知識
二.string
三.類
四.管理
五.泛型
六.線程
七.反射
一.基礎知識1.JavaSE可以分為四個主要的部分:JVM、JRE、JDK和Java語言。

2.

3.

1.java中字符串不僅僅是字符數組,還是string類的一個實例。
2.靜態分解方法parseByte(),parseShort().parseInt().parseLong(),parseFloat(),parseDouble()
=>NumberFormatException異常
3.使用索引取得字符串

4.字符串內容不可變(不是原來的字符對象了)
5.Java執行時會維護一個string池(pool)。如stringstr=”aa”;str0=”aa”;那么str==str0(引用自同一個對象)
Intern():先equals()pool中的內容,有相同則返回池中對象的引用
Eg:Stringstr1=newString(“aa”);Stringstr2=newString(“aa”);str1.equals(str2);
一共產生了三個string實例。”aa”本身一個,存在于pool中,又new兩個String對象,分別由str1和str2參考
6.StringBuilder類,默認16字符長度,會自動增加長度以榮內被附加的字符

單機非多線程:StringBuilder
StringBuffer處理同步,多線程
7.分離字符串split()
8.正則表達式



運行原理:
Matches()pattern的靜態方法,返回boolean(),表明字符串是否符合正則表達式。
將正則表達式作為一個對象重復應用,使用pattern的靜態方法compile()進行編譯,返回pattern的一個實例,然后可以重復使用實例的matcher()方法
Patternpattern=Pattern.compile();
Matchermatcher=pattern.matcher();
顯示matcher.group()
三.類(1)沒有裝箱動作前可以符合參數個數和類型的方法
(2)裝箱動作后可以符合參數個數和類型的方法
(3)不定長度參數并可以符合的方法eg:intsum(int...nums){for(intsum:nums){}},實際為傳入參數為int[]nums
(4)找不到對應的方法,報告錯誤
9.垃圾收集

10.extendspublic成員可以直接在子類中被調用使用
11.在擴展了某個類以后,可以用supeer()基底類的構造函數。在子類的的構造函數中,如果不用super(),默認調用父類的無參構造函數。

12.PRotected派生類(子類)可以直接存取基類中的成員,而不會被外部對象獲取。
13.object的toString()默認返回類名稱和十六進制編碼:getClass().getName()+’@’+Interger.toHexString(hashCode())。可以被重寫。
Equals()本身是比較對象的內存地址是否相同。重寫equals()時需要同時重寫hashCode()。因為在以hash碼為基礎的相關環境中,需要比較兩個對象是否為相同的對象時,除了使用equals(),還會使用hashCode()方法。
14.clone()方法,復制對象本身。要支持復制自身的對象,定義類的時候必須實現Cloneable接口,不然其實例的clone()方法被調用時,會拋出CloneNotSupportedException。
15.多態:使用共同的實現接口(通常指的是在類上定義的公開方法),以實現不同的對象實例。為了降低對實現接口的依賴程度。Java在實現多態時,可以讓程序依賴于抽象類或接口。Abstractextends

接口的目的在于定義一組可實現的方法,實現某接口的類必須實現該接口的所有方法,只要對象有實現某個接口,就可以通過該接口實現對象上對應的方法。Interfaceimplement

每多實現一個接口,就多遵守一個實現協議。類一次只能繼承一個父類,但一個接口可以同時繼承多個父接口。(以I開頭定義)
四.管理1.相關:靜態工廠,Iterator

2.一個.java文件中只能有一個public類,沒有被聲明為public的類只能被同一個包中類的實例調用。如果申明類的時候不使用public等,則預設為包存取范圍。
3.異常:在Java中代表一個錯誤的實體對象。最好只用于錯誤處理,而不用于業務邏輯的一部分,因為異常產生消耗資源。
Try(唯一)必有catch(不一定唯一)和finally(唯一)至少取其一。



父類的某個方法聲明拋出異常,重寫該方法時:可以不處理,僅拋出父類中被拋出的某些異常,拋出父類被拋出異常的子類。不能拋出父類方法中未定義的其它異常,不能拋出父類拋出異常的父類。
4.斷言Assertion預期程序處于某種狀態。默認啟動時不檢查,除非使用-enableassertions或者-ea自變量。
Assertboolean_expression;false拋出java.lang.AssertionError
Assertboolean_expression:detail_expression;false顯示detail_expression
5.枚舉類型是一種特殊的類成員為實例,被默認修飾為finalpublicstatic.可以構造非公開的構造函數(Singleton模式的應用)
五.泛型1.J2SE5.0之前使用Object定義類并轉換為原來的類型或者適當的接口。
有了泛型之后,使用<T>聲明一個類型持有者名稱。使用泛型所定義的類在聲明及配置對象時,可以使用尖括號一并指定泛型類持有者T的真正的類型,而不需要類型或接口轉換。
2.可以使用泛型來聲明一個數組,但是不能使用泛型來建立數組的實例。
3.限制泛型可用類型同時使用extends指定這個類型持有者實例化,實例化的對象必須是擴充自某個類型或實現某接口。
4.類型通配符(Wildcard)?代表未知類型,并用extends關鍵詞來限定(無法加入新類型,只能取或者移除)
<?ExtendssomeClass>向下限制只能是包含在內的,或者子類
<?SupersomeClass>向上限制只能是包含在內的,或者超類
5.擴充泛型類和實現泛型接口建議:父類的類型持有者都要保留
六.線程1.進程是一個包含自身執行地址的程序。RR輪轉法。可以包括多個線程,即線程的執行流程,由于RR的時間片短,所以程序看起來像同時進行多個不同的子流程。
2.JAVA中實現線程,可以繼承java.lang.Thread類,并重新定義run(),自后范例化自定義的Thread類,再使用start()啟動線程。
或者實現java.lang.Runnable接口來定義含有線程功能的類。Runnable接口中定義有一個run()方法,在范例化一個Thread對象時,可以傳入一個Runnable接口的對象作為自變量,Thread對象會調用Runnable對象的run()方法,進而執行其中所定義的流程。
3.java中一次只能繼承一個類。
4.如果希望某個線程在產生它的線程結束后也跟著終止,則設定它為Daemon線程,在后臺執行服務。setDaemon()方法。
5.

范例化一個Thread并執行start()后,線程進入Runnable狀態(可執行準備狀態),等待調度。setPriority()方法設定線程的優先級(1~10,默認為5)。同優先級則RR。
6.對于不支持Timeslicing的系統,讓目前線程禮讓其它線程(暫停,進入Runnable狀態),用yield(js類比)。

7.join()中途插入一個高優先級(先執行)的線程。
8.ThreadGroup線程組。判斷:Thread.currentThread().getThreadGroup().getName()。
9.處理Uncheckedexception,J2SE5.0之前用uncaughtException(),之后使用Thread.UncaughtExceptionHandler接口,并實現其uncaughtException()方法。
10.同步synchronized。不同線程共享數據的時候,同時更新同一對象信息時。
11.每個對象內部都會有一個鎖定,被標識為synchronized的方法會成為同步區域,當線程執行某個對象的同步區域時,要執行同步區域的線程,都必須先獲得對象的鎖定,執行完同步區域之后再將鎖定歸還給對象。由于對象的鎖定只有一個,因此一個線程取走鎖定在執行同步區域的代碼時,其它想執行synchronized區域的線程在鎖定池等待,直到歸還為止。獲得鎖定的線程才能進如Runnable狀態等待調度。

12.wait(),必須在同步的方法或者區塊中,要求線程進入對象的等待池。
Notify()從等待池中通知一個線程加入到鎖定池的Blocked狀態,被通知的線程是隨機的,且會與其它線程共同競爭對象的鎖定。(生產者模式)
13.容器內默認沒有考慮線程安全問題,必須自行實現同步。可以使用java.util.Collection的synchronizedXXX()等方法傳回一個同步化的容器對象。以這種方式返回的對象,在使用Iterator遍訪對象時,仍必須實現同步化。J2SE5.0后再java.util.concurrent里面有一些確保線程安全的類。
14.JDK1.2之后可以給予每個線程一個特定的空間來保管該線程所獨享的資源,使用java.lang.ThreadLocal。
15.util.concurrent.Callable與util.concurrent.Future協助完成future模式,在請求發生時,先產生一個Future對象給發出請求的客戶,類似代理,同時所代理的真正目標對象的生成是由一個新的線程持續進行。
16.

17.

1.可以通過Object的getClass()方法來取得每一個對象對應的Class對象,或者通過class常量,在取得class對象之后,就可以操作class對象上的一些公開方法來取得類的基本信息。
2.Java僅在需要使用類的時候才會加載,如在用new生成對象時,聲明參考名稱并不導致類被加載。一個類在JVM中只會有一個Class實例,且以實例的形式存在。基本類型也都有對應的Class對象。
3.在無法事先知道用戶將加載什么類,而必須讓用戶指定類名加載類的時候,可以用Class的靜態forName()方法實現動態加載類。指定類名稱,甚至指定加載類時是否運行靜態區塊,指定類加載器。
4.

5.命令模式執行javaXXX.class指令
=>java運行程序查找JRE安裝目錄
=>找jvm.dll(默認為bin/client)
=>啟動jvm并進行初始化動作
=>產生BootstrapLoader(一般由C編寫而成)
=>BootstrapLoader(一般為java編寫而成)加載ExtendedLoader,并設置其parent為BootstrapLoader
=>BootstrapLoader會加載SystemLoader,并設置SystemLoader的parent為ExtendedLoader
=>SystemLoader開始加載指定的類
每一個加載器會先將加載類的任務交給其parent,如果parent找不到,再由自己負責加載。即Bootstrap=>ExtendedLoader=>SystemLoader=>NoClassDefFoundError

Java類加載器層次架構

(1)BootstrapLoader會搜索系統參數sun.boot.class.path中指定位置的類(默認為JRE下classes中的.class文件或lib下的.jar文件),可以使用System.getProperty(“sun.boot.class.path”)查看。
(2)ExtendedLoader會搜索系統參數java.ext.dirs中指定位置的文件(默認為JRE目錄下的lib/ext/classes下的.class文件或lib/ext下的.jar文件),可以使用System.getProperty(“java.ext.dirs”)查看。
(3)SystemLoader會搜索系統參數java.class.path中指定位置的文件(默認為當前工作目錄下的.class文件),可以使用System.getProperty(“java.class.path”)查看。
(4)三個加載器各司其職,文件放錯位置會拋出異常或null。
6.使用loadClass()方法加載類的時候,不會運行靜態區塊。
7.ExtClassLoader和AppClassLoader都是java.net.URLClassLoader的子類。在程序啟動后兩者都會在虛擬機中存在一份,程序運行時無法再改變它們的路徑,需要動態加載其它路徑的類則需要產生新的加載器。
指定ExtClassLoader的搜索路徑java-Djava.ext.dirs=c:/路徑
指定AppClassLoader的搜索路徑(設置ClassPath)java-classpathc:/路徑
使用URLClassLoader來產生新的加載器。
URLurl=newURL(“file:/c:/路徑”);
ClassLoaderurlClassLoader=newURLClassLoader(newURL[]{url});
Classc=urlClassLoader.loadClass(“SomeClass”);
8.BootStrapLoader載入ClassLoader
=>新增了ClassLoader實例(自動將其parent設置為AppClassLoader)后,使用loadClass()來指定要加載的類
9.使用反射機制,可以在運行時期動態加載類并生成對象,操作對象上的方法,改變類成員的值,甚至于改變私有變量的值。
10.newInstance()=>實例化對象,返回Object類型
指定參數類型,去的Constructor對象,使用Constructor的newInstance()并指定參數的接受值=>動態加載及生成對象時指定對象的初始值
11.J2SE1.3之后加入java.lang.reflect.Proxy類,可協助實現動態代理功能。
實現動態代理功能=>
定義要代理的接口=>
使用Proxy.newProxyInstance()建立代理對象=>
調用InvocationHandler的invoke()方法傳入被代理對象的方法名稱和運行變量,將實際運行的對象交給method.invoke()
=>method.invoke()返回的對象是實際方法運行后的回傳結果
12.Ant構建工具,Junit測試工具
新聞熱點
疑難解答