日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaSE——常用类库(String类)

發布時間:2024/7/23 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSE——常用类库(String类) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第1節 常用類庫——String

因為String相對之前的類來說更加常用一些,所以對字符串類進行專門的整理。

1. 概述

String類表示字符串,Java中的所有字符串文字都實現為此類的實例。

字符串是不變的,它們的值在創建后無法更改 。因為它的創建是通過一個由private final修飾的byte數組value來實現的,一旦賦值,不可更改。


如果想要使用可變字符串,后面的StringBuffer和StringBuilder會介紹。

因為String對象是不可變的,所以可以共享它們。 這句話怎么理解?需要結合下面的賦值方式來理解。

2. String的兩種賦值方式:

  • 一種為直接賦值,因為一個字符串可以表示一個String類的對象,
String text = "123";
  • 第二種為通過關鍵字new調用String的構造方法賦值:
String text3 = new String("123");

先來看一段代碼,體會一下兩者的區別:

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在內存中存儲在永久代中(后續會介紹),該內存不會去進行GC,所以沒有必要給同樣的字符串分出兩塊地址,使用第一種賦值方式,并不會開辟出兩塊地址,而是會將兩個引用對象指向同一個地址 ,所以text和text2就是一樣的值,這就是共享的意思。 但是第二種賦值方式,使用new關鍵字強制地開辟了一塊內存,所以地址值不一樣。

給一張圖會更直觀一些,str1就是上述代碼的text3,str2和str3就是上述代碼的text和text2。

3. 字符串常量池

3.1 方法區(Method Area)

方法區(Method Area),又稱永久代(Permanent Generation),又稱非堆區(Non-Heap space)。

方法區是被所有線程共享的:

????- 所有字段和方法字節碼,以及一些特殊方法和構造函數,接口代碼也在此定義。簡單說,所有定義的方法的信息都保存在該區域,此區域屬于共享區間

????- 該區域存儲的是:靜態變量+常量+類信息(構造方法/接口定義)+運行時常量池。

但是,實例變量(對象)存在堆內存中,和方法區無關。

以上,只是邏輯上的定義,在HotSpot中,方法區僅僅只是邏輯上的獨立,實際上還是包含在Java堆中,也就是說,方法區在物理上屬于Java堆區中的一部分,而永久區(Permanent Generation)就是方法區的實現。

3.2 堆(heap)

一個JVM實例只存在一個堆內存,堆內存的大小是可以調節的。類加載器讀取了類文件后,需要把類、方法、常變量放到堆內存中,保存所有引用類型的真實信息,以方便執行器執行。

堆 在邏輯上分為三部分(Perm):

  • 新生代 (Young Generation,常稱為YoungGen):剛創建的內存存儲位置,頻繁地進行GC,若一個對象連續經過15次GC還沒有被回收,它就會被放到老年代。位于堆空間

????- Eden區 :存儲新創建的對象;

????- Survior區 (幸存區):存儲GC次數1~14次的對象。

  • 老年代 (Old Generation。常稱為OldGen、TenuringGen):GC的頻次較低,位于堆空間

  • 永久代 (Permanent Generation,常稱為PermGen):是一個常駐內存區域,用于存放JDK自身所攜帶的Class、Interface的元數據,也就是說它存儲的是運行環境必須的類信息,被裝在進此區域的數據是不會被垃圾回收器回收的,關閉JVM才會釋放此區域所占用的內存。(不進行GC,類、方法、常量、靜態修飾的內容都會放在永久代位于非堆空間。

4. 構造方法

最常用的當然還是直接給一個字符串而不是用構造器。

此外還需要注意三個構造方法:

1、構造一個新的String并用指定的解碼集解碼,讀入不同集的字符串會需要。

2、3:用一個StringBuffer或StringBuilder對象來構造String,這個可以實現StringBuffer或StringBuilder到String類的轉變。

5. 各種方法

String類的方法很多。。。

1、返回指定索引處的char值,這還是很常用的,因為Java字符串不能像數組一樣使用[索引]來訪問,charAt方法就是替代。IntStream類先跳過,沒學過。

2、返回Unicode的方法,目前還沒用過。

3、按字典順序比較兩個字符串,不用多解釋。

4、拼接字符串,返回拼接后的結果。

5、功能很明確

6、字符串與字符序列或StringBuffer比較是否相等。

7、判斷字符串是否以指定的后綴結尾。

8、比較是否相等

9、指定的格式字符串和參數返回格式化字符串,沒用過。

10、將字符串變為數組

11、返回字符串的哈希碼

12、返回字符第一次出現的索引

13、啥是規范表示?

14、判斷字符串是否為空

15、將字符序列按照指定的連接符拼接為字符串,這個很常用

16、返回字符最后一次出現的索引

17、返回字符串的長度,常用

18、現在不懂

19、判斷字符串是否與指定的正則表達式匹配,沒用過

20、不懂

21、判斷兩個字符串區域是否相等

22、返回該字符串重復了count次的字符串

23、字符串替換

24、字符串拆分,按照指定的拆分符

25、判斷字符串是否以指定前綴開頭

26、去除頭尾的空格

27、取子字符串

28、將字符串轉為字符數組

29、大小寫

30、和strip類似,去除的不只空格

31、將數據類型轉為字符串,注意是靜態方法,直接用類名調用

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);} }

它在內存中的細節如下圖所示:

通過“+”運算符會產生很多中間字符串,而且沒有引用,另外因為字符串是存在字符串常量池,也就是在永久代中的, 所以GC不會來回收它們,這樣就導致了一個嚴重的問題,內存占用過大

7. StringBuffer、StringBuilder類

為了解決上述的問題,就需要用到另外兩個類StringBuffer和StringBuilder。這兩個都是長度、內容可變的字符序列類型,字符串緩沖區類似于String,但是可以進行修改。它們兩個方法上上很相似,主要區別是:StringBuffer是線程安全的,StringBuilder是線程不安全的,單個線程情況下,StringBuilder更快,線程的問題后續再介紹。

7.1 構造方法

兩者是一樣的,重點關注將String類直接轉為相應的類的構造方法。

7.2 方法

最常用的就是append和insert方法,插入新數據:

有加入就有刪除:

還有設置:

注意獲取長度是capacity:

還有一個需要特別記憶,翻轉操作,String類沒有:

還有一個需要特別注意,它們的toString方法已經被重寫,調用toString直接將這兩類轉為String返回:

其他的方法很多String類的都有。

看一個簡單例子:

package com.kaikeba.coreclasslibrary.string;public class Demo2 {public static void main(String[] args) {//線程不安全的實現StringBuilder sb = new StringBuilder();//StringBuffer 線程安全的實現sb.append("1");sb.append("2");sb.append("3");String text = sb.toString();System.out.println(text);} }結果為: 123

總結

以上是生活随笔為你收集整理的JavaSE——常用类库(String类)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。