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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《Java: The Complete Reference》等书读书笔记

發布時間:2023/11/27 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Java: The Complete Reference》等书读书笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

春節期間讀了下《Java: The Complete Reference》發現這本書寫的深入淺出,我想一個問題,書中很多內容我們也知道,但是為什么我們就寫不出這樣一本書,這么全面,這么系統,這么簡單易懂。不得不佩服Herbert Schildt的編程功底,需要提到的是Herbert Schildt寫了很多Java和C、C++的書,他是C、C++、Java和C#編程語言的權威,是ANSI/ISO組織C語言標準化委員會的委員。

Herbert Schildt最新的基本Java著作其實都差不多,在內容側重點上有點不同。本文雖然名為《Java: The Complete Reference》《Java 8 編程參考官方教程(第9版)》讀書筆記,但是實則是同時參考以下幾本。

《Java: The Complete Reference, Ninth Edition》 ? 中文版《Java 8 編程參考官方教程(第9版)》
《Java: A Beginner's Guide, Sixth Edition》?中文版《Java 8 編程入門官方教程 第6版》
《Java Programming: A Comprehensive Introduction》 中文版?《Java 7程序設計入門經典》

?

《Ivor Horton's Beginning Java Java 7 Edition Edition》

?

《The Java Tutorial: A Short Course on the Basics (6th Edition) (Java Series) 6th Edition》


本文就是一個針對Java一些關鍵的知識點學習的筆記。

?

Java的起源

驅使計算機語言革新的因素有兩個:程序設計技術的改進 和 計算環境的改變。

?

Java和C和C++的關系

Java繼承了C的語法,Java的對象模型從C++改編而來。

Java不是C++的增強版,Java不是為替代C++而設計,而是為了解決特定問題而設計,C++則是用來解決另一個不同系列的問題。

Java的魔法:字節碼

Java同時 解決安全性問題和可移植性問題的關鍵在于Java編譯器的編譯結果不是可執行代碼,而是字節碼bytecode。

字節碼是一系列設計用來由Java虛擬機(JVM)的Java運行時執行的高度優化的指令。

只需要對每個平臺實現Java虛擬機,盡管平臺之間的Java虛擬機不同,但是他們都可以理解相同的Java字節碼。

Java程序由JVM執行也使其更安全,因為每一個Java程序都處于JVM的控制下,此外Java語言中的一些限制也增強了安全性。

程序被解釋要比被編譯為可執行代碼慢很多,對于Java兩者區別不明顯,因為字節碼已經被高度優化。

雖然Java是解釋型語言,但這在技術上不妨礙Java字節碼迅速編譯為本機代碼。Sun在Java的初始版本之后提供了HotSpot技術,HotSpot提供了一個JIT字節碼編譯器。

當JIT成為JVM的一部分之后,它可以根據逐條命令將字節碼實時轉換為可執行代碼,因為Java執行的各種檢查只在運行時才進行,所以不能將整個Java程序一次性編譯為可執行代碼,而是在執行期間需要時JIT才編譯代碼。

不是所有的字節碼序列都被編譯,只有那些能從編譯受益的字節碼才會被編譯,其余的代碼被簡單的解釋。

編譯程序

javac ?Example.java ?

編譯器javac創建一個包含程序字節碼的名為?Example.class的文件(字節碼)。

編譯過Java源代碼后,每個單獨的類被放在自己的輸出文件中,輸出文件以類名+.class擴展名。因為源碼文件和.class文件名稱相同,所以將Java源代碼文件的名稱指定為它包含的類名是個好主意。

運行程序

java ?Example

由Java解釋器java運行程序,需要將類名Example作為實參傳遞。

?

注釋

支持3種注釋:/**/和//和文檔注釋,文檔注釋用于生成說明程序的HTML文件。以/**開頭,以*/結束。

?

縮進原則

Java本身是形式自由的語言,但是推薦縮進,在每個左括號之后縮進一級,而在每個右括號之后提前一級。

代碼塊

將語句包含在{}之間實現,代碼塊一旦創建就成為一個邏輯單元。

代碼塊不會增加任何開銷,{}只存在于源碼中,Java不會執行{}。

空白符:空格,制表符,換行符。每個標記之間至少有一個空白符即可。

標識符:標識符用于命名事物,例如類,變量和方法。標識符可以由大小寫字母,數字,下劃線,美元符號等字符組成的任意序列。

不能以數字開頭。Java是大小寫敏感的。

?

