政府網(wǎng)站建設運行情況寧波seo免費優(yōu)化軟件
文章目錄
- 異常
- 寫法
- JVM加載
- 反射
- 訪問private
- 調用方法
- 動態(tài)代理
- 注解
- 元數(shù)據(jù):
- @Target
- @Retention
- 元注解
- 泛型
- 編寫泛型
- 擦拭法
- 局限
- 通配符
- 無限定通配符(<?>)
- 集合
- 重寫方法和實現(xiàn)類
- IO流
- 字節(jié)與字符轉換
- 同步和異步
- 可以設置編碼的類
- Print*類
- Files
- 時間與日期
- 時區(qū)
- 一種
- 二種
- 三種
異常
寫法
編譯器并不會特別地為InputStream加上自動關閉。編譯器只看try(resource = …)中的對象是否實現(xiàn)了java.lang.AutoCloseable接口,如果實現(xiàn)了,就自動加上finally語句并調用close()方法
try(resource..){
}catch(){
}
JVM加載
JVM在執(zhí)行Java程序的時候,并不是一次性把所有用到的class全部加載到內存,而是第一次需要用到class時才加載
反射
訪問private
setAccessible(true)可以獲取private
setAccessible(true)可能會失敗。如果JVM運行期存在SecurityManager,那么它會根據(jù)規(guī)則進行檢查,有可能阻止setAccessible(true)
調用方法
注意null和有參數(shù)
靜態(tài):Integer n = (Integer) m.invoke(null, “123”);
非靜態(tài):String r = (String) m.invoke(s, 6);
為了調用非public方法,可以通過Method.setAccessible(true)允許其調用,也可能會失敗
遵循多態(tài)原則:調用實際類型的覆寫方法
動態(tài)代理
動態(tài)代理(Dynamic Proxy):可以在運行期動態(tài)創(chuàng)建某個interface的實例,而不用實現(xiàn)某個實例。
動態(tài)代理實際上是JVM在運行期動態(tài)創(chuàng)建class字節(jié)碼并加載的過程
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ReflexTest {public static void main(String[] args){InvocationHandler ih = new InvocationHandler() {@Overridepublic Object invoke(Object proxy,Method method,Object args[])throws Throwable{System.out.println(method.getName());System.out.println(proxy.getClass().getName());System.out.println(args[0]);return null;}};play p =(play)Proxy.newProxyInstance(play.class.getClassLoader(), new Class[]{play.class}, ih);p.catPlay();}}
interface play{void catPlay();
}
注解
注解是放在Java源碼的類、方法、字段、參數(shù)前的一種特殊“注釋”
注解則可以被編譯器打包進入class文件,因此,注解是一種用作標注的“元數(shù)據(jù)”
元數(shù)據(jù):
元數(shù)據(jù)(Metadata),又稱中介數(shù)據(jù)、中繼數(shù)據(jù),為描述數(shù)據(jù)的數(shù)據(jù)(data about data),主要是描述數(shù)據(jù)屬性(property)的信息,用來支持如指示存儲位置、歷史數(shù)據(jù)、資源查找、文件記錄等功能
@Target
類或接口:ElementType.TYPE;
字段:ElementType.FIELD;
方法:ElementType.METHOD;
構造方法:ElementType.CONSTRUCTOR;
方法參數(shù):ElementType.PARAMETER。
@Retention
僅編譯期:RetentionPolicy.SOURCE;
僅class文件:RetentionPolicy.CLASS;
運行期:RetentionPolicy.RUNTIME。
元注解
有一些注解可以修飾其他注解,這些注解就稱為元注解(meta annotation)
泛型
編寫泛型
注意: 編寫靜態(tài)方法和普通方法時要使用不同的類型,普通有T,靜態(tài)就用k,區(qū)分類型。
擦拭法
定義: 虛擬機對泛型其實一無所知,所有的工作都是編譯器做的
Java的泛型是由編譯器在編譯時實行的,編譯器內部永遠把所有類型T視為Object處理,但是,在需要轉型的時候,編譯器會根據(jù)T的類型自動為我們實行安全地強制轉型。
局限
獲取類的Class在轉型之前,所以獲取泛型的Class都是一樣的Object
MyPara<Integer> m1 = new MyPara<Integer>(23);MyPara<String> m2 = new MyPara<String>("ss");Class s1 = m1.getClass();Class s2 = m2.getClass();//MyPara<Integer>與MyPara<String> 是兩個不同的類//等于是因為他們都變成了<MyPara<Object>System.out.println(s1==s2);
不能判斷類型
通配符
<? extends T>允許調用讀方法T get()獲取T的引用,但不允許調用寫方法set(T)傳入T的引用(傳入null除外);
<? super T>允許調用寫方法set(T)傳入T的引用,但不允許調用讀方法T get()獲取T的引用(獲取Object除外
extends 表示T的子類,而super表示T的父類
我的理解:
extends只讀(null除外):因為轉入一個類型時,會因為擦拭法,變成Object然后,Object是所有的父類,不是任何的子類。
super只寫(Object除外):因為擦拭法會變成Object,是所有類的父類,所以可以寫,返回時只能用Object接受。
可以用PECS(生產(chǎn)者和消費者)原則去理解何時用extends,何時用super
無限定通配符(<?>)
它不能讀也不能寫,一般只用來判斷是否為Null
類名<?>時所有類名的超類,都可以向上轉型為類名<?>
集合
只要實現(xiàn)了Iterable接口的集合類都可以直接用for each循環(huán)來遍歷。
重寫方法和實現(xiàn)類
equals: List中 index(),contains()這些類型的方法要重寫
equals和hashcode: Map要重寫
實現(xiàn)Comparable:只要需要排序的,加入的類都要實現(xiàn)
Collections創(chuàng)建的集合是不可變集合,無法向其中添加或刪除元素。
unmodifiableList(List) 返回的List不可變
希望把一個可變List封裝成不可變List,那么,返回不可變List后,最好立刻扔掉可變List的引用(把null賦值給它既可),這樣可以保證后續(xù)操作不會意外改變原始對象,從而造成“不可變”List變化了
IO流
讀:從外部讀進內存操作
寫:從內存寫入外部
File 可以表示一個目錄和文件,
Out/InputStream 讀取文件字節(jié)
Writer/Reader 讀取字符串
幾乎所有new的子類都是input和output超類
File傳入inputStream再傳入Buffer再傳入GZIinput 這種叫做Filter模式(或者裝飾器模式:Decorator)
字節(jié)與字符轉換
Reader是帶編碼轉換器的InputStream,它把byte轉換為char,而Writer就是帶編碼轉換器的OutputStream,它把char轉換為byte并輸出。
InputStream input = new FileInputStream("src/readme.txt");
// 變換為Reader:
Reader reader = new InputStreamReader(input, "UTF-8");
Reader需要從InputStream中讀入字節(jié)流(byte),然后,根據(jù)編碼設置,再轉換為char就可以實現(xiàn)字符流。如果我們查看FileReader的源碼,它在內部實際上持有一個FileInputStream。
同步和異步
同步IO是指,讀寫IO時代碼必須等待數(shù)據(jù)返回后才繼續(xù)執(zhí)行后續(xù)代碼,它的優(yōu)點是代碼編寫簡單,缺點是CPU執(zhí)行效率低。
而異步IO是指,讀寫IO時僅發(fā)出請求,然后立刻執(zhí)行后續(xù)代碼,它的優(yōu)點是CPU執(zhí)行效率高,缺點是代碼編寫復雜。
Java標準庫的包java.io提供了同步IO,而java.nio則是異步IO
可以設置編碼的類
FileReader(‘路徑’,StandardCharsets.UTF_8)
Print*類
System.out是標準輸出;
System.err是標準錯誤輸出。
我們經(jīng)常使用的System.out.println()實際上就是使用PrintStream打印各種數(shù)據(jù)。其中,System.out是系統(tǒng)默認提供的PrintStream,表示標準輸出:
Files
從Java 7開始,提供了Files和Paths這兩個工具類,能極大地方便我們讀寫文件。
缺點:
Files提供的讀寫方法,受內存限制,只能讀寫小文件,例如配置文件等,不可一次讀入幾個G的大文件。讀寫大型文件仍然要使用文件流,每次只讀寫一部分文件內容。
時間與日期
時區(qū)
一種
是以GMT或者UTC加時區(qū)偏移表示,例如:GMT+08:00或者UTC+08:00表示東八區(qū)
二種
另一種是縮寫,例如,CST表示China Standard Time,也就是中國標準時間。但是CST也可以表示美國中部時間Central Standard Time USA,因此,縮寫容易產(chǎn)生混淆,我們盡量不要使用縮寫。
三種
最后一種是以洲/城市表示,例如,Asia/Shanghai,表示上海所在地的時區(qū)。特別注意城市名稱不是任意的城市,而是由國際標準組織規(guī)定的城市