日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

《Java核心技术 卷1》

發(fā)布時間:2023/12/9 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Java核心技术 卷1》 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

第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》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。