java中String型別的相關知識總結
一、常用方法:
1.構造方法:
-
byte陣列
-
可指定offset和length
-
可指定charset
-
-
char陣列
- 可指定offset和count
-
字符序列
- String
- StringBuffer
- StrngBuilder
2. 實體方法:
- 獲取字符/碼點/位元組
? charAt(int index) char
? codePointAt(int index) int
? getBytes() byte[]
? getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) void
? toCharArray() char[]
- 長度
? length() int
? codePointCount(int beginIndex,int endIndex) int
- 字串操作
? concat(String str) String
? substring(int beginIndex,int endIndex) String
? split(String regex) String[]
? trim() String
? toUpperCase()/toLowerCase String
? replace(char oldChar,char newChar) String
? replace(CharSequence target,CharSquence replacement) String
? replaceAll(String regex,String replacement) String
? replaceFirst(String regex,String replacement) String
- 判斷
? contains(CharSequence s) boolean
? endsWith(String suffix)/startsWith(String prefix) boolean
? equals(Object anObject) boolean
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
? matches(String regex) boolean
- 序號
? indexOf(int ch/String str)/lastIndexOf()
3. 靜態方法:
? String.format(String format,Obect... args) String
? String.valueOf(xxx) String
二、底層實作:
jdk1.8中String型別底層就是一個char陣列:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
三、不可變性:
String最為人所津津樂道的便是它的不可變性(immutable),這里就引出兩個問題,String如何做到不可變的,以及不可變的好處
1. 如何實作不可變:
jdk1.8中String的字符存盤在一個char陣列里
- char陣列final,不可變
- 沒有提供任何可以修改陣列內容的方法
2. 不可變的好處:
- 不可變,執行緒絕對安全
- 作為引數不可變,更安全
- 字串常量池的需要,可以共享而不用擔心被誰改變
- hash值不可變,只要算一次,可以快取hash
3. String和StringBuffer和StringBuilder的區別:
-
String不可變,執行緒安全
-
StringBuffer可變,執行緒安全
-
StringBuilder可變,執行緒不安全
四、快取池:
1.字串常量池(String pool)里存放著所有的字串字面量
String a="aaa";
String b="aaa";
//a,b參考到的String pool里的同一個物件
a==b//true
2. new 出來的String物件放在堆區
String a=new String("aaa");
String b=new String("aaa");
a==b//false
a=="aaa"//false
//這里實際是先創建字面量"aaa",再去創建物件的
new創建字串時首先查看池中是否有相同值的字串,如果有,則拷貝一份到堆中,然后回傳堆中的地址;如果池中沒有,則在堆中創建一份,然后回傳堆中的地址(注意,此時不需要從堆中復制到池中,否則,將使得堆中的字串永遠是池中的子集,導致浪費池的空間)!
-
關于
String str=new String("123")創建了幾個物件的問題? 很顯然,new只呼叫了一次,也就是說只創建了一個物件,而這道題目讓人混淆的地方就是這里,這段代碼在運行期間確實只創建了一個物件,即在堆上創建了"abc"物件,而為什么大家都在說是2個物件呢,這里面要澄清一個概念,該段代碼執行程序和類的加載程序是有區別的,在類加載的程序中,確實在運行時常量池中創建了一個"abc"物件,而在代碼執行程序中確實只創建了一個String物件(堆上),
-
public String(String original) { this.value = https://www.cnblogs.com/legolas-PRC/archive/2023/01/07/original.value; this.hash = original.hash; }
3. intern()方法
先判斷字串常量池里是否已經有了這個字串,如果有就回傳常量池中該字串的參考,沒有就在常量池中添加并回傳常量池中的參考,
String a=new String("aaa");
a=="aaa"//false
a=a.intern()
a=="aaa"//true
五、參考資料
- 深入理解Java中的String - 平凡希 - 博客園 (cnblogs.com)
- 《java核心技術卷Ⅰ》
- Java 基礎 - 知識點 | Java 全堆疊知識體系 (pdai.tech)
鄙人只是一名在讀的軟體工程專業的本科生,正在復習找作業,故而將復習時遇到的一些有意思的東西總結出來,既是加深理解,也是便于日后復習,
鄙人才疏學淺,若文中有謬誤之處,還望諸位不吝斧正,以免誤人子弟,若有同道中人想一同討論學習,也可以聯系我=>[email protected],未經作者允許,請勿轉載!
路漫漫其修遠兮,吾將上下而求索,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541424.html
標籤:其他
上一篇:客服系統即時通訊IM開發(三)訪客實作一對一聊天-訪客生成唯一id標識存盤到全域變數【唯一客服】網站在線客服系統
