做了多年的.net 之后, 最近開始轉(zhuǎn)向java 編程.
這個系列記錄了其間遇到的一些與.net 不同或者沒有接觸過的概念. 所以,其中一些可能比較淺顯.
開篇介紹一些基礎知識和概念, 會持續(xù)更新中....
語法點
- Arrays.asList() 返回的是一個固定大小的list.
- 如果想要修改其返回結(jié)果, 需要將其包裝為
LinkedList
:List<String> list = new LinkedList<String>(Arrays.asList(split));
- 如果想要修改其返回結(jié)果, 需要將其包裝為
- java 中代表后續(xù)字符串為原始值(不需要轉(zhuǎn)移)的符號為:
\\\\
- 這個類似于c# 中的
@
. - 例如:
String.split(“\\\\|”)
.
- 這個類似于c# 中的
- 將byte[] 轉(zhuǎn)換為string.
new String(bytes);
- 同時可以指定encoding.
- lamda 表達式中訪問的外部局部變量必須是final 或者隱式final 的.
- 但是lamda 能夠獲得對成員變量或靜態(tài)變量的讀寫權.
- Static
- java 沒有static 類.
- 可以使用
final class + private constructor + static members(method+fields)
來模擬. - Math 類應該是static 的, 雖然并沒有該關鍵字.
- static 類可以不含有static 方法,它不能被實例化. 而static 方法必須在static 類中.
- 可以使用
- 有static nested 類.
- 它與普通nested 類的區(qū)別是,可以獨立于外部類的實例,被直接構(gòu)造.
- java有const 關鍵字,但是沒有任何功能.
- const 在C++ 中用來創(chuàng)建const-pointer.
- 在java 中使用
final
實現(xiàn). - 在C# 中有
readonly
關鍵字.
- java 沒有static 類.
- ClassLoader
- JVM 判定兩個class 是否相等時,不僅要判斷兩個類名是否相同,而且要判斷是否由同一類加載器加載的.
- 雙親委托模型
- 每個ClassLoader 實例都有一個父類加載器的引用(包含而非繼承關系).
- 安全因素: 防止隨時使用自定義的類來替換java 核心api 中定義的類型.
- 避免重復加載同一類.
java API
- 管道(PipedInput/OutputStream.).
- 一個in 和一個out 相關聯(lián). 或者使用connect() 來關聯(lián)兩個管道.
- 必須在不同的線程上, 分配兩個相關聯(lián)的管道, 否則在一個線程中同時進行讀和寫,可能會導致死鎖.
- 為運行在同一JVM 中(同一進程下的)的兩個線程提供了通信能力(傳遞字節(jié)數(shù)據(jù)).
- 線程多數(shù)情況下需要傳遞的是完整的對象信息而非原始的字節(jié)數(shù)據(jù).
- 管道也可以作為數(shù)據(jù)源及目標媒介.
- Unix 中, 運行在不同的地址空間的兩個進程可以通過管道通信.
- 網(wǎng)絡
- 使用網(wǎng)絡API 在不同的進程間建立網(wǎng)絡連接, 之后使用IO 在建立了連接之后的進程間交換數(shù)據(jù).
- 能夠?qū)ξ募M行寫入數(shù)據(jù)(FileOutputStream)的代碼, 同樣也能寫入到網(wǎng)絡連接(OutputStream)中去.
- Stream(二進制: 字節(jié): 0到255), Reader/Writter(文本: 字符: 0到65535).
- Reader會根據(jù)文本的編碼,一次讀取若干個字節(jié)(并發(fā)固定的2個).
java 8 新特性
- ?拼接字符串數(shù)組到一個結(jié)果字符串中.
- StringJoiner.
StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();
- elements.stream().collect(Collectors.joining()).
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", "));
- 繼承了兩個擁有相同簽名的default方法的接口的類, 必須override 該方法, 可以使用InterfaceA.super.method()來調(diào)用某個接口的方法.
- default 方法的產(chǎn)生, 是為了向后兼容( 對接口新增方法時,不必對所有實現(xiàn)類進行連帶修改).
- JDK 8 的Collections 接口就擴展了foreach(). 實現(xiàn)類可以override.
- static default 會強制所有的實現(xiàn)類override該方法.
- Lambda 表達式與匿名類的區(qū)別
- 匿名類的this 代表該匿名類, 而lambda 表達式中的this 代表外部類.
- 編譯lambda 表達式時,將其轉(zhuǎn)化為類里面的私有含有, 并使用invokedynamic 來動態(tài)綁定該方法.