摘要:拆箱將包裝類型轉換為基本類型的過程。否則會拋出異常。默認采用單鏈表解決沖突,如果鏈表長度超過,將單鏈表轉換為紅黑樹。內部使用紅黑樹實現,存儲映射。紅黑樹減弱了對平衡的要求,降低了保持樹平衡需要的開銷,在實際應用中,統計性能超過平衡二叉樹。
引言
在學習《Java編程的邏輯》一書時記錄的一些筆記,掃清了一些Java基礎的知識盲區,感謝作者馬俊昌老師。
數據類型序號 | 數據類型 | 大小(位) | 包裝類 | 默認值 | 數據范圍 |
---|---|---|---|---|---|
1 | byte | 8 | Byte | 0 | -128 ~ 127 |
2 | short | 16 | Short | 0 | -32768 ~ 32767 |
3 | int | 32 | Integer | 0 | -2147483648 ~ 2147483647 |
4 | long | 64 | Long | 0L | -9223372036854775808 ~ 9223372036854775807 |
5 | boolean | 8 | Boolean | false | true/false |
6 | char | 16 | Character | 空 | 0 ~ 65535 |
7 | float | 32 | Float | 0.0F | 1.4E-45 ~ 3.4028235E38 |
8 | double | 64 | Double | 0.0D | 4.9E-324 ~ 1.7976931348623157E308 |
裝箱:將基本類型轉換為包裝類的過程。
拆箱:將包裝類型轉換為基本類型的過程。
Java 5以后引入了自動裝箱和拆箱技術:
Integer a = 100; int b = a;
自動裝箱/拆箱是Java編譯器提供的能力,背后,它會替換為調用對應的valueOf/xxx-Value方法,比如,上面的代碼會被Java編譯器替換為:
Integer a = Integer.valueOf(100); int b = a.intValue();valueOf
一般建議使用valueOf方法。
new每次都會創建一個新對象,而除了Float和Double外的其他包裝類,都會緩存包裝類對象,減少需要創建對象的次數,節省空間,提升性能。
緩存IntegerCache表示Integer緩存,其中的cache變量是一個靜態Integer數組,在靜態初始化代碼塊中被初始化。
默認情況下,保存了-128~127共256個整數對應的Integer對象。
在valueOf代碼中,如果數值位于被緩存的范圍,即默認-128~127,則直接從Integer-Cache中獲取已預先創建的Integer對象,只有不在緩存范圍時,才通過new創建對象。
序號 | 數據類型 | 數據緩存 |
---|---|---|
1 | Boolean | true, false |
2 | Byte | -128 ~ 127 |
3 | Short | -128 ~ 127 |
4 | Integer | -128 ~ 127 |
5 | Long | -128 ~ 127 |
6 | Character | 0 ~ 127 |
7 | Float | 無緩存 |
8 | Double | 無緩存 |
Java 5之前,只支持byte、short、int、char四種。
Java 5中,引入了枚舉類型。因為枚舉類的ordinal返回一個int值。
Java 7中,支持String類型,使用String的hashCode方法。
原因switch的效率相對較高,編譯后使用跳轉表實現。
跳轉表有序,可以二分查找,所以支持的數據類型都是整數,枚舉和String也是轉換為int值。
跳轉表的存儲空間是32位,容納不下long,所以switch不支持long類型。
接口接口中變量修飾符是public static final。
接口中方法修飾符是public abstract。
java 8允許在接口里定義默認方法default和靜態方法static。
java 9允許默認方法和靜態方法可以是private。
序列化 條件一個類的對象要想序列化成功,必須滿足兩個條件:
該類必須實現java.io.Serializable接口。
該類的所有屬性必須是可序列化的。如果不想序列化,則將該屬性注明為transient。
否則會拋出NotSerializableException異常。
注意虛擬機是否允許反序列化,不僅取決于類路徑和功能代碼是否一致,一個非常重要的一點是兩個類的序列化ID是否一致。
序列化并不保存靜態變量。
父類如果沒有實現Serializable接口時,反序列化時,會調用父類無參的構造函數。
ExternalizableExternalizable接口繼承自java.io.Serializable。
public interface Externalizable extends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }
實現Externalizable接口后,序列化的細節由開發人員自己實現。
并且Externalizable的優先級比Serializable的優先級高。
異常try/catch/finally語法中,catch不是必需的,也就是可以只有try和finally,表示不捕獲異常,異常自動向上傳遞,但finally中的代碼在異常發生后也執行。
java 7開始支持:多個異常之間可以用|操作符:
try { // 可能拋出ExceptionA和ExceptionB } catch (ExceptionA | ExceptionB e) { // 異常處理邏輯 }try-with-resources
java 7提供了一種新的語法,稱之為try-with-resources。
這種語法針對實現了java.lang.AutoCloseable接口的對象,接口定義:
public interface AutoCloseable { void close() throws Exception; }
語法形式如下:
try (AutoCloseable resource = new FileInputStream("yunzhi.txt")) { // 使用資源 }
資源resource的聲明和初始化放在try語句內,不用再調用finally,在執行完try語句后,會自動調用資源的close方法。
StringString類內部用一個字符數組表示字符串,實例變量定義為:
private final char value[];常量字符串
System.out.println("yunzhi.club".length()); System.out.println("yunzhi.club".contains("yunzhi")); System.out.println("yunzhi.club".indexOf("yunzhi"));
實際上,這些常量就是String類型的對象,在內存中,它們被放在一個共享的地方,這個地方稱為字符串常量池,它保存所有的常量字符串,每個常量只會保存一份,被所有使用者共享。
當通過常量的形式使用一個字符串的時候,使用的就是常量池中的那個對應的String類型的對象。
+/+=Java中,String可以直接使用+和+=運算符,這是Java編譯器提供的支持,背后,Java編譯器一般會生成StringBuilder,+和+=操作會轉換為append。
String hello = "hello"; hello += ", world"; System.out.println(hello);
背后,Java編譯器一般會轉換為:
StringBuilder hello = new StringBuilder("hello"); hello.append(", world"); System.out.println(hello.toString());
對于簡單的情況,可以直接使用String的+和+=,對于復雜的情況,尤其是有循環的時候,應該直接使用StringBuilder。
為什么要定義為不可變類呢?不可變使得程序更為簡單安全,因為不用操心數據被意外改寫的可能,可以安全地共享數據,尤其是在多線程的環境下。
Map和Set HashMap效率高。
無序,因為hash值是無序的。
默認采用單鏈表解決沖突,如果鏈表長度超過8,將單鏈表轉換為紅黑樹。
負荷系數static final float DEFAULT_LOAD_FACTOR = 0.75f;為什么容量是2的冪
申請內存時,減少內存碎片。
進行移位操作,效率高。
tab[i = (n - 1) & hash],使用n-1的&運算,提高效率。
其他擴容的條件:實際節點數大于等于容量的0.75,就是負荷系數。
因為不同版本的JDK計算的hash值可能是不同的。只存儲了數組的容量、實際節點數量和各個節點的key value值。
HashSet元素不重復。
添加、刪除、判斷元素是否存在都是O(1)的復雜度。
無序。
HashSet內部是調用HashMap來實現的,核心就是利用HashMap中的key不能相同進行去重,key就是Set中的值,value存了一個空對象。
TreeMapTreeMap按鍵有序,為了實現有序,要求要么鍵實現Comparable接口,要么創建TreeMap時傳遞一個Comparator對象。
內部使用紅黑樹實現,存儲映射。
紅黑樹紅黑樹是一種平衡二叉樹,但它不是高度平衡的,而是大致平衡的。確保任意一條從根到葉子節點的路徑,沒有任何一條的路徑的長度會比其他路徑長過兩倍。
紅黑樹減弱了對平衡的要求,降低了保持樹平衡需要的開銷,在實際應用中,統計性能超過平衡二叉樹。
TreeSetTreeSet內部是基于TreeMap的,實現了有序。
LinkedHashMapHashMap的子類,內部使用雙向鏈表維護鍵值對的順序,每個鍵值對既位于哈希表中,也位于這個雙向鏈表中。
支持插入順序維護或訪問順序維護。
插入順序:先添加的在前面,后添加的在后面,修改操作不影響順序。
訪問順序:對一個鍵值對進行get/put操作,該鍵值對會移動到鏈表末尾,最末尾的是最近訪問的,最開始的是最久沒有訪問的。
LinkedHashSetHashSet的子類,內部采用LinkedHashMap實現。
EnumMap一個key是枚舉類型的Map。
內部使用了兩個長度相同的數組,一個存鍵,一個存儲對應的值,值為null表示沒有該鍵值對。鍵都有一個對應的索引,根據索引可直接訪問和操作其鍵的值,效率高。
EnumSetEnumSet的實現和EnumMap沒有任何關系!
采用位向量實現。0代表沒有存這個枚舉值,1代表存了這個枚舉值,效率很高。
PriorityQueue優先級隊列,內部采用堆實現。和其他需要比較的操作一樣,要么實現Comparable接口,要么創建時傳遞一個Comparator對象。
適用場景 TOP K問題維護一個最小堆,堆的根節點是最小的,即第K大元素。
每次有新數據來,和根節點比,如果小,不操作,如果大,替換根節點,調整堆。調整的復雜度為O(logK)。
求中值元素維護一個最大堆和最小堆,假設當前中位數為M,最大堆維護<=M的元素,最小堆維護>=M的元素,但兩堆中都不包含M。
新數據來時,如果<=M,放到最大堆中,如果>=M,放到最小堆中。
數據加入之后,如果兩堆元素相差>=2,將M加入到元素少的堆中,元素多的堆的根節點移除作為新的中值元素。
集合關系圖之前一直很怕這張圖,但是隨著積累,圖中的類我們也逐漸地學會并掌握了。
CollectionsCollections常用方法。
查找和替換方法名 | 方法描述 |
---|---|
binarySearch | 二分查找 |
max | 最大值 |
min | 最小值 |
frequency | 集合中元素出現次數 |
indexOfSubList lastIndexOfSubList | 在原List中查找目標List的位置 |
disjoint | 集合是否有交集 |
replaceAll | List中元素替換 |
方法名 | 方法描述 |
---|---|
sort | 排序 |
swap | 元素交換 |
reverse | 列表反轉 |
shuffle | 洗牌,隨機打亂順序 |
rotate | 循環移位 |
方法名 | 方法描述 |
---|---|
emptyList emptySet emptyMap emptyIterator | 返回空的集合,使用時比返回null更合理,更安全 |
singleton singletonList singletonMap | 將單一對象轉化為標準容器接口對象 |
方法名 | 方法描述 |
---|---|
unmodifiableCollection unmodifiableList unmodifiableMap unmodifiableSet | 讓容器只讀 |
synchronizedCollection synchronizedList synchronizedMap synchronizedSet | 讓容器線程安全,不是最優實現。 |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75954.html
摘要:我的學習筆記匯總標簽筆記分為兩大部分和筆記內容主要是對一些基礎特性和編程細節進行總結整理,適合了解基礎語法,想進一步深入學習的人如果覺得不錯,請給,這也是對我的鼓勵,有什么意見歡迎留言反饋目錄基礎鞏固筆記反射基礎鞏固筆記泛型基礎鞏 我的java&javaweb學習筆記(匯總) 標簽: java [TOC] 筆記分為兩大部分:javase和javaweb javase javawe...
摘要:而面向搜索引擎,就是我們要及時的使用百度谷歌遇到問題無法解決,先別急著放棄,可以去網絡尋找答案,你的坑大部分別人都已經走過了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語言,到底哪一門才是適合我的?●我們為什么要學習Java語言呢...
摘要:變量聲明變量變量名規則字母開頭,由字母或數字構成的序列,中的字母包括或者某種語言中代表字母的任何字符,數字包括或者某種語言中代表數字的任何字符。刪除原始字符串頭部和尾部空格。中斷控制流程,使用在和循環中,用于提前中斷循環。 《Java核心技術 卷Ⅰ》 第3章 Java 的基本程序設計結構 一些規則 類命名:CamelCase 駝峰命名法,以及必須是字母開頭,后面跟字母和數字的任意組合...
摘要:的基礎類型主要分為四大類,八小類。四大類分別為整數型,浮點數類型,布爾類型字符類型。是最常用的整數數據類型。布爾類型布爾類型有兩個值和,用來判定的邏輯條件。基礎類型的數據,直接存放在棧內存。基礎類型的方法傳參是通過值拷貝的方法。 Java的基礎類型主要分為四大類,八小類。四大類分別為整數型,浮點數類型,布爾類型,字符類型。其中整數型有四中,容量從小到大分別為:byte,short,in...
摘要:區分大小寫語句以英文分號結尾一環境搭建安裝建議和設置環境變量添加用戶變量二使用創建工作空間,即選擇適合的,如創建在目錄下創建運行有方法的類,在試圖中查看結果三第一個類方法必須這樣寫一個類里面可以有多個方法,但只能有一個方法,方法里的代碼決定 1、java區分大小寫2、語句以英文分號(;)結尾一、環境搭建1、安裝JDK(建議java SE)和Eclipse for java2、設置環境變...
摘要:注該筆記適合有基礎或者有復習需求的小伙伴哦預習的話建議直接看視頻俺舅是鏈接邀請碼太過簡單的知識點都被作者扔到回收站了所以這些知識點都是精華呦一快捷鍵與常見問題運行當前程序其它運行方法右鍵小蟲子圖像右邊的圖標運行錯誤運行 ...
閱讀 2472·2021-10-12 10:11
閱讀 1218·2021-10-11 10:58
閱讀 3258·2019-08-30 15:54
閱讀 696·2019-08-30 13:59
閱讀 667·2019-08-29 13:07
閱讀 1392·2019-08-26 11:55
閱讀 2133·2019-08-26 10:44
閱讀 2620·2019-08-23 18:25