1. 程式人生 > >《Java編程思想》(Thinking in Java)讀書筆記——01對象導論

《Java編程思想》(Thinking in Java)讀書筆記——01對象導論

動態 執行 線程 情況 依賴關系 AI UC 技巧 復制

1.9 容器

關於容器,最常用的就是Collection接口裏的Set、List和Map所衍生的各種實現類,還有較為少用但又不可或缺的Queue。

它們都有相同的點,即:提供了類似數組類型的數據聚合功能(有部分類型也是用數組實現)簡單的說,就是能夠像數組一樣,將同種類型的數據綁定在一起,放在同一個地方(指針、索引)下等待使用。

但容器子類(接口)間又各有不同,有著各自的特點。

各個容器的依賴關系如下:

技術分享圖片

Set類型

子元素間有不可重復性。如,將“1,1,2,3”這樣四個元素存入Set的實現類中,容器中就只有“1,2,3”這三個元素。

(但其具體構造器與實現方法與使用還未深入研究,等後續再行補充)。

List類型

子元素可重復存放。如,將“1,1,2,3”這樣四個元素存入Set的實現類中,容器中就只有“1,1,2,3”這四個元素。

其底層仍是由數組實現,默認的構造器會使用“10”的容量來構造數組(也可以在實例化時指定容量大小)。

當子元素數量超過容量後,會以當前數組1.5倍的容量來構造新的數組,之後再把當前數組復制到新的數組中。

Map類型

子元素以<Key,Value>的形式進行存放(即常說的的K-Y形式),其中Key部分不能重復,而Value可以重復。

Key多是形似指針或者索引的數據,用於表示Value中的某種數據特性(這種特性一般是獨一無二的)。如,將身份證號(idm,Identity Document Number)作為Key,將個人信息(info,Information)作為Value,組成<idm,info>的Map數據就可以通過idm查詢info。

Queue類型

隊列功能用於實現任務的先進先出(FIFO,First In First Out),常見於生產者-消費者模式消息機制、多線程應用等的任務存儲。

書中最後提到一點建議:

我們可以在一開始使用LinkedList構建程序,而在優化系統性能時改用ArrayList

應用這個技巧能很好地結合LinkedList的高效順序增加特性與ArrayList的高效隨機獲取特性

在1.9.1 參數化類型 中提到了使用泛型來規範化類型格式,但不能過度依賴泛型,也要註意到“泛型擦除”可能會帶來的問題。


1.10 對象的創建和生命期

書中提到:

Java完全采用了動態內存分配方式。每當想要創建新對象時,就要使用new關鍵字來構建此對象的動態實例。

...

對於允許在堆棧上創建對象的語言,編譯器可以確定對象存活的時間,並可以自動銷毀它。然而,如果是在堆上創建對象,編譯器就會對他的生命周期一無所知

堆棧和堆的不同點在於:

  • 棧存儲在連續空間且有序執行(後進先出)因此可以知道其生命周期。
  • 則的存儲則不需要連續的空間,因此可以有效利用碎片化和不規則的空間,但也因此很難確定當前堆的數據是否已經使用完畢(這就引入了之後會提到的JVM不同的內存回收機制)。

1.12 並發編程

書中提到:

有時中斷對於處理時間性強的任務是必需的,但是對於大量的其他問題,我們只是想把問題切分成多個可獨立運行的部分(任務),從而提高程序的響應能力

容易混淆的一點是,多線程提高的是程序的“響應能力”,而不是提高程序的“處理能力”

因為線程間切換時需要進行現場保護消耗資源和時間,所以盲目使用多線程反而會造成性能降低的情況,也就是說我們在選擇是否使用多線程時需要註意應用場景是否合適。

如,在進行I/O操作時有BIO、NIO和AIO三種選擇,其中:

  • BIO(Blocked Input/Output,阻塞I/O)可以理解成在單線程情況下,控制器(CPU)等待I/O完成後才進行下一步操作;
  • NIO(Not blocked Input/Output,非阻塞I/O)也是使用單線程,但控制器(CPU)無需等待I/O完成,通過將I/O控制權交給DMA控制器來解放控制器(可以去做其他事情,如:開啟新的I/O);
  • AIO(Asynchroniezd Input/Output,異步I/O)則是使用了異步的思想,例如將生產者(Producer)和消費者(Consumer)分離的異步消息機制,在這種情況下則通常需要多線程來實現,目的是充分利用現代計算機分布式、多處理器的架構;

1.13 Java與Internet

書中提到:

客戶/服務器系統的核心思想是:系統具有一個中央信息存儲池(Central Repository of Information),用來存儲某種數據,它通常存在於數據庫中,你可以根據需要將它分發給某些人員或機器集群。

...

總之,信息存儲池、用於分發信息的軟件以及信息與軟件所駐留的機器或機群被總稱為服務器。駐留在用戶機器上的軟件與服務器進行通信,以獲取信息、處理信息,然後將它們顯示在被稱為客戶機的用戶機器上。

從C/S到B/S,由Client到Browse,我們終於可以不用針對不同平臺進行客戶端編程,轉而直接在網頁中提供服務(雖然需要懂得HTML,但已經方便得多)。

而在現代項目中也還脫離不了中央信息存儲池的模式,集中式的數據使用權基本上都是Server端說了算,造成將Server和User的階級地位完全隔離——導致User不得不信任Server會“守規矩”的現狀,但Server信用破產的實例卻時有發生。

直到區塊鏈(BC,Block Chain)的出現,打破了這一現狀,提供了一種新的思路(但目前來看,並非完美的解決方案)。


圖片引用於:

http://www.jb51.net/article/84821.htm

《Java編程思想》(Thinking in Java)讀書筆記——01對象導論