String
String 類代表字符串耀怜。字符串是常量;它們的值在創(chuàng)建之后不能更改桐愉。
String的方法
.equals
很多人經(jīng)常把.equals和==混淆财破。==用來比較是否是同一對象, .equals 用來比較內(nèi)容是否相同从诲。 接下來我們用代碼來驗(yàn)證一下兩者的區(qū)別左痢。
運(yùn)行如下代碼:
String abc = "abc" + "bcd";// 常量
String bcd = "bcd";
String abc1 = "abc" + bcd;// 不是常量
if (abc == abc1) {
System.out.println("同一個對象");
} else {
System.out.println("不同對象");
}
if (abc.equals(abc1)) {
System.out.println("內(nèi)容相同");
} else {
System.out.println("內(nèi)容不同");
}
結(jié)果:
不同對象
內(nèi)容相同
經(jīng)過上面的驗(yàn)證,相信你對 equals 方法有了一定的理解系洛。我們再來看看 equals 的底層實(shí)現(xiàn):
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;
}
這里第一個if判斷驗(yàn)證是否是同一個對象俊性,如果是內(nèi)容必定相等,返回true描扯;第二個則是用來判斷內(nèi)容是否相同定页。
其他常用方法
String還有一些其他的常用方法,下面給大家羅列一下:
1.構(gòu)造方法
String的構(gòu)造方法可以放入 byte 數(shù)組绽诚,char 數(shù)組典徊,StringBuffer杭煎, StringBuilder 等參數(shù),構(gòu)造器會自動將其轉(zhuǎn)換成String類型宫峦,非常方便岔帽。如:String(char[] value)
可以分配一個新的 String ,使其表示字符數(shù)組參數(shù)中當(dāng)前包含的字符序列导绷。
2.方法摘要
(1)charAt(int index)
:返回指定索引處的char值犀勒。
(2)compareTo(String anotherString)
:按字典順序比較兩個字符串。 可用于字符串排序妥曲。
(3)isEmpty()
:當(dāng)且僅當(dāng) length() 為 0 時返回 true贾费。經(jīng)常用到的判定條件。
(4)length()
:返回此字符串的長度檐盟。
(5)matches(String regex)
: 告知此字符串是否匹配給定的正則表達(dá)式褂萧。
(6)replace(char oldChar, char newChar)
:返回一個新的字符串,它是通過用 newChar 替換此字符串中出現(xiàn)的所有 oldChar 得到的葵萎。
(7)split(String regex)
:根據(jù)給定正則表達(dá)式的匹配拆分此字符串导犹。
(8)startsWith(String prefix)
:測試此字符串是否以指定的前綴開始。經(jīng)常用的判定條件羡忘。
(9)substring(int beginIndex)
:返回一個新的字符串谎痢,它是此字符串的一個子字符串。截取字符串時使用卷雕,參數(shù)是開始截取的位置节猿。
(10)substring(int beginIndex, int endIndex)
: 截取字符串時使用,參數(shù)是開始截取的位置和結(jié)束位置漫雕,左閉右開滨嘱。
(11)toCharArray()
: 將此字符串轉(zhuǎn)換為一個新的字符數(shù)組。
(12)toString()
: 返回此對象本身(它已經(jīng)是一個字符串=洹)太雨。
(13)valueOf(各種類型參數(shù))
: 返回各種類型參數(shù)的字符串表示形式。
StringBuffer
StringBuffer 是線程安全的可變字符序列发框。一個類似于 String 的字符串緩沖區(qū)躺彬,正常來說它的初始容量為 16 個字符,如果后來需要更多容量梅惯,它會另外開辟更大的空間,將原來的字符轉(zhuǎn)存到新的空間中仿野。 StringBuffer用在多種數(shù)據(jù)類型的拼接和若干次拼接铣减,效率更高,內(nèi)存更節(jié)省
構(gòu)造方法
StringBuffer 最常使用的構(gòu)造方法有兩種一種是StringBuffer()
脚作,只是創(chuàng)建 16 個字符的緩沖區(qū)葫哗;另一種是StringBuffer(String str)
缔刹,它不僅構(gòu)造了一個字符串緩沖區(qū),還會將參數(shù) str 初始化為指定的字符串內(nèi)容劣针。
常用方法
StringBuffer 常用的方法有:追加校镐、插入、刪除捺典、修改等鸟廓。
追加
使用 append 方法在最后添加。
插入
使用 insert 方法在指定位置添加襟己。
刪除
使用 delete 方法刪除指定區(qū)域引谜,左閉右開。end多大都不會越界擎浴,只有start為負(fù)數(shù)员咽,大于長度或大于end時報錯。
修改
使用 replace 方法將指定區(qū)域的字符替換成新字符串贮预,左閉右開贝室。
代碼
public class Main {
public static void main(String[] args) {
// StringBuffer是一個將字符數(shù)組封裝起來的類
StringBuffer sb = new StringBuffer("abc");
// 追加
sb.append("a");
System.out.println(sb);
// 插入
sb.insert(2,"Java");
System.out.println(sb);
// 刪除
sb.delete(2,6);
// sb.delete(2,100); 沒有越界,只有start為負(fù)數(shù)仿吞,大于長度或大于end時報錯
System.out.println(sb);
// 修改
sb.replace(2,3,"Java");
System.out.println(sb);
// StringBuffer 轉(zhuǎn)成String
// 方式一:
String string = sb.toString();
// 方式二:
String string1 = new String(sb);
}
}
StringBuilder
一個可變的字符序列滑频。此類提供一個與 StringBuffer 兼容的 API,但不保證同步茫藏。在單線程比StringBuffer更快误趴。
由于 API 與 StringBuffer 兼容,方法是一樣的务傲,不再贅述凉当。
區(qū)別
String 是不可以改變的,更改 String 對象的實(shí)質(zhì)是生成新的 String 對象存放修改后的字符串售葡。所以對于需要經(jīng)常修改的字符串看杭,建議使用 StringBuffer 和 StringBuilder 。
而 StringBuilder 作為JDK 5為 StringBuffer 補(bǔ)充的一個單個線程使用的等價類挟伙,有一個與 StringBuffer 兼容的 API 楼雹,且在單線程中效率更高。
但 StringBuffer 在多線程的情況下比 StringBuilder 更安全尖阔。