今天要分享的是關於 《Head First Java》
這本書的讀後感,這本書有點小厚差很少有七百頁左右,因此我花了幾乎整個國慶的時間去閱讀,學習。讀完以後發現,受益頗多。正如書名所說的,它是一本重視大腦的學習指南。不管你是Java
開發工程師,仍是android
開發工程師,這本書都是良師益友。下面讓咱們一塊兒看看,我會以零碎的列表方式呈現,並以通俗的方式講解那些你迷糊不清的細節?(細心的你恐怕已經發現了,這個系列的文章的前言都是一毛同樣的,由於我不肯定你先點開的是第幾篇,哈哈)java
[1]
將被序列化的對象寫到文件中,而後就可讓你的程序去文件中讀取序列化的對象並把它們展開回到活生生的狀態。序列化的文件時很難讓通常人閱讀的,但他比純文本文件更容易讓程序恢復會原來的狀態,也比較安全,由於通常人不會知道如何動手動腳改數據。[2]
Stream
這類串流須要兩兩鏈接才能作出有意義的事情,一個是低層的串流,一個高層的串流,這樣的設計是出於面向對象考慮,一個類只作好一件事。同時經過組合不一樣的串流,又能夠變化出不少花樣。[3]
序列化的對象保存了實例變量的值,所以以後能夠在堆上帶回如出一轍的實例。比較叼的就是當對象被序列化時,被該對象引用的實例變量也會被序列化。且全部被引用的對象也會被序列化。。。。最棒的是,這些操做都是自動進行的![4]
若是要讓類可以被序列化,就實現Serializable
。Serializable
接口又被稱爲marker
或tag
類的標記用接口,由於此接口並無任何方法須要實現的。若是某類事可序列化的,則它的子類也自動地能夠序列化(接口的本意就是如此)。[5]
若是一個類中有引用到其餘不可序列化的對象,那麼這個類也是沒法序列化的,切記!若是有變量不想被序列化的,則用transient
來修飾變量便可。那些變量主數據類型值會變成默認值,引用的變量會變成null
。[6]
若是有兩個對象都有引用實例變量指向相同的對象對怎麼樣?例如兩個Cat
都有相同的Owner
對象?那Owner
會被存儲兩次嗎?答案:序列化聰明得足以分辨兩個對象是否相同,在此狀況下只有一個對象會被存儲,其餘引用會復原成指向改對象。[7]
FileInputStream
跟ObjectInputStream
組合使用的時候,若是os.close()
;的話FileInputStream
會自動跟着關掉![8]
被序列化的對象在解序列化的時候,它的構造函數是不會執行的!切記![9]
靜態變量,它們會被序列化嗎?答案:不會。要記得static
表明「每一個類一個」而不是「每一個對象一個」。當對象被還原時,靜態變量會維持類中本來的樣子,而不是存儲時的樣子,本身測試哈。[10]
關於File
有個頗有用的功能就是它提供一種比使用字符串文件名來表示文件更安全的方式。[11]
緩衝區的奧妙之處就在於使用緩衝區比沒有使用緩衝區的效率更高。由於每趟磁盤操做都會比內存操做要花費跟多時間。經過BufferedWriter
和FileWriter
的連接,BufferedWriter
能夠暫存一堆數據,而後到滿的時候再實際寫入磁盤,這樣就能夠減小對磁盤操做的次數,從而提升效率。[12]
若是想要強制緩衝區當即寫入,只要調用writer.flush()
這個方法便可[13]
String
的split()
能夠把字符串拆開成數組。[14]
每臺服務器上都有65536
個端口,可是咱們本身在寫測試socket
的時候,用的端口都要在1023
以後,由於0~1023
都已經被保留給已知的特定服務。[15]
Socket serverSocket = new Socket("127.0.0.1",5000)
這是創建服務器的Socket
鏈接寫法。Socket sock = serverSocket.accept()
;當用戶連上來的時,此方法會返回一個Socket
(在不一樣的端口上)以便與客戶端通訊。Socket
與ServerSocket
的端口不相同,所以ServerSocket
能夠空出來等待其餘的用戶。[16]
當啓動多線程的時候,咱們會以爲同時在作好幾件事情,其實只有真正的多處理器系統可以同時執行好幾件事,因此其實多線程只是在執行空間裏面很是地快速來回交換執行而已。[17]
Runnable threadJob = new MyRunnable()
;,該類就是你對線程要執行的任務的定義,也就是說此方法會在線程的執行空間運行。[18]
一旦線程執行.start()
;線程會進入可執行狀態,它會在可執行與執行中兩種狀態中來來去去,同時也有另一種狀態:暫時不可執行(又稱爲被堵塞狀態)。[19]
當多個線程同時操做同一個對象的時候,容易發生數據錯誤的狀況,解決方式就是同步化方法,synchronized
。當對象有一個或多個同步化的方法時,線程只有在取得對象鎖的鑰匙時才能進入同步化的方法。從而保護數據的安全。(不過代價就是損耗性能,須要本身權衡)同時注意死鎖的狀況。[20]
每一個Java
對象都有一個鎖,每一個鎖只有一把鑰匙。類也有個鎖,?[21]
高級java
類設計中,泛型
的使用是很是高明的,什麼是泛型,只要你看到<>就是了,其實處處都是。以泛型的觀點來講,extend
表明extend
或implement
。哈哈,不看不知道哈[22]
數組的類型是在運行期間檢查的,但集合的類型檢查只會發生在編譯期間,在多態賦值的時候,集合可沒那麼容易讓你過哈,?[23]
遠程過程調用的設計,要建立4種東西:服務器,客戶端,服務器輔助設施和客戶端輔助設施。其實真相就是兩個輔助設施二者在負責通訊,客戶端跟服務器只是把命令給他們,結果拿回來而已。android
大結局啦,?,其實這三篇文章是我看完以後,以爲有必要從七百多頁的書中提出去來的要點,也但願對你們有幫助。咱們但是攻城獅,fight!數組