String
String 類代表字符串。字符串是常量;它們的值在創(chuàng)建之后不能更改。
String的方法
.equals
很多人經(jīng)常把.equals和==混淆。==用來比較是否是同一對象, .equals 用來比較內(nèi)容是否相同。 接下來我們用代碼來驗證一下兩者的區(qū)別。
運行如下代碼:
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)過上面的驗證,相信你對 equals 方法有了一定的理解。我們再來看看 equals 的底層實現(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判斷驗證是否是同一個對象,如果是內(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): 告知此字符串是否匹配給定的正則表達式。
(6)replace(char oldChar, char newChar):返回一個新的字符串,它是通過用 newChar 替換此字符串中出現(xiàn)的所有 oldChar 得到的。
(7)split(String regex):根據(jù)給定正則表達式的匹配拆分此字符串。
(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為負數(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為負數(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 對象的實質(zhì)是生成新的 String 對象存放修改后的字符串。所以對于需要經(jīng)常修改的字符串,建議使用 StringBuffer 和 StringBuilder 。
而 StringBuilder 作為JDK 5為 StringBuffer 補充的一個單個線程使用的等價類,有一個與 StringBuffer 兼容的 API ,且在單線程中效率更高。
但 StringBuffer 在多線程的情況下比 StringBuilder 更安全。