關(guān)注公眾號【愛做夢的錘子】后臺回復(fù)【java知識點】可下載整理好的xmind思維導(dǎo)圖
基礎(chǔ)知識
基本數(shù)據(jù)類型
8種基本數(shù)據(jù)類型
-
字符型
- char-1
-
布爾型
- boolean-1
-
數(shù)值(符號位迈着,一個字節(jié)=8位)
byte-1
short-2
int-4
long-8
float-4
double-8
浮點型
- 一種對實數(shù)的近似值的表現(xiàn)法,由一個有效數(shù)字加上冪數(shù)來表示郭怪,
自動拆裝箱
自帶拆裝箱
-
基本數(shù)據(jù)類型
- 不需要new卿闹,在棧內(nèi)存存儲丢间,比較高效
-
包裝類型
- 基本數(shù)據(jù)類型不是面向?qū)ο蟮模琂ava語言在設(shè)計時,添加基本數(shù)據(jù)類型對應(yīng)的包裝類型
-
裝箱
- 基本數(shù)據(jù)類型->包裝類型【通過Integer.valueOf() 以int為例】
-
拆箱
- 包裝類型->基本數(shù)據(jù)類型 【通過integer.intValue 以Integer為例】
Java5開始提供自動拆裝箱
-
缺點
包裝對象的數(shù)值比較不能簡單的使用==
自動拆箱時會可能引發(fā)NPE
for循環(huán)中如果存在大量的拆裝箱锭吨,會浪費資源
緩存機制
-
Integer的緩存機制
Java5新增功能痕寓,節(jié)省內(nèi)存傲醉,提高性能
整型對象通過使用相同的對象引用實現(xiàn)了緩存和重用
整數(shù)區(qū)間在-128-127之間數(shù)值適用,最大值127可以通過-XX:AutoBoxCacheMax=size修改
自動裝箱適用
-
其他緩存(通過包裝成a呻率,b兩個對象時硬毕,可以使用a==b判斷其是否相等)
-128至127之間的整數(shù)(§3.10.1)
true 和 false的布爾值 (§3.10.3)
‘\u0000’至 ‘\u007f’之間的字符(§3.10.4)
Byte, Short, Long有固定范圍: -128 到 127。對于Character, 范圍是 0 到 127礼仗。除了Integer以外吐咳,這個范圍都不能改變逻悠。
String
不可變性
- 一個String對象在內(nèi)存堆中被創(chuàng)建出來,他就無法被修改
Java6與Java7的substring
- java6韭脊,導(dǎo)致問題:在一個很長的字符串中截取較短的一部分童谒,會導(dǎo)致這個較長的字符串不能被回收,致使內(nèi)存泄露沪羔,已被官方標(biāo)記為JDK6的BUG
//JDK 6
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
public String substring(int beginIndex, int endIndex) {
//check boundary
return new String(offset + beginIndex, endIndex - beginIndex, value);
}
- java7
//JDK 7
public String(char value[], int offset, int count) {
//check boundary
this.value = Arrays.copyOfRange(value, offset, offset + count);
}
public String substring(int beginIndex, int endIndex) {
//check boundary
int subLen = endIndex - beginIndex;
return new String(value, beginIndex, subLen);
}
replaceFirst饥伊、replaceAll、replace區(qū)別
replaceFirst:基于正則表達(dá)式的匹配替換蔫饰,只替換匹配到的第一個
replaceAll:基于正則表達(dá)式的匹配替換撵渡,替換全部符合規(guī)則的字符和字符串
replace:可以支持字符的替換,也支持字符串的替換死嗦,替換全部匹配的字符和字符串
字符串的拼接
-
concat拼接
- 生成一個新的字符串
-
+ 拼接
- 語法糖趋距,實際上還是使用的時StringBuilder的append方法
-
StringBuffer
- 線程安全,append方法使用synchronized 修飾
StringBuilder
Java8中String.join方法
-
5中方式拼接相同字符串越除,耗時
- StringBuilder<StringBuffer<concat<+<StringUtils.join
String.valueOf和Integer.toString的區(qū)別
- 無區(qū)別节腐,String.valueOf是通過調(diào)用Integer.toString實現(xiàn)
switch支持
java7開始switch支持String
switch支持int,直接通過比較int的值
switch支持char摘盆,將char字符轉(zhuǎn)換成對應(yīng)的asii碼的數(shù)值翼雀,再進行比較
switch支持String,使用String的hashCode孩擂,以及equals方法來匹配
String str = "world";
String s;
switch((s = str).hashCode())
{
default:
break;
case 99162322:
if(s.equals("hello"))
System.out.println("hello");
break;
case 113318802:
if(s.equals("world"))
System.out.println("world");
break;
}
字符串池
字符串池是由String類私有的維護狼渊,是為了提升性能和減少內(nèi)存開銷,避免字符串的重復(fù)創(chuàng)建
-
字符串創(chuàng)建方式
直接使用字符串賦值类垦。直接去字符串池中查找當(dāng)前字符串值是否存在狈邑,存在,則直接將池中引用返回蚤认;如果不存在米苹,則在字符串池中創(chuàng)建對象,然后將池中引用返回
顯式new String()砰琢。首先會去字符串池中查找當(dāng)前字符串值是否存在蘸嘶,如果不存在,則在字符串池中創(chuàng)建對象陪汽,存在則不創(chuàng)建训唱。最后還要在堆中額外創(chuàng)建一個字符串對象,最后是將堆中對象的引用返回
-
回收機制
- new關(guān)鍵字創(chuàng)建的字符串對象如果不可達(dá)就會被gc回收挚冤。而字符串字面量創(chuàng)建的字符串對象况增,因為常量池中還持有對該字符串的引用,則不會被回收你辣。這并不代表字符串池中的字符串永遠(yuǎn)不被回收巡通,字符串池提供有GC相關(guān)接口尘执,根據(jù)不同的GC策略,會在適當(dāng)?shù)臅r候回收
常量池
-
運行時常量池
屬于方法區(qū)的一部分
Java并不要求常量都必須在編譯期產(chǎn)生宴凉,運行期也可以產(chǎn)生新的常量誊锭,這些新的常量就被放在運行時常量池中
-
class常量池
- class文件結(jié)構(gòu)
class文件最前的四個字節(jié)立镶,用于存儲Magic Number俭厚,來確定這個class文件是否能夠被這個虛擬機所接受。接下來的4個字節(jié)用來存儲版本號歉秫,前兩個字節(jié)存儲次版本號籽暇,后兩個字節(jié)存儲主版本號温治。在這之后就是常量池的入口,開始的兩個字節(jié)為常量池容量計數(shù)器戒悠,記錄常量池中常量數(shù)量
* class常量池是class文件的資源倉庫
字面量:Java語言層面常量的概念熬荆,如文本字符串,聲明為final的常量值
符號引用量: 類和接口的 全限定 名绸狐、 字段名稱和描述符卤恳、方法名稱和描述符
intern
intern() 方法返回字符串對象的規(guī)范化表示形式
”string”.intern()方法的時候會返回”string”,但是這個方法會首先檢查字符串池中是否有”string”這個字符串寒矿,如果存在則返回這個字符串的引用突琳,否則就將這個字符串添加到字符串池中,然會返回這個字符串的引用
Java關(guān)鍵字
transient
表示變量不被序列化處理
-
序列化
- 序列化即對一個對象進行持久化處理符相,將對象轉(zhuǎn)換成字節(jié)流進行存儲和傳輸
-
反序列化
- 將一個序列化后的對象字節(jié)流轉(zhuǎn)換成其對應(yīng)對象是反序列化
instanceof
-
Java中的一個雙目運算符拆融,用來測試一個對象是否是屬于某一個類的實例
當(dāng)該對象是屬于該類創(chuàng)建的實例時返回 true
當(dāng)該對象不屬于該類所創(chuàng)建的實例時返回 false
volatile
-
可見性
- 可見性,是指線程之間的可見性啊终,一個線程修改的狀態(tài)對另一個線程是可見的镜豹。
-
問題
- 在多線程操作同一個變量時,實際上是在每個線程中開啟一塊緩存孕索,將該變量的值復(fù)制一份逛艰,緩存在當(dāng)前線程緩存中躏碳,這就無法確保執(zhí)行讀操作的線程能實時地看到其他線程寫入的值
-
作用
- 被volatile修飾的變量搞旭,當(dāng)一個線程修改了這個變量的值,volatile 保證了新值能立即同步到主內(nèi)存菇绵,且各個線程每次使用前都立即從主內(nèi)存刷新肄渗,即可實時看到其他線程實時更新值
synchronized
同步方法或同步代碼塊
synchronized取得的鎖都是對象鎖,synchronized塊之間具有互斥性咬最,支持重入翎嫡,不保證公平性,等待線程采用競爭方式獲取鎖永乌,發(fā)生異常時會自動釋放鎖
final
-
修飾類
該類不能被繼承
類中成員變量惑申,可以自行設(shè)置是否為final
類中成員方法隱式為final
-
修飾方法
- 該方法不能被重寫
-
修飾變量
必須初始化
初始化后不可更改
static
-
修飾內(nèi)部類
- 內(nèi)部類可直接通過外部類的類名調(diào)用具伍,不用需要創(chuàng)建外部類實例來調(diào)用
-
修飾方法
- 該方法從屬于該類,可以使用類名之間調(diào)用
-
修飾變量
- 靜態(tài)變量圈驼,屬于該類
-
修飾代碼塊
- 類被加載時人芽,該代碼塊會被執(zhí)行一次
const
- const是java中的預(yù)留關(guān)鍵字