ZetCode

Java String 类

最后修改时间:2025 年 4 月 13 日

java.lang.String 类表示 Java 中的字符串。 Java 程序中的所有字符串字面量都是作为此类的实例实现的。字符串是不可变的,这意味着它们的值在创建后无法更改。

String 类提供了用于检查单个字符、比较字符串、搜索字符串、提取子字符串以及创建具有大小写转换副本的方法。 字符串连接通过 StringBuilder 类实现,以获得更好的性能。

String 类方法

String 类提供了许多用于字符串操作和检查的方法。 关键方法包括 lengthcharAtsubstringequalscompareToindexOf。 这些方法能够实现全面的字符串处理。

public final class String implements Serializable, Comparable<String>, CharSequence {
    public int length() {...}
    public char charAt(int index) {...}
    public String substring(int beginIndex) {...}
    public boolean equals(Object anObject) {...}
    public int compareTo(String anotherString) {...}
    public int indexOf(int ch) {...}
    public String toLowerCase() {...}
    public String toUpperCase() {...}
    public String trim() {...}
    // Many more methods...
}

上面的代码显示了 String 类提供的一些基本方法。 这些方法构成了 Java 中字符串操作的核心功能。

字符串创建和基本方法

可以使用字面量或 new 关键字创建字符串。 String 类提供了像 lengthcharAt 这样的基本方法来检查字符串。 字符串字面量存储在字符串池中以提高效率。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        // String creation
        String str1 = "Hello";
        String str2 = new String("World");
        String str3 = new String(new char[]{'J', 'a', 'v', 'a'});
        
        // Basic methods
        System.out.println("str1 length: " + str1.length());
        System.out.println("str2 char at 2: " + str2.charAt(2));
        System.out.println("str3: " + str3);
        
        // String concatenation
        String combined = str1 + " " + str2;
        System.out.println("Combined: " + combined);
    }
}

此示例演示了创建字符串和基本字符串操作的不同方法。 length 方法返回字符串长度,而 charAt 访问特定字符。 字符串连接会创建一个新的字符串,将现有字符串组合在一起。

字符串比较方法

可以使用 equals 进行内容比较,或使用 compareTo 进行字典顺序比较来完成字符串比较。 == 运算符比较引用,而不是内容。 可以通过 equalsIgnoreCase 进行不区分大小写的比较。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        String s1 = "Java";
        String s2 = "Java";
        String s3 = new String("Java");
        String s4 = "JAVA";
        
        // Reference comparison
        System.out.println("s1 == s2: " + (s1 == s2)); // true (string pool)
        System.out.println("s1 == s3: " + (s1 == s3)); // false
        
        // Content comparison
        System.out.println("s1.equals(s2): " + s1.equals(s2)); // true
        System.out.println("s1.equals(s3): " + s1.equals(s3)); // true
        System.out.println("s1.equalsIgnoreCase(s4): " + 
                         s1.equalsIgnoreCase(s4)); // true
        
        // Lexicographical comparison
        System.out.println("\"apple\".compareTo(\"banana\"): " + 
                         "apple".compareTo("banana")); // negative
    }
}

此示例显示了不同的字符串比较技术。 == 运算符检查引用相等性,而 equals 检查内容。 compareTo 返回负数、零或正数以表示顺序。

字符串搜索方法

String 类提供了几种在字符串中搜索的方法,包括 indexOflastIndexOfcontainsstartsWith/endsWith。 这些方法有助于在字符串中定位子字符串或字符。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        String text = "The quick brown fox jumps over the lazy dog";
        
        // Searching methods
        System.out.println("Index of 'fox': " + text.indexOf("fox"));
        System.out.println("Last index of 'the': " + 
                         text.lastIndexOf("the"));
        System.out.println("Contains 'brown'? " + 
                         text.contains("brown"));
        System.out.println("Starts with 'The'? " + 
                         text.startsWith("The"));
        System.out.println("Ends with 'dog'? " + 
                         text.endsWith("dog"));
        
        // Finding all occurrences
        int index = -1;
        while ((index = text.indexOf("o", index + 1)) != -1) {
            System.out.println("Found 'o' at position: " + index);
        }
    }
}

此示例演示了字符串搜索方法。 indexOf 查找第一次出现的位置,而 lastIndexOf 查找最后一次出现的位置。 contains 检查子字符串是否存在。 循环显示了如何查找字符的所有出现位置。

字符串操作方法

