一、compareTo
- 當(dāng)兩個(gè)比較的字符串相等時(shí)
1.1 兩個(gè)字符相等,則返回0
String a = "abc";
String b = "abc";
System.out.println(a.compareTo(b)); // 0
- 當(dāng)兩個(gè)比較的字符串是英文且長(zhǎng)度不等時(shí)
2.1 長(zhǎng)度短的與長(zhǎng)度長(zhǎng)的前面的字符一樣,則返回的結(jié)果是兩個(gè)長(zhǎng)度相減的值
String a = "abc";
String b = "ab";
System.out.println(a.compareTo(b)); // 1
String c = "h";
String d = "hello";
System.out.println(c.compareTo(d)); // -4
2.2 長(zhǎng)度不一樣且前幾個(gè)字符也不一樣,從第一位開(kāi)始找,當(dāng)找到不一樣的字符時(shí),則返回的值是這兩個(gè)字符比較的值
String a = "acsdf";
String b = "add";
System.out.println(a.compareTo(b)); // -1
- 當(dāng)兩個(gè)比較的字符串是英文且長(zhǎng)度相等時(shí)
3.1 一個(gè)字符,則返回的值是這兩個(gè)字符比較的值
String a = "a"; // 97
String b = "b"; // 98
System.out.println(a.compareTo(b)); // -1
3.2 多個(gè)字符,第一個(gè)字符相同則直接比較第二個(gè)字符,以此類(lèi)推
String a = "abc"; // a = 97
String b = "ebc"; // b = 101
System.out.println(a.compareTo(b)); // -4
String c = "bce"; // b = 101
String d = "bca"; // a = 97
System.out.println(c.compareTo(d)); // 4
二、concat
源碼
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
分析
- value為String內(nèi)部維護(hù)的一個(gè)字符數(shù)組,用來(lái)存儲(chǔ)String的值
- 首先判斷需要拼接的字符串是否長(zhǎng)度為0,若為0則返回預(yù)原字符串
String a = "i am ";
String result = a.concat("");
System.out.println(result); // i am
- 使用Arrays.copyOf方法將value復(fù)制到buf,且buf長(zhǎng)度擴(kuò)充為原字符串和新字符串長(zhǎng)度之和
- 使用String的getChars方法將str的字符全部復(fù)制到buf索引len(即原字符串之后),完成拼接
- 返回新的字符串
String a = "i am ";
String result = a.concat("zach");
System.out.println(result); // i am zach
三、equals
equals 方法既然是基類(lèi) Object 的方法,我們創(chuàng)建的所有的對(duì)象都擁有這個(gè)方法,并有權(quán)利去重寫(xiě)這個(gè)方法。該方法返回一個(gè) boolean 值,代表比較的兩個(gè)對(duì)象是否相同,這里的相同的條件由重寫(xiě) equals 方法的類(lèi)來(lái)解決。
String str1 = "abc";
String str2 = "abc";
str1.equals(str2);//true
顯然 String 類(lèi)一定重寫(xiě)了 equals 方法否則兩個(gè) String 對(duì)象內(nèi)存地址肯定不同。
public boolean equals(Object anObject) {
//首先判斷兩個(gè)對(duì)象的內(nèi)存地址是否相同
if (this == anObject) {
return true;
}
// 判斷連個(gè)對(duì)象是否屬于同一類(lèi)型。
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
//長(zhǎng)度相同的情況下逐一比較 char 數(shù)組中的每個(gè)元素是否相同
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;}
四、join
在Java 8中,我們?cè)贘ava字符串類(lèi)中有一個(gè)新的方法join()。Java String.join()方法連接給定的字符串并返回連接后的字符串。
public static String join(分隔符, 字符序列... elements)
返回分隔符和字符序列元素連接在一起的字符串。
例:
String message = String.join("-", "This", "is", "a", "String");
System.out.println(message); // "This-is-a-String"
// 注意,如果元素為空,則添加“”。
String message2 = String.join("", "a", "b", "c", "d");
System.out.println(message2); // abcd
例:join()方法通過(guò)分隔符連接列表的元素。
List<String> list = new ArrayList<String>();
list.add("s1");
list.add("s3");
list.add("s5");
list.add("s7");
System.out.println(String.join("-", list)); // s1-s3-s5-s7
五、其他
split
- split(String regex):它根據(jù)分隔正則表達(dá)式將輸入字符串拆分后返回字符串?dāng)?shù)組。
- split(String regex, int limit):當(dāng)我們想要限制子字符串時(shí),使用這個(gè)Java字符串分割方法。這個(gè)方法和上面的方法的唯一區(qū)別是它限制了分割后返回的字符串的數(shù)量。例如split("any delimiter", 3)將返回只有3個(gè)字符串的數(shù)組,即使分隔符在字符串中出現(xiàn)超過(guò)3次。
- 如果限制是負(fù)的,那么返回的數(shù)組將有盡可能多的子字符串,但是當(dāng)限制是零,那么返回的數(shù)組將有所有的子字符串,不包括尾部的空字符串。
- 如果指定的正則表達(dá)式的語(yǔ)法無(wú)效,則拋出PatternSyntaxException異常。
public static void main(String args[]){
String str = new String("28/12/2013");
System.out.println("split(String regex):");
String array1[]= str.split("/");
for (String temp: array1){
System.out.println(temp);
}
System.out.println("-----------------------------------------------------");
System.out.println("split(String regex, int limit) with limit=2:");
String array2[]= str.split("/", 2);
for (String temp: array2){
System.out.println(temp);
}
System.out.println("-----------------------------------------------------");
System.out.println("split(String regex, int limit) with limit=0:");
String array3[]= str.split("/", 0);
for (String temp: array3){
System.out.println(temp);
}
System.out.println("-----------------------------------------------------");
System.out.println("split(String regex, int limit) with limit=-5:");
String array4[]= str.split("/", -5);
for (String temp: array4){
System.out.println(temp);
}
}
輸出結(jié)果:
split(String regex):
28
12
2013
split(String regex, int limit) with limit=2:
28
12/2013
split(String regex, int limit) with limit=0:
28
12
2013
split(String regex, int limit) with limit=-5:
28
12
2013
- 在java字符串分割方法中0和負(fù)限制之間的差異:
在上面的例子中,split(" / ",0)和split(" / ",-5)返回相同的值,但是在某些情況下結(jié)果會(huì)不同。讓我們通過(guò)一個(gè)例子來(lái)看看這兩者的區(qū)別:
String s="bbaaccaa";
String arr1[]= s.split("a", -1);
String arr2[]= s.split("a", 0);
輸出結(jié)果:
{"bb","","cc","",""}
{"bb","","cc"}
- 用多個(gè)分隔符(特殊字符)分隔Java字符串:
讓我們看看在使用split()方法時(shí)如何傳遞多個(gè)分隔符。在本例中,我們將根據(jù)多個(gè)特殊字符分割輸入字符串。
public static void main(String args[]){
String s = " ,ab;gh,bc;pq#kk$bb";
String[] str = s.split("[,;#$]");
//Total how many substrings? The array length
System.out.println("Number of substrings: "+str.length);
for (int i=0; i < str.length; i++) {
System.out.println("Str["+i+"]:"+str[i]);
}
}
輸出結(jié)果:
Number of substrings: 7
Str[0]:
Str[1]:ab
Str[2]:gh
Str[3]:bc
Str[4]:pq
Str[5]:kk
Str[6]:bb
trim
它從輸入字符串中刪除前導(dǎo)和尾空格后返回一個(gè)字符串。如。" Hello "trim()將返回字符串"Hello"。
public class JavaExample{
public static void main(String args[]){
String str = new String(" How are you?? ");
System.out.println("String before trim: "+str);
System.out.println("String after trim: "+str.trim());
}
}
輸出結(jié)果:
String before trim: (空格) (空格)(空格)(空格) How are you??(空格)(空格)(空格)(空格)
String after trim: How are you??
isEmpty
方法的作用是:檢查字符串是否為空。如果給定字符串為空,此方法返回true,否則返回false。換句話(huà)說(shuō),如果字符串的長(zhǎng)度為0,你可以說(shuō)這個(gè)方法返回true。
public class Example{
public static void main(String args[]){
//empty string
String str1="";
//non-empty string
String str2="hello";
//prints true
System.out.println(str1.isEmpty());
//prints false
System.out.println(str2.isEmpty());
}
}
正如我們?cè)谏厦娴氖纠锌吹降模琲sEmpty()方法只檢查字符串是否為空。如果您希望檢查字符串是null還是都為空,那么可以按照下面的示例進(jìn)行檢查。
public class Example{
public static void main(String args[]){
String str1 = null;
String str2 = "beginnersbook";
if(str1 == null || str1.isEmpty()){
System.out.println("String str1 is empty or null");
}
else{
System.out.println(str1);
}
if(str2 == null || str2.isEmpty()){
System.out.println("String str2 is empty or null");
}
else{
System.out.println(str2);
}
}
}
輸出結(jié)果:
String str1 is empty or null
beginnersbook