Java有哪些操作字符串的類?區(qū)別在哪?
操作字符串的類都有哪些?區(qū)別是什么?
操作字符串的類主要用三個,分別是String類,StringBuffer類和StringBuilder類.
不可變字符串
String類
public class StringTest {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2); // true
System.out.println(s2 == s3); // false
s2 = "abc" + "def";
System.out.println(s1 == s2); // false
String s4 = "abcdef";
System.out.println(s4 == s2); // true
}
}
1.當使用=對String類初始化的時候,會在常量池創(chuàng)建對象,將引用s1指向常量池中的地址.
2.創(chuàng)建s2的時候,會先在常量池中檢查是否有"abc"的對象,如果有則直接將s2指向常量池中的"abc".所以s1和s2指向的是相同的對象.
3.使用new關(guān)鍵字創(chuàng)建String對象的時候,會在堆空間中開辟一塊內(nèi)存,然后在堆中對s3進行初始化,s3指向的是堆內(nèi)存空間中的一塊區(qū)域.
4.當我們對s2進行修改的時候,其實是在常量池中添加了新的對象"abcdef",此時我們創(chuàng)建新的對象s4會和創(chuàng)建s2的步驟相同.s4在常量池中找到了"abcdef",所以直接指向這個對象.
當我們對String類型的變量進行操作的時候,其實每次改變都是創(chuàng)建除了新的對象.
可變字符串
StringBuffer和StringBuilder類中都提供了增刪字符串的方法,下面展示一個在原始對象上增加新的字符的示例.
public class StringTest2 {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb1.hashCode()); // 460141958
System.out.println(sb2.hashCode()); // 1163157884
sb1.append("def");
sb2.append("def");
System.out.println(sb1.hashCode()); // 460141958
System.out.println(sb2.hashCode()); // 1163157884
}
}
通過這個例子我們能清晰看到,s1和s2在增加元素前后仍舊是同一個對象.
StringBuffer和StringBuilder都繼承了AbstractStringBuilder類.
StringBuffer類
和StringBuilder類對比發(fā)現(xiàn),StringBuffer類中的方法沒有使用synchronized 關(guān)鍵字進行修飾.
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuilder類
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
AbstractStringBuilder類的append方法
擴容方法:調(diào)用ensureCapacityInternal()方法檢查初始char[] value空間是否足夠,如果不夠的話,就進行擴容操作.
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
// 查看空間是否足夠
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
// 如果空間不夠就重新開辟一塊新的空間
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
copyOf方法:重新創(chuàng)建一個新的char數(shù)組然后將原數(shù)組數(shù)據(jù)拷貝到新數(shù)組去.
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
小結(jié)
Java操作字符串的類主要有三個,分別是String類,StringBuffer類和StringBuilder類.這三個類的底層都是以char[]形式保存字符串對象的.他們之間的區(qū)別主要體現(xiàn)在:
1.String類型進行修改操作之后相當于重新創(chuàng)建對象,StringBuffer和StringBuilder進行增刪操作都是針對同一個對象.
2.StringBuffer中的大部分方法都沒有使用synchronized關(guān)鍵字修飾,所以性能更高(我刷題的時候也都是寫這個).單線程情況下首選使用StringBuffer類,多線程環(huán)境下需要使用StringBuilder類保證線程安全.
3.如果字符串聲明之后不需要進行改動,則直接聲明String類是最好的選擇,不使用new關(guān)鍵字聲明String對象時,它不會再堆內(nèi)存中開辟空間,而是直接指向String常量池.這樣可以實現(xiàn)復(fù)用,降低資源消耗.
擴展閱讀
Java基礎(chǔ)系列第一彈之方法重載和方法重寫的區(qū)別
Java基礎(chǔ)系列第二彈之Java多態(tài)成員訪問的特點
到此這篇關(guān)于Java有哪些操作字符串的類?區(qū)別在哪?的文章就介紹到這了,更多相關(guān)Java操作字符串的類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解
這篇文章主要介紹了Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解,Exchanger是一個用于線程間協(xié)作的工具類,Exchanger用于進行線程間的數(shù)據(jù)交 換,它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數(shù)據(jù),需要的朋友可以參考下2023-12-12
Springboot如何通過filter修改Header的值
這篇文章主要介紹了Springboot如何通過filter修改Header的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
tomcat啟動完成執(zhí)行 某個方法 定時任務(wù)(Spring)操作
這篇文章主要介紹了tomcat啟動完成執(zhí)行 某個方法 定時任務(wù)(Spring)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
java 重載(overload)與重寫(override)詳解及實例
這篇文章主要介紹了java 重載(overload)與重寫(override)詳解及實例的相關(guān)資料,并附實例代碼,需要的朋友可以參考下2016-10-10