字面值:常量的值是通過使用表示常量的字面值創建的。


?

分隔符:最常用的是分號,分號是語句的終止符。此外還有(),{}.[]等等。


關鍵字:50個。

?

?

集合

Object類定義的hashCode()方法能根據對象在內存中的位置,為對象生成int類型的散列碼,鍵的散列碼一般用于計算Map在內存中存儲對象而分配的偏移量,偏移量決定了鍵值對的存儲位置。

String s="abc";

ss.hashCode();輸出其hash值。

----------------------------------------------------------------

以下關于集合參考:集合類操作優化經驗總結

ArrayList 和 Vector 使用了數組實現,ArrayList 沒有對任何一個方法提供線程同步,因此不是線程安全的,Vector 中絕大部分方法都做了線程同步,是一種線程安全的實現。
Vector 非常類似于 ArrayList,區別是 Vector 是線程同步的。
由 Vector 創建的 Iterator,雖然和 ArrayList 創建的 Iterator 是同一接口,但是,因為 Vector 是同步的,
當一個 Iterator 被創建而且正在被使用,另一個線程改變了 Vector 的狀態(例如,添加或刪除了一些元素),這時調用 Iterator 的方法時將拋出 ConcurrentModificationException,因此必須捕獲該異常。


由于作為 Key 的對象將通過計算其散列函數來確定與之對應的 Value 的位置,因此任何作為 key 的對象都必須實現 HashCode 和 Equals 方法。
HashCode 和 Equals 方法繼承自根類 Object,如果你用自定義的類當作 Key 的話,要相當小心,按照散列函數的定義,如果兩個對象相同,即 obj1.equals(obj2)=true,則它們的 HashCode 必須相同,
但如果兩個對象不同,則它們的 HashCode 不一定不同,如果兩個不同對象的 HashCode 相同,這種現象稱為沖突,沖突會導致操作哈希表的時間開銷增大,所以盡量定義好的 HashCode() 方法,能加快哈希表的操作。
如果相同的對象有不同的 HashCode,對哈希表的操作會出現意想不到的結果(期待的 Get 方法返回 Null),要避免這種問題,最好同時復寫 Equals 方法和 HashCode 方法,而不要只寫其中一個。


HashMap 和 Hashtable 類似,不同之處在于 HashMap 是線程非同步的,并且允許 Null,即 Null Value 和 Null Key。
但是將 HashMap 視為 Collection 時(values() 方法可返回 Collection),其迭代子操作時間開銷和 HashMap 的容量成比例。
因此,如果迭代操作的性能相當重要的話,不要將 HashMap 的初始化容量設得過高,或者 Load Factor 參數設置過低。


WeakHashMap 是一種改進的 HashMap,它對 Key 實行“弱引用”,如果一個 Key 不再被外部所引用,那么該 Key 可以被 GC 回收。
WeakHashMap 特點是當除了自身有對 Key 的引用外,如果此 Key 沒有其他引用,那么此 Map 會自動丟棄該值。
WeakHashMap 主要通過 expungeStaleEntries 這個函數來實現移除其內部不用的條目,從而達到自動釋放內存的目的。
基本上只要對 WeakHashMap 的內容進行訪問就會調用這個函數,從而達到清除其內部不再為外部引用的條目。
但是如果預先生成了 WeakHashMap,而在 GC 以前又不曾訪問該 WeakHashMap, 那不是就不能釋放內存了嗎?果不其然,WeakHashMap 這個時候并沒有自動幫我們釋放不用的內存。
總的來說,WeakHashMap 并不是你什么也干它就能自動釋放內部不用的對象的,而是在你訪問它的內容的時候釋放內部不用的對象。
WeakHashMap 實現弱引用,是因為它的 Entry<K,V>是繼承自 WeakReference<K>的。
WeakHashMap 類是線程不同步的,可以使用 Collections.synchronizedMap 方法來構造同步的 WeakHashMap, 每個鍵對象間接地存儲為一個弱引用的指示對象。因此,不管是在映射內還是在映射之外,只有在垃圾回收器清除某個鍵的弱引用之后,該鍵才會自動移除。需要注意的是,WeakHashMap 中的值對象由普通的強引用保持。因此應該小心謹慎,確保值對象不會直接或間接地強引用其自身的鍵,因為這會阻止鍵的丟棄。注意,值對象可以通過 WeakHashMap 本身間接引用其對應的鍵,這就是說,某個值對象可能強引用某個其他的鍵對象,而與該鍵對象相關聯的值對象轉而強引用第一個值對象的鍵。
處理此問題的一種方法是,在插入前將值自身包裝在 WeakReferences 中,如:m.put(key, new WeakReference(value)),然后,分別用 get 進行解包,該類所有“collection 視圖方法”返回的迭代器均是快速失敗的,在迭代器創建之后,如果從結構上對映射進行修改,除非通過迭代器自身的 Remove 或 Add 方法,其他任何時間任何方式的修改,迭代器都將拋出 ConcurrentModificationException。因此,面對并發的修改,迭代器很快就完全失敗,而不是冒著在將來不確定的時間任意發生不確定行為的風險。
注意,我們不能確保迭代器不失敗,一般來說,存在不同步的并發修改時,不可能做出任何完全確定的保證。


