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