說明:java
本篇用于收集知識點方便隨時鞏固,持續更新與糾錯。數組
關于JDK版本,若無特殊說明,默認為JDK 1.8,。緩存
關于JVM版本,若無特殊說明,默認為 HotSpot。安全
目錄數據結構
1、Java 基礎
1.1?Java中的基本數據類型有哪幾種?各占用多少字節?
答:Java 中的基本數據類型有8種。其中:
數值型
整數類型
byte:1字節8位有符號整數
short:2字節16位有符號整數
int:4字節32位有符號整數
long:8字節64位有符號整數
浮點類型
float:4字節32位浮點數
double:8字節64位浮點數
字符型
char:2字節16位Unicode字符
布爾型
boolean:1字節8位
1.2?String 在Java中是個特殊的存在,談談?
答:
Sting類能夠序列化。String實現了序列化接口,因此是能夠被序列化與反序列化的。
String對象之間能夠進行比較。實現了Comparable接口中的compareTo()方法,因此字符串之間是能夠進行比較的(是根據字符串中每一個字符的ASCII碼進行比較),以下圖源碼。
String類不能夠被繼承。由于String 是一個被final所修飾的類。
String是不可變的。String類底層實際存儲數據的是:private final char value[];?也就是說 String類底層維護的是一個字符序列。這個 char 類型數組被 final 所修飾,因此一經建立,就不可修改。
String類重寫了equals() 方法。先比較兩個字符串的地址是否相同,是則直接返回true;若是地址不相同,再看兩個字符串內容是否相同,是的話也返回true。
String能夠用字面量方式建立。String 是一個類,與其余類不一樣的是,String可使用字面量的形式建立或賦值。
String str = "123";
/*
1 先到常量池去經過String的equals()方法去找是否存在字符串"123",
若是存在,直接將地址返回(這也保證了常量池中的字符串常量都是惟一的)。
2 若是常量池中不存在"123",則先在常量池中建立一個"123"的字符序列,而后再將其地址返回。
*/
String str = new String("123");
/*
1 先到常量池去經過String的equals()方法去找是否存在字符串"123",
若是不存在,就在常量池中建立一個。
(因此說在new字符串的時候,若是常量池中不存在,實際上會建立兩次。)
2 在堆中開辟空間,建立一個Sting 對象,并返回其地址。
*/
String常量存儲在方法區中的常量池,new出來的對象存儲在堆內存中。
字符串之間可使用 + 號拼接。拼接產生的結果是第三個字符串,進行拼接的字符串自己是沒有發生任何變化的。
String 的本地方法 intern() 能夠從常量池中獲取字符串。若是常量池中沒有,就先建立,再將其地址返回。
1.3 談談 String、StringBuffer、StringBuilder 的異同。
這三個類 都被 final 鎖修飾,不容許被繼承。
從線程安全的角度講:
String 實例對象是不可變的字符串常量,不存在線程安全問題,即String是線程安全的。
StringBuilder 沒有使用鎖機制,在多線程并發的狀況下,可能會出現線程安全問題。
StringBuffer 中涉及到修改底層數據的方法,都加了 synchronized 關鍵字,因此StringBuffer 是線程安全的。
從對象可變性角度講:
String 底層維護的是一個被final 鎖修飾的字符數組,不可變。
StringBuffer 和 StringBuilder 底層維護的是一個可變的字符數組,因此其對象實例是可變的。
從頻繁修改的性能角度:
String對象自己是不可變的,對字符串修改,其實是在產生新的對象,所以修改效率低下。
StringBuilder 底層維護的是一個可變的字符數組,能夠經過擴容等機制,實現對字符序列的修改。所以修改效率較高。
StringBuffer 底層維護的也是一個可變的字符數組,但與StringBuilder不一樣的是,StringBuffer中的修改操做都被加了鎖,獲取鎖、釋放鎖、阻塞等因素致使了StringBuffer的性能方面可能會比StringBuilder低。
在 JDK 1.6 以后,對synchronized 進行了一些鎖優化,其中的“鎖消除”優化,會使得StringBuffer在某種絕對安全的狀況下忽略方法上加的鎖,從而其性能會有所提高。
其余方面:
StringBuffer 的 toString() 方法會對字符序列進行緩存,以減小元素復制的開銷,而 StringBuilder 則是直接復制。從而從某種程度上說,推薦使用StringBuffer。
StringBuffer 與 StringBuilder 的初始容量、擴容機制等
初始容量:16
擴容:
擴容至當前的兩倍加2 :int newCapacity = value.length * 2 + 2;
若是長度仍是不夠,那么實際須要多長,就擴容至多長:
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
1.4?ArrayList、Vector、LinkedList 的異同?
Vector:
底層存儲數據的是Object類型的數組。
new Vector() 時,初始大小為10
每次擴容至原來的兩倍(能夠設定增加因子capacityIncrement)
是線程安全的
優勢:底層數據結構是數組,查找效率高。
缺點:插入、刪除元素等操做效率低,且因為是線程安全的,因此較ArrayList來講總體效率較低。
ArrayList:
底層數據存儲是Object類型的數組
new ArrayList() 時,底層數據指針指向一個空數組;
第一次添加元素時,將數據指針指向長度為10的數組。
每次擴容至原來的1.5倍
是線程不安全的,在多線程操做下,可能拋出:ConcurrentModificationException(并發修改異常)
優勢:效率略高于 Vector ,能夠在單線程下使用。
缺點:線程不安全,數組的缺點它都有。
LinkedList:
雙向鏈表,底層存儲的是 Node 類型的節點鏈表
線程不安全,可能會拋出:ConcurrentModificationException
優勢:插入、刪除節點很容易
缺點:查找元素效率較前面兩個低
1.5?講講類的實例化過程當中靜態變量、成員變量等的加載順序
一、父類靜態變量
二、父類靜態代碼塊
三、子類靜態變量
四、子類靜態代碼塊
五、父類成員變量
六、父類構造代碼塊
七、父類構造方法
八、子類成員變量
九、子類構造代碼塊
十、子類構造方法
代碼驗證:
public class Main {
public static void main(String[] args) {
Son son = new Son();
System.out.println("====================");
Son son2 = new Son();
}
}
class Parent{
public static int a = 1;
private int aa = 10;
static {
System.out.println("父類的靜態代碼塊加載了,在此以前靜態變量a已經加載了,a = " + a);
}
{
System.out.println("父類的構造代碼塊加載了,在此以前成員變量aa已經加載了: aa = " + aa);
}
public Parent() {
System.out.println("父類的構造方法加載了");
}
}
class Son extends Parent{
public static int b = 2;
private int bb = 20;
public Son() {
System.out.println("子類的構造方法加載了");
}
static {
System.out.println("子類的靜態代碼塊加載了,在此以前靜態變量b已經加載了,b = " + b);
}
{
System.out.println("子類的構造代碼塊加載了(此處將【構造塊】放在【構造函數】下面,可是仍然是【構造塊】先加載),在此以前成員變量bb已經加載了: bb = " + bb);
}
}
打印結果:
1.6? HashMap 你用過嗎?說說你對它的認識?
HashMap空參構造,只初始化了負載因子(0.75),其余成員變量均為默認值。
經常使用的有參構造方法 HashMap(int initialCapacity),是能夠設置初始化大小的,在大概知道須要多大的map時,能夠考慮使用這個構造方法。
HashMap 擴容:每次擴容至原來的2倍。
使用空參構造建立的對象,在第一次添加元素的時候,才會初始化一個長度為16的Node類型的數組。
鏈表轉紅黑樹的時機:鏈表長度大于8 , 數組長度大于64
紅黑樹轉鏈表的時機:鏈表程度小于 6
HashMap 容許空值做為鍵和值
HashMap 是無序,且鍵不重復的
HashMap 線程不安全,多線程操做下可能會拋出 ConcurrentModificationException
未完,待續。。。
最后
本文是我本身復習并積累的過程,文中不免會有遺漏或不許確的地方
如有大佬路過發現個人錯誤還請指正,能夠發送到個人郵箱:yangxinhufox@foxmail.com
嫌麻煩就請在下方直接評論,萬分感謝!!!