《Java核心技术 卷1》
目錄
第4章 對象和類
<1>靜態(tài)字段和靜態(tài)方法
<2>初始化塊
<3>定義抽象類的對象變量
<4>hashCode方法得到散列碼
<5>虛擬機中的泛型類型信息
第五章 繼承
第6章.接口、Lambda表達式與內部類
第7章 異常、斷言和日志?
<1>捕獲多個異常
<2> try-with-resource機制
第9章 集合
第12章 并發(fā)
中斷線程
重入鎖
條件對象
同步塊
并行數(shù)組算法
任務和線程池
進程 Process
第4章 對象和類
<1>靜態(tài)字段和靜態(tài)方法
class Employee{private static int nextId= 1;private int id;....}每一個Employee對象都有一個自己的id字段,但是這個類的所有實例將共享一個nextId字段,換句話說,如果有1000個Employee類對象,則有1000個實例字段id,分別對應一個對象,但是只有一個靜態(tài)字段nextId,即使沒有Employee對象,靜態(tài)字段nextId也存在,它屬于類,而不屬于任何單個的對象。
<2>初始化塊
class Employee{private static int nextId;private int id;//對象初始化塊{id = nextId;nextId++;}}<3>定義抽象類的對象變量
但是這樣一個變量只能引用非抽象對象
//p是一個抽象類型Person的變量 Person p = new Student("wang wu","zhao si");<4>hashCode方法得到散列碼
散列碼是由對象導出的一個整型值,散列碼是沒有規(guī)律的,如果x和y是兩個不同的對象,x.hashCode()和y.hashCode基本上不會相同
由于hashCode方法定義在Object類中,因此每個對象都有一個默認的散列碼,其值由對象存儲地址得出
var s = "OK"; var sb = new StringBuilder(s); System.out.println(s.hashCode()+" "+sb.hashCode());var t = new String("OK"); var tb = new StringBuilder(t); System.out.println(t.hashCode()+" "+tb.hashCode());//輸出 對象 散列碼 s 2556 sb 20526976 t 2556 tb 20527114注意:1、重寫equals方法時一定要重寫hashCode方法
? ? ? ? ? 2、重寫toString()方法是也需要重寫hasCode方法
<5>虛擬機中的泛型類型信息
Java泛型的突出特征之一是在虛擬機中擦除泛型類型
第五章 繼承
1、Class類
在程序運行期間,Java運行時系統(tǒng)始終為所有對象維護一個運行時類型。
Object類中的getClass()方法將會返回一個Class類型的實例
? Employee e;Class cl = e.getClass(); //獲取類的名稱,輸出 (包路徑).Employee e.getClass().getName(); //對象的名稱,輸出 Employee類中字段為name的值 e.getName();?使用靜態(tài)方法forName獲得類名對應的Class對象
String className = "java.util.Random"; Class cl = Class.forName(className);虛擬機位每一個類型管理一個唯一的Class對象。因此,可以利用 == 運算符實現(xiàn)兩個對象的比較
if(e.getClass() == Employee.class)....
結果是相等的
getComponentType方法的使用
List<String> list = new ArrayList(); Class cl = list.getClass(); //獲取數(shù)組的泛型類型,String Class componentType = cl.getComponentType(); //創(chuàng)建新的數(shù)組 Object newArray = Array.newInstance(componentType,10);建議:
不要濫用反射
反射機制使人們可以在運行時查看字段和方法,從而能編寫出更具通用性代碼程序。這種功能對于編寫系統(tǒng)程序極其有用,但是同程不適于編寫應用程序。反射是很脆弱的,如果使用反射,編譯器將無法幫助你查找錯誤,因為只有運行時才會返現(xiàn)錯誤并導致異常。
第6章.接口、Lambda表達式與內部類
代理是一種非常專業(yè)的構造工具,可以用來構建系統(tǒng)系統(tǒng)的工具
Arrays類中的sort方法承諾可以對對象數(shù)組進行排序,但要求滿足下面這個條件,對象所屬的類必須實現(xiàn)Compare接口
假設希望使用Arrays類的sort方法對Employee對象數(shù)組進行排序,Employee類就必須實現(xiàn)Compare接口。
public compareTo(Object otherObject){Employee other =(Employee)otherObject;return Double.compare(salary,other.salary); }第7章 異常、斷言和日志?
<1>捕獲多個異常
try{//.... } catch(FileNotFoundException | UnknownHostException e){//.... } catch(IOException e){//.... } //只有當捕獲的異常類型彼此之間不存在子類關系時才需要這個特性<2> try-with-resource機制
首先被自動關閉的資源需要實現(xiàn)Closeable或者AutoCloseable接口,因為只有實現(xiàn)了這兩個接口才可以自動調用close()方法去自動關閉資源。寫法為try(){}catch(){},將要關閉的外部資源在try()中創(chuàng)建,catch()捕獲處理異常。其實try-with-resource機制是一種語法糖,其底層實現(xiàn)原理仍然是try{}catch(){}finally{}寫法
public static void main(String[] args){try(FileInputStream inputStream = new FileInputStream(new File("test"))){System.out.println(inputStream.read()); }catch(IOException e){throw new RuntimeExption(e.getMessage(),e)} }第9章 集合
<1> 集合接口和實現(xiàn)分離
隊里通常有兩種實現(xiàn)方式,一種使用循環(huán)數(shù)組,另一種是使用鏈表
循環(huán)數(shù)組是一個有界集合,即容量有限。如果程序中收集的對象數(shù)量沒有上限,就最好使用鏈表實現(xiàn)
如果需要一個循環(huán)數(shù)組隊列,可以使用ArrayDeque類,如果需要一個鏈表隊列,就直接使用LinkedList類,這個類實現(xiàn)了Queue接口
<2> 迭代器
用foreach循環(huán)可以更加簡練地表示同樣的循環(huán)操作
List<String> list = new ArrayList<>();list.add("A");list.add("B");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String value = iterator.next();}<3>集Set
Set接口等同于Collection接口,Set的add方法不允許添加重復的元素
<4>鏈表
數(shù)組和數(shù)組列表所有一個重大的缺陷,就是從數(shù)組中刪除一個元素開銷很大,其原因是數(shù)組中位于被刪除元素之后的所有元素都要向數(shù)組的前端移動。在數(shù)組中間插入一個元素也是如此。
<5>隊列與雙端隊列
隊列允許你搞笑地在尾部添加元素,并在頭部刪除元素。雙端隊列允許在頭部和尾部高效的添加和刪除元素。
boolean offerFirst(E elemnt);
boolean offerLast(E element);
將給定的對象添加到雙端隊列的對頭和隊尾,如果隊列滿了,不會報異常
E pollFirst();
E pollLast();
刪除并返回雙端隊列的元素,如果隊列為空,不會報異常
E peekFirst();
E peekLast();
返回雙端隊列對頭的元素,但不刪除
<6>優(yōu)先隊列
優(yōu)先隊列(priority queue) 中的元素可以按照任意的順序插入,但會按照有序的順序進行檢索。也就是說,無論何時調用remove方法,總會獲得當前隊列中最小的元素,不過,優(yōu)先隊列并沒有對所有元素進行排序。
<7>堆
堆是一個可以自己組織的二叉樹,其添加和刪除操作可以讓最小的元素移動到根,而不必花費時間對元素進行排序。
<8>Map
orgListMap.forEach((k,v)->{//....}); 替換成 for (Map.Entry<Integer, List<String>> mapItem : orgListMap.entrySet()) { ///....}<9>枚舉集合映射
EnumSet
<10>Collections.synchronizedMap
Collections.synchronizedMap()方法來獲取一個線程安全的集合(Collections.synchronizedMap()實現(xiàn)原理是Collections定義了一個SynchronizedMap的內部類,這個類實現(xiàn)了Map接口,在調用方法時使用synchronized來保證線程同步,當然了實際上操作的還是我們傳入的HashMap實例,簡單的說就是Collections.synchronizedMap()方法幫我們在操作HashMap時自動添加了synchronized來實現(xiàn)線程同步,類似的其它Collections.synchronizedXX方法也是類似原理)
可以多線程訪問這個map對象。類似get和put等方法都是同步的,另一個線程才能調用一個方法。
<11>簡單算法
Collections.replace(words,"C++","java");
將word列表中為“C++”的值替換成“Java”
<12>批操作
coll1.retainAll(coll2);//從coll1中刪除所有未在coll2中出現(xiàn)的元素,求交集
<13>將列表轉換為數(shù)組
String[] values = staff.toArray(new String[0]);
<14>棧
java.util.Stack
E push (E item);//將item壓入棧并返回item
E pop(); //彈出并返回棧頂?shù)膇tem,如果棧為空,不要調用這個方法
E peek();//返回棧頂元素,但不彈出,如果棧為空,不要調用這個方法
<15>屬性映射
property map是一個特殊類型的映射結構,
- 鍵和值都是字符串
- 這個映射可以容易地保存到文件以及文件加載
- 有一個二級表存放默認值
第12章 并發(fā)
void join(long mills);
等待指定的線程終止或者等待經過的毫秒數(shù)
中斷線程
當線程的run方法執(zhí)行方法中的最后一條語句再執(zhí)行return語句返回時,或者出現(xiàn)了方法中沒有捕獲的異常時,線程將終止。
重入鎖
ReentrantLock()//構建一個重入鎖,可以用來保護臨界區(qū)
ReentrabtLock( boolean fair);//構造一個采用公平策略的鎖。一個公平鎖傾向于等待時間最長的線程。不過,這種公平鎖保證可能嚴重影響性能,所以,默認情況下,不要求是公平的。
條件對象
Condition condition;//創(chuàng)建條件對象
condition.await();//當前線程暫停,并放棄鎖,這就允許了另一個線程執(zhí)行。
condition.signalAll();//這個調用會重新激活等待這個條件的所有線程,當這些線程從等待集中移出時,他們再次成為可運行的線程,調度器最終再次將他們激活。
注意:
signalAll調用不會立即激活一個等待的線程。它只會解除等待線程的阻塞,使這些線程可以在當前線程釋放之后再競爭訪問對象。signal方法只是隨機地選擇等待集合的一個線程,并解除這個線程的阻塞。
同步塊
每個Java對象都有一個鎖,線程可以通過同步方法獲得鎖,還有另一種機制可以獲得鎖,即進入一個同步塊。
synchronized(obj){//.... }并行數(shù)組算法
Arrays.paralleSort(words,Comparator.comparing(String::length));任務和線程池
當run方法退出時,這個線程不會死亡,而是留在線程池中準備下一個請求提供服務
Executor中的BlockingQueue的作用:
如果提交的任務數(shù)多余空閑線程數(shù),就把未得到的服務的任務放到隊列中,當其他任務完成后再提交運行這些排隊的任務。
進程 Process
Process process = new ProcessBuilder("/bin/ls","-l").directory(Path.of("/tmp").toFile()).start(); try(var in = new Scanner(process.getInputStream()){ while(in.hasNextLine()){System.out.println(in.nrxtLine()); }總結
以上是生活随笔為你收集整理的《Java核心技术 卷1》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PaperWeekly 第28期 | 图
- 下一篇: Java四种线程池的使用