Java String 是其中一個最廣泛使用的類。Java String 類定義在 java.lang
包中。
Java String
- 基本上,字符串是一系列字符,但它不是原始類型。
- 當我們在 Java 中創建一個字符串時,它實際上創建了一個 String 類型的對象。
- String 是不可變對象,這意味著一旦創建就無法更改。
- String 是 Java 中唯一支持運算符重載的類。我們可以使用 + 運算符連接兩個字符串。例如
"a"+"b"="ab"
。 - Java 提供了兩個用於字符串操作的有用類 – StringBuffer 和 StringBuilder。
讓我們繼續學習更多關於 Java String 類的知識。
創建字符串的不同方法
在 Java 中創建字符串對象的方法有很多種,下面列舉了一些流行的方法。
-
使用字符串字面量
這是創建字符串的最常見方式。在這種情況下,字符串字面量用雙引號括起來。
String str = "abc";
當我們使用雙引號創建字符串時,JVM會在字符串池中查找是否已存儲了具有相同值的其他字符串。如果找到,它只返回該字符串對象的引用,否則它會創建一個新的字符串對象,並將其存儲在字符串池中。
-
使用 new 關鍵字
我們可以使用 new 運算子來創建 String 物件,就像創建任何普通的 Java 類一樣。在 String 類中有幾個構造函數可用於從字符數組、字節數組、StringBuffer 和 StringBuilder 獲取字符串。
String str = new String("abc"); char[] a = {'a', 'b', 'c'}; String str2 = new String(a);
Java 字符串比較
String 類提供 equals()
和 equalsIgnoreCase()
方法來比較兩個字符串。這些方法比較字符串的值,以檢查兩個字符串是否相等。如果兩個字符串相等,則返回 true
,否則返回 false
。
package com.journaldev.string.examples;
/**
* Java String Example
*
* @author pankaj
*
*/
public class StringEqualExample {
public static void main(String[] args) {
// 創建兩個字符串物件
String s1 = "abc";
String s2 = "abc";
String s3 = "def";
String s4 = "ABC";
System.out.println(s1.equals(s2));//true
System.out.println(s2.equals(s3));//false
System.out.println(s1.equals(s4));//false;
System.out.println(s1.equalsIgnoreCase(s4));//true
}
}
上述程序的輸出為:
true
false
false
true
String類別實作Comparable介面,提供compareTo()和compareToIgnoreCase()方法,用於按字典順序比較兩個字串。兩個字串會轉換成Unicode值進行比較,並返回一個整數值,該值可以大於、小於或等於零。如果字串相等,則返回零,否則返回大於或小於零的值。
package com.journaldev.examples;
/**
* Java String compareTo Example
*
* @author pankaj
*
*/
public class StringCompareToExample {
public static void main(String[] args) {
String a1 = "abc";
String a2 = "abc";
String a3 = "def";
String a4 = "ABC";
System.out.println(a1.compareTo(a2));//0
System.out.println(a2.compareTo(a3));//less than 0
System.out.println(a1.compareTo(a4));//greater than 0
System.out.println(a1.compareToIgnoreCase(a4));//0
}
}
上述程式的輸出為:
0
-3
32
0
請詳細閱讀該內容,請參考String compareTo範例。
Java字串方法
讓我們透過一個範例程式來看一下一些常用的String類別方法。
-
split()
Java String split() 方法用於使用給定的表達式拆分字符串。split() 方法有兩種變體。
split(String regex)
: 這個方法使用給定的正則表達式拆分字符串並返回字符串數組。split(String regex, int limit)
: 這個方法使用給定的正則表達式拆分字符串,但返回的字符串數組的元素受到指定限制的限制。如果指定的限制為 2,則該方法返回大小為 2 的字符串數組。
package com.journaldev.examples; /** * Java String split example * * @author pankaj * */ public class StringSplitExample { public static void main(String[] args) { String s = "a/b/c/d"; String[] a1 = s.split("/"); System.out.println("僅使用正則表達式拆分字符串:"); for (String string : a1) { System.out.println(string); } System.out.println("使用帶有限制的正則表達式拆分字符串:"); String[] a2 = s.split("/", 2); for (String string : a2) { System.out.println(string); } } }
上述程序的輸出為:
僅使用正則表達式拆分字符串: a b c d 使用帶有限制的正則表達式拆分字符串: a b/c/d
-
contains(CharSequence s)
Java String contains() 方法检查字符串是否包含指定的字符序列。如果字符串包含指定的字符序列,则此方法返回true,否则返回false。
package com.journaldev.examples; /** * Java String contains() 示例 * * 作者:pankaj * */ public class StringContainsExample { public static void main(String[] args) { String s = "Hello World"; System.out.println(s.contains("W"));//true System.out.println(s.contains("X"));//false } }
上述程序的输出为:
true false
-
length()
Java String length() 方法返回字符串的长度。
package com.journaldev.examples; /** * Java String length * * @author pankaj * */ public class StringLengthExample { public static void main(String[] args) { String s1 = "abc"; String s2 = "abcdef"; String s3 = "abcdefghi"; System.out.println(s1.length());//3 System.out.println(s2.length());//6 System.out.println(s3.length());//9 } }
-
replace()
Java String replace() 方法用於將字符串的特定部分替換為其他字符串。replace() 方法有四種變體。
replace(char oldChar, char newChar)
:此方法將字符串中所有出現的 oldChar 替換為 newChar。replace(CharSequence target, CharSequence replacement)
:此方法將字符串中每個目標文字串替換為替換文字串。replaceAll(String regex, String replacement)
:此方法將字符串中與指定 regex 匹配的所有子串的所有出現替換為指定替換。replaceFirst(String regex, String replacement)
:此方法將與指定 regex 匹配的第一個子串的第一個出現替換為指定替換。
package com.journaldev.examples; /** * Java String replace * * @author pankaj * */ public class StringReplaceExample { public static void main(String[] args) { //replace(char oldChar, char newChar) String s = "Hello World"; s = s.replace('l', 'm'); System.out.println("After Replacing l with m :"); System.out.println(s); //replaceAll(String regex, String replacement) String s1 = "Hello journaldev, Hello pankaj"; s1 = s1.replaceAll("Hello", "Hi"); System.out.println("After Replacing :"); System.out.println(s1); //replaceFirst(String regex, String replacement) String s2 = "Hello guys, Hello world"; s2 = s2.replaceFirst("Hello", "Hi"); System.out.println("After Replacing :"); System.out.println(s2); } }
以上程序的輸出是:
After Replacing l with m : Hemmo Wormd After Replacing : Hi journaldev, Hi pankaj After Replacing : Hi guys, Hello world
-
format()
Java Sting format() 方法用於格式化字串。java String format() 方法有兩種變體。
format(Locale l, String format, Object… args)
: 此方法使用指定的區域設定、字串格式和引數來格式化字串。format(String format, Object… args)
: 此方法使用指定的字串格式和引數來格式化字串。
package com.journaldev.examples; import java.util.Locale; /** * Java String format * * @author pankaj * */ public class StringFormatExample { public static void main(String[] args) { String s = "journaldev.com"; // %s is used to append the string System.out.println(String.format("This is %s", s)); //using locale as Locale.US System.out.println(String.format(Locale.US, "%f", 3.14)); } }
上面程式的輸出是:
This is journaldev.com 3.140000
-
substring()
此方法根據指定的索引返回字符串的一部分。
package com.journaldev.examples; /** * Java String substring * */ public class StringSubStringExample { public static void main(String[] args) { String s = "This is journaldev.com"; s = s.substring(8,18); System.out.println(s); } }
字符串連接
在Java中,字符串連接是一個非常基本的操作。字符串可以通過使用“+”運算符或使用concat()
方法來連接。
package com.journaldev.examples;
/**
* Java String concatenation
*
* @author pankaj
*
*/
public class StringConcatExample {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
String s3 = s1 + s2;
//使用+運算符
System.out.println("Using + operator: ");
System.out.println(s3);
//使用concat方法
System.out.println("Using concat method: ");
System.out.println(s1.concat(s2));
}
}
上述程序的輸出是:
Using + operator:
HelloWorld
Using concat method:
HelloWorld
查看此文章以獲取有關Java中字符串連接的更多信息:Java中的字符串連接。
Java字符串池
記憶體管理是任何程式語言中最重要的方面。在 Java 中,字串的記憶體管理與其他類別有些不同。為了使 Java 更節省記憶體,JVM 引入了一個特殊的記憶體區域,稱為字串常量池。當我們創建一個字串文字時,它會檢查字串池中是否已存在相同的字串。如果存在,則會返回字串池中現有字串的參考。讓我們看一下下面的範例程序。
package com.journaldev.examples;
/**
* Java String Pool Example
*
*/
public class StringPoolExample {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = "def";
//相同的參考
if (a==b) {
System.out.println("Both string refer to the same object");
}
//不同的參考
if (a==c) {
System.out.println("Both strings refer to the same object");
}else {
System.out.println("Both strings refer to the different object");
}
}
}
以上程序的輸出為:
Both string refer to the same object
Both strings refer to the different object
查看此文章以獲取有關Java 字串池的更多資訊。
String intern() 方法
當我們使用字串文字創建字串時,它將被創建在字串池中,但如果我們使用 new 關鍵字創建具有相同值的字串會怎樣呢?我們可以將字串從堆記憶體移動到字串池嗎?為此,使用 intern() 方法,它返回字串物件的規範表示。當我們在使用 new 關鍵字創建的字串物件上調用 intern() 方法時,它會檢查池中是否已經有相同值的字串?如果是,則返回池中該字串物件的參考。如果沒有,則在池中創建具有相同內容的新字串並返回參考。
package com.journaldev.examples;
/**
* Java String intern
*
* @author pankaj
*
*/
public class StringInternExample {
public static void main(String[] args) {
String s1 = "pankaj";
String s2 = "pankaj";
String s3 = new String("pankaj");
System.out.println(s1==s2);//true
System.out.println(s2==s3);//false
String s4 = s3.intern();
System.out.println(s1==s4);//true
}
}
檢查此帖以了解有關 Java String intern 方法的更多信息。
String不可變性的好處
String作為不可變類的一些好處包括:
- String常量池,從而節省內存。
- 安全性,因為它無法更改。
- 線程安全
- 類加載安全
查看有關 String不可變性好處 的更多信息的帖子。
Java 8 String join()
A new static method join() has been added in String class in Java 8. This method returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter. Let’s look at an example to understand it easily.
List<String> words = Arrays.asList(new String[]{"Hello", "World", "2019"});
String msg = String.join(" ", words);
System.out.println(msg);
輸出:Hello World 2019
Java 9 String Methods
在Java 9版本中,String類中添加了兩種方法。 它們是 – codePoints() 和 chars()。 這兩種方法都返回IntStream對象,我們可以對其執行一些操作。 讓我們快速查看這些方法。
String s = "abc";
s.codePoints().forEach(x -> System.out.println(x));
s.chars().forEach(x -> System.out.println(x));
輸出:
97
98
99
97
98
99
Java 11 字串類別的新方法
在 Java 11 版本中,String 類別新增了許多新方法。
- isBlank() – 如果字串為空或只包含空白字元,則返回 true,否則返回 false。
- lines() – 返回從此字串中提取的行的流,以行終止符號分隔。
- strip()、stripLeading()、stripTrailing() – 用於從字串中去除開頭和結尾的空白。
- repeat() – 返回一個字串,其值為此字串重複指定次數後的串接。
讓我們來看一個這些方法的範例程式。
package com.journaldev.strings;
import java.util.List;
import java.util.stream.Collectors;
/**
* JDK 11 New Functions in String class
*
* @author pankaj
*
*/
public class JDK11StringFunctions {
public static void main(String[] args) {
// isBlank()
String s = "abc";
System.out.println(s.isBlank());
s = "";
System.out.println(s.isBlank());
// lines()
String s1 = "Hi\nHello\rHowdy";
System.out.println(s1);
List lines = s1.lines().collect(Collectors.toList());
System.out.println(lines);
// strip()、stripLeading()、stripTrailing()
String s2 = " Java, \tPython\t ";
System.out.println("#" + s2 + "#");
System.out.println("#" + s2.strip() + "#");
System.out.println("#" + s2.stripLeading() + "#");
System.out.println("#" + s2.stripTrailing() + "#");
// repeat()
String s3 = "Hello\n";
System.out.println(s3.repeat(3));
s3 = "Co";
System.out.println(s3.repeat(2));
}
}
輸出:
false
true
Hi
Hello
Howdy
[Hi, Hello, Howdy]
# Java, Python #
#Java, Python#
#Java, Python #
# Java, Python#
Hello
Hello
Hello
CoCo
這就是關於 Java String 類別、它的方法和字串操作範例的全部內容。
您可以從我們的 GitHub 存儲庫 中查看更多字串範例。
參考資料:API 文件
Source:
https://www.digitalocean.com/community/tutorials/java-string