字符串操作方法包括 substringreplacetoUpperCase/toLowerCasetrim。 由于字符串是不可变的,因此这些方法会返回新的字符串。 原始字符串保持不变。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        String original = "   Hello, World!   ";
        
        // Manipulation methods
        String trimmed = original.trim();
        String upper = original.toUpperCase();
        String lower = original.toLowerCase();
        String replaced = original.replace("World", "Java");
        String substring = original.substring(3, 8);
        
        System.out.println("Original: '" + original + "'");
        System.out.println("Trimmed: '" + trimmed + "'");
        System.out.println("Upper: '" + upper + "'");
        System.out.println("Lower: '" + lower + "'");
        System.out.println("Replaced: '" + replaced + "'");
        System.out.println("Substring(3,8): '" + substring + "'");
        
        // Chaining methods
        String result = "  Some Text  "
                       .trim()
                       .toLowerCase()
                       .replace("some", "modified");
        System.out.println("Chained result: '" + result + "'");
    }
}

此示例显示了各种字符串操作方法。 每种方法都返回一个新的字符串,而不修改原始字符串。 方法链演示了如何在单个表达式中组合多个操作。

字符串拆分和连接

split 方法使用正则表达式分隔符将字符串拆分为数组。 Java 8 引入了 String.join,用于使用分隔符组合字符串。 这些方法对于处理 CSV 数据或构建路径非常有用。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        String csv = "apple,orange,banana,grape";
        String path = "usr/local/bin/java";
        
        // Splitting strings
        String[] fruits = csv.split(",");
        String[] dirs = path.split("/");
        
        System.out.println("Fruits:");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        
        // Joining strings
        String joinedPath = String.join("/", "usr", "local", "bin", "java");
        String joinedWithDelimiter = String.join(" - ", fruits);
        
        System.out.println("Joined path: " + joinedPath);
        System.out.println("Joined with delimiter: " + joinedWithDelimiter);
        
        // Complex splitting
        String text = "Hello;World.Another-Example";
        String[] parts = text.split("[;.-]");
        System.out.println("Complex split:");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

此示例演示了字符串拆分和连接。 split 可以使用简单的分隔符或正则表达式。 String.join 使用元素之间指定的字符串分隔符连接字符串。

字符串格式化

format 方法提供了类似于 printf 的 C 风格的字符串格式化。 格式说明符(如 %s、%d 和 %f)控制值如何插入到字符串中。 这对于创建格式化的输出非常有用。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        // Basic formatting
        String formatted = String.format("Hello, %s! You have %d messages.", 
                                       "Alice", 5);
        System.out.println(formatted);
        
        // Number formatting
        double price = 19.99;
        String priceStr = String.format("Price: $%.2f", price);
        System.out.println(priceStr);
        
        // Date formatting
        String date = String.format("Today is %tB %te, %tY", 
                                  new java.util.Date(),
                                  new java.util.Date(),
                                  new java.util.Date());
        System.out.println(date);
        
        // Padding and alignment
        String table = String.format("%-15s %5d %10.2f%n" +
                                   "%-15s %5d %10.2f%n",
                                   "Apples", 10, 2.99,
                                   "Oranges", 5, 1.49);
        System.out.println(table);
    }
}

此示例显示了各种字符串格式化技术。 format 方法支持不同的数据类型,并可以精确控制格式。 表格示例中演示了对齐、填充和数字格式。

字符串性能注意事项

对于密集的字符串操作,请考虑使用 StringBuilderStringBuffer 代替字符串连接。 当频繁修改字符串时,这些类提供可变字符序列以获得更好的性能。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        // Inefficient concatenation in loop
        String result = "";
        for (int i = 0; i < 10; i++) {
            result += i; // Creates new String each time
        }
        System.out.println("Inefficient: " + result);
        
        // Efficient using StringBuilder
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            sb.append(i);
        }
        System.out.println("Efficient: " + sb.toString());
        
        // StringBuffer for thread safety
        StringBuffer sbf = new StringBuffer();
        sbf.append("Thread-safe");
        sbf.append(" ");
        sbf.append("version");
        System.out.println(sbf.toString());
    }
}

此示例比较了字符串连接方法。 效率低下的版本会创建许多临时的 String 对象。 StringBuilder 为可变字符串提供更好的性能,而 StringBuffer 提供线程安全。

来源

Java String 类文档

在本文中,我们通过实际示例介绍了 Java String 类的基本方法。 理解这些方法对于在 Java 应用程序中进行有效的字符串操作至关重要。

作者

我叫 Jan Bodnar,是一位敬业的程序员,在该领域拥有多年的经验。 我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和八本电子书。 凭借八年以上的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程