Java 字符串

Java String 是其中一個最廣泛使用的類。Java String 類定義在 java.lang 包中。

Java String

  • 基本上,字符串是一系列字符,但它不是原始類型。
  • 當我們在 Java 中創建一個字符串時,它實際上創建了一個 String 類型的對象。
  • String 是不可變對象,這意味著一旦創建就無法更改。
  • String 是 Java 中唯一支持運算符重載的類。我們可以使用 + 運算符連接兩個字符串。例如 "a"+"b"="ab"
  • Java 提供了兩個用於字符串操作的有用類 – StringBufferStringBuilder

讓我們繼續學習更多關於 Java String 類的知識。

創建字符串的不同方法

在 Java 中創建字符串對象的方法有很多種,下面列舉了一些流行的方法。

  1. 使用字符串字面量

    這是創建字符串的最常見方式。在這種情況下,字符串字面量用雙引號括起來。

    String str = "abc"; 
    

    當我們使用雙引號創建字符串時,JVM會在字符串池中查找是否已存儲了具有相同值的其他字符串。如果找到,它只返回該字符串對象的引用,否則它會創建一個新的字符串對象,並將其存儲在字符串池中。

  2. 使用 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類別方法。

  1. 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
    
  2. 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
    
  3. 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
    
    	}
    
    }
    
  4. 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
    
  5. 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
    
  6. 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作為不可變類的一些好處包括:

  1. String常量池,從而節省內存。
  2. 安全性,因為它無法更改。
  3. 線程安全
  4. 類加載安全

查看有關 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