JavaSE——常用类库(String类)
第1節(jié) 常用類庫——String
因為String相對之前的類來說更加常用一些,所以對字符串類進行專門的整理。
1. 概述
String類表示字符串,Java中的所有字符串文字都實現(xiàn)為此類的實例。字符串是不變的,它們的值在創(chuàng)建后無法更改 。因為它的創(chuàng)建是通過一個由private final修飾的byte數(shù)組value來實現(xiàn)的,一旦賦值,不可更改。
如果想要使用可變字符串,后面的StringBuffer和StringBuilder會介紹。
因為String對象是不可變的,所以可以共享它們。 這句話怎么理解?需要結合下面的賦值方式來理解。
2. String的兩種賦值方式:
- 一種為直接賦值,因為一個字符串可以表示一個String類的對象,
- 第二種為通過關鍵字new調(diào)用String的構造方法賦值:
先來看一段代碼,體會一下兩者的區(qū)別:
package com.kaikeba.coreclasslibrary.string;public class Demo {public static void main(String[] args) {String text = "123";String text2 = "123";String text3 = new String("123");System.out.println(text == text2);System.out.println(text == text3);} }結果為: true false這里就用到了1中說的因為String對象是不可變的,所以可以共享它們。
因為String在內(nèi)存中存儲在永久代中(后續(xù)會介紹),該內(nèi)存不會去進行GC,所以沒有必要給同樣的字符串分出兩塊地址,使用第一種賦值方式,并不會開辟出兩塊地址,而是會將兩個引用對象指向同一個地址 ,所以text和text2就是一樣的值,這就是共享的意思。 但是第二種賦值方式,使用new關鍵字強制地開辟了一塊內(nèi)存,所以地址值不一樣。
給一張圖會更直觀一些,str1就是上述代碼的text3,str2和str3就是上述代碼的text和text2。
3. 字符串常量池
3.1 方法區(qū)(Method Area)
方法區(qū)(Method Area),又稱永久代(Permanent Generation),又稱非堆區(qū)(Non-Heap space)。
方法區(qū)是被所有線程共享的:
????- 所有字段和方法字節(jié)碼,以及一些特殊方法和構造函數(shù),接口代碼也在此定義。簡單說,所有定義的方法的信息都保存在該區(qū)域,此區(qū)域?qū)儆?strong>共享區(qū)間 。
????- 該區(qū)域存儲的是:靜態(tài)變量+常量+類信息(構造方法/接口定義)+運行時常量池。
但是,實例變量(對象)存在堆內(nèi)存中,和方法區(qū)無關。
以上,只是邏輯上的定義,在HotSpot中,方法區(qū)僅僅只是邏輯上的獨立,實際上還是包含在Java堆中,也就是說,方法區(qū)在物理上屬于Java堆區(qū)中的一部分,而永久區(qū)(Permanent Generation)就是方法區(qū)的實現(xiàn)。
3.2 堆(heap)
一個JVM實例只存在一個堆內(nèi)存,堆內(nèi)存的大小是可以調(diào)節(jié)的。類加載器讀取了類文件后,需要把類、方法、常變量放到堆內(nèi)存中,保存所有引用類型的真實信息,以方便執(zhí)行器執(zhí)行。
堆 在邏輯上分為三部分(Perm):
- 新生代 (Young Generation,常稱為YoungGen):剛創(chuàng)建的內(nèi)存存儲位置,頻繁地進行GC,若一個對象連續(xù)經(jīng)過15次GC還沒有被回收,它就會被放到老年代。位于堆空間 。
????- Eden區(qū) :存儲新創(chuàng)建的對象;
????- Survior區(qū) (幸存區(qū)):存儲GC次數(shù)1~14次的對象。
-
老年代 (Old Generation。常稱為OldGen、TenuringGen):GC的頻次較低,位于堆空間 。
-
永久代 (Permanent Generation,常稱為PermGen):是一個常駐內(nèi)存區(qū)域,用于存放JDK自身所攜帶的Class、Interface的元數(shù)據(jù),也就是說它存儲的是運行環(huán)境必須的類信息,被裝在進此區(qū)域的數(shù)據(jù)是不會被垃圾回收器回收的,關閉JVM才會釋放此區(qū)域所占用的內(nèi)存。(不進行GC,類、方法、常量、靜態(tài)修飾的內(nèi)容都會放在永久代 )位于非堆空間。
4. 構造方法
最常用的當然還是直接給一個字符串而不是用構造器。
此外還需要注意三個構造方法:
1、構造一個新的String并用指定的解碼集解碼,讀入不同集的字符串會需要。
2、3:用一個StringBuffer或StringBuilder對象來構造String,這個可以實現(xiàn)StringBuffer或StringBuilder到String類的轉(zhuǎn)變。
5. 各種方法
String類的方法很多。。。
1、返回指定索引處的char值,這還是很常用的,因為Java字符串不能像數(shù)組一樣使用[索引]來訪問,charAt方法就是替代。IntStream類先跳過,沒學過。
2、返回Unicode的方法,目前還沒用過。
3、按字典順序比較兩個字符串,不用多解釋。
4、拼接字符串,返回拼接后的結果。
5、功能很明確
6、字符串與字符序列或StringBuffer比較是否相等。
7、判斷字符串是否以指定的后綴結尾。
8、比較是否相等
9、指定的格式字符串和參數(shù)返回格式化字符串,沒用過。
10、將字符串變?yōu)閿?shù)組
11、返回字符串的哈希碼
12、返回字符第一次出現(xiàn)的索引
13、啥是規(guī)范表示?
14、判斷字符串是否為空
15、將字符序列按照指定的連接符拼接為字符串,這個很常用 。
16、返回字符最后一次出現(xiàn)的索引
17、返回字符串的長度,常用
18、現(xiàn)在不懂
19、判斷字符串是否與指定的正則表達式匹配,沒用過
20、不懂
21、判斷兩個字符串區(qū)域是否相等
22、返回該字符串重復了count次的字符串
23、字符串替換
24、字符串拆分,按照指定的拆分符
25、判斷字符串是否以指定前綴開頭
26、去除頭尾的空格
27、取子字符串
28、將字符串轉(zhuǎn)為字符數(shù)組
29、大小寫
30、和strip類似,去除的不只空格
31、將數(shù)據(jù)類型轉(zhuǎn)為字符串,注意是靜態(tài)方法,直接用類名調(diào)用
6. 字符串拼接問題
觀察如下代碼:
package com.kaikeba.coreclasslibrary.string;public class Demo {public static void main(String[] args) {String t1 = "鋤禾日當午";String t2 = "汗滴禾下土";String t3 = "床前明月光";t1 = t1+t2+t3;System.out.println(t1);} }它在內(nèi)存中的細節(jié)如下圖所示:
通過“+”運算符會產(chǎn)生很多中間字符串,而且沒有引用,另外因為字符串是存在字符串常量池,也就是在永久代中的, 所以GC不會來回收它們,這樣就導致了一個嚴重的問題,內(nèi)存占用過大 。
7. StringBuffer、StringBuilder類
為了解決上述的問題,就需要用到另外兩個類StringBuffer和StringBuilder。這兩個都是長度、內(nèi)容可變的字符序列類型,字符串緩沖區(qū)類似于String,但是可以進行修改。它們兩個方法上上很相似,主要區(qū)別是:StringBuffer是線程安全的,StringBuilder是線程不安全的,單個線程情況下,StringBuilder更快,線程的問題后續(xù)再介紹。
7.1 構造方法
兩者是一樣的,重點關注將String類直接轉(zhuǎn)為相應的類的構造方法。
7.2 方法
最常用的就是append和insert方法,插入新數(shù)據(jù):有加入就有刪除:
還有設置:
注意獲取長度是capacity:
還有一個需要特別記憶,翻轉(zhuǎn)操作,String類沒有:
還有一個需要特別注意,它們的toString方法已經(jīng)被重寫,調(diào)用toString直接將這兩類轉(zhuǎn)為String返回:
其他的方法很多String類的都有。
看一個簡單例子:
package com.kaikeba.coreclasslibrary.string;public class Demo2 {public static void main(String[] args) {//線程不安全的實現(xiàn)StringBuilder sb = new StringBuilder();//StringBuffer 線程安全的實現(xiàn)sb.append("1");sb.append("2");sb.append("3");String text = sb.toString();System.out.println(text);} }結果為: 123總結
以上是生活随笔為你收集整理的JavaSE——常用类库(String类)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python图片显示中文
- 下一篇: Relu神经网络输出预测全为0或1,对所