LinkedList 使用了循環雙向鏈表數據結構,由一系列表項連接而成,一個表項總是包含 3 個部分,元素內容、前驅表項和后驅表項。
當 ArrayList 對容量的需求超過當前數組的大小時,需要進行擴容。擴容過程中,會進行大量的數組復制操作,而數組復制時,最終將調用 System.arraycopy() 方法。LinkedList 由于使用了鏈表的結構,因此不需要維護容量的大小,然而每次的元素增加都需要新建一個 Entry 對象,并進行更多的賦值操作,在頻繁的系統調用下,對性能會產生一定的影響,在不間斷地生成新的對象還是占用了一定的資源。而因為數組的連續性,因此總是在尾端增加元素時,只有在空間不足時才產生數組擴容和數組復制。
ArrayList 是基于數組實現的,而數組是一塊連續的內存空間,如果在數組的任意位置插入元素,必然導致在該位置后的所有元素需要重新排列,因此其效率較差,盡可能將數據插入到尾部。LinkedList 不會因為插入數據導致性能下降。
ArrayList 的每一次有效的元素刪除操作后都要進行數組的重組,并且刪除的元素位置越靠前,數組重組時的開銷越大,要刪除的元素位置越靠后,開銷越小。LinkedList 要移除中間的數據需要便利完半個 List。


HashMap 是將 Key 做 Hash 算法,然后將 Hash 值映射到內存地址,直接取得 Key 所對應的數據。在 HashMap 中,底層數據結構使用的是數組,所謂的內存地址即數組的下標索引。HashMap 的高性能需要保證以下幾點:
Hash 算法必須是高效的;
Hash 值到內存地址 (數組索引) 的算法是快速的;
根據內存地址 (數組索引) 可以直接取得對應的值。
HashMap 實際上是一個鏈表的數組。前面已經介紹過,基于 HashMap 的鏈表方式實現機制,只要 HashCode() 和 Hash() 方法實現得足夠好,能夠盡可能地減少沖突的產生,那么對 HashMap 的操作幾乎等價于對數組的隨機訪問操作,具有很好的性能。但是,如果 HashCode() 或者 Hash() 方法實現較差,在大量沖突產生的情況下,HashMap 事實上就退化為幾個鏈表,對 HashMap 的操作等價于遍歷鏈表,此時性能很差。
HashMap 的一個功能缺點是它的無序性,被存入到 HashMap 中的元素,在遍歷 HashMap 時,其輸出是無序的。如果希望元素保持輸入的順序,可以使用 LinkedHashMap 替代。
LinkedHashMap 繼承自 HashMap,具有高效性,同時在 HashMap 的基礎上,又在內部增加了一個鏈表,用以存放元素的順序。
HashMap 通過 hash 算法可以最快速地進行 Put() 和 Get() 操作。TreeMap 則提供了一種完全不同的 Map 實現。從功能上講,TreeMap 有著比 HashMap 更為強大的功能,它實現了 SortedMap 接口,這意味著它可以對元素進行排序。TreeMap 的性能略微低于 HashMap。如果在開發中需要對元素進行排序,那么使用 HashMap 便無法實現這種功能,使用 TreeMap 的迭代輸出將會以元素順序進行。LinkedHashMap 是基于元素進入集合的順序或者被訪問的先后順序排序,TreeMap 則是基于元素的固有順序 (由 Comparator 或者 Comparable 確定)。
LinkedHashMap 是根據元素增加或者訪問的先后順序進行排序,而 TreeMap 則根據元素的 Key 進行排序。

----------------------------------------------------------------


--未完--

?

總結

以上是生活随笔為你收集整理的《Java: The Complete Reference》等书读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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