首页 > 编程笔记 > Java笔记 阅读:47

Java字符串操作方法大全(附带实例)

字符串是一个字符的序列。在 Java 中,字符串可以包含任意的 Unicode 符。例如,字符串 "Java™" 或 "Java\u2122" 由 5 个字符构成,分别是 J、a、v、a 和 ™。其中最后一个字符是“U+2122,注册商标”。

Java拼接字符串

使用 + 运算符可以拼接两个字符串。例如:
String location = "Java";
String greeting = "Hello " + location;
以上两条语句将 greeting 设置为字符串 "Hello Java"。(注意第一个操作数末尾的空格。)

当你将一个字符串与另一个值拼接时,该值将会转换为字符串:
int age = 42;
String output = age + " years";
现在字符串 output 是 "42 years"。

注意,如果混合使用拼接和加法运算,那么可能会得到意想不到的结果。示例如下:
"Next year, you will be " + age + 1 // Error
首先,字符串拼接 age,然后再拼接 1,因此,最后得到的结果是 "Next year, you will be 421"。在这种情况下,需要使用括号:
"Next year, you will be " + (age + 1) // OK

如果要组合多个字符串,并使用分隔符将他们分隔开,请使用 join()方法:
String names = String.join(", ", "Peter", "Paul", "Mary");
// Sets names to "Peter, Paul, Mary"
join() 方法的第一个参数是分隔符字符串,后面是要拼接的字符串。它们的数量可以是任意多个,你也可以以字符串数组传递参数。

如果需要连接大量的字符串,join() 方法的效率会有些低。在这种情况下,请使用 StringBuilder 来代替 join() 方法:
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 创建一个包含大量字符串的列表
        List<String> names = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            names.add("Name " + i);
        }

        // 使用 StringBuilder 连接字符串
        long startTime = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        for (String name : names) {
            if (sb.length() > 0) {
                sb.append(", ");
            }
            sb.append(name);
        }
        String result = sb.toString();
        long endTime = System.currentTimeMillis();

        System.out.println("使用 StringBuilder 连接字符串耗时:" + (endTime - startTime) + " ms");
        // 输出结果的前几个字符
        System.out.println("结果的前几个字符:" + result.substring(0, 50));
    }
}
在这个实例中,我们创建了一个包含 10000 个字符串的列表,然后使用 StringBuilder 来连接这些字符串。通过对比使用 join() 方法和 StringBuilder 的耗时,可以明显看出在处理大量字符串时,StringBuilder 的效率更高。

Java拆分字符串

如果拆分字符串,可以使用 substring() 方法。例如:
String greeting = "Hello, World!";
String location = greeting.substring(7, 12); // Sets location to "World"
substring() 方法的第一个参数是要提取子串的起始位置,位置从 0 开始表示;第二个参数是不包含子串的第一个位置。

在以上的示例中,greeting 的第 12 个位置是 ! ,这个是我们不需要的字符的位置。该方法需要指定一个不需要的字符的位置,这可能看起来很奇怪,但这样做有一个优点:12 – 7 将会是这个子串的长度。

有时,你可能希望从一个由分隔符分隔的字符串中提取所有子串。split() 方法将能够实现这个功能,并返回一个由子串组成的数组:
String names = "Peter, Paul, Mary";
String[] result = names.split(", ");
// An array of three strings ["Peter", "Paul", "Mary"]
这里的分隔符可以是任何正则表达式。例如,input.split("\\s+") 将在空白处拆分 input 字符串。

Java字符串比较

如果要比较两个字符串是否相等,请使用 equals() 方法。例如:
location.equals("World")
当 location 字符串恰好为 "World" 时,表达式将返回 true。

注意,永远不要使用 == 运算符来比较字符串。在下面的比较中,仅当 location 和 "World" 在内存中是完全相同的对象时才能返回 true。
location == "World" // Don’t do that!
即在虚拟机中,每个字符串字面量只用一个实例,因此只有 "World" == "World"  才能为 true。

但如果 location 是被计算得到的,例如:
String location = greeting.substring(7, 12);
那么结果将会被放置到一个单独的 String 对象中,location == "World" 将返回 false!

与其他任何对象一样,String 变量可以是 null。null 表示这个变量不指向任何对象,甚至不指向一个空字符串。
String middleName = null;
如果要测试一个对象是否为 null,可以使用 == 运算符:
if (middleName == null) ...
需要注意的是,null 与空字符串 "" 不同。空字符串是长度为零的字符串,而 null 表示根本不存在任何字符串。

如果在比较两个字符串时需要忽略字符的大小写,可以使用 equalsIgnoreCase() 方法。例如:
"world".equalsIgnoreCase(location);
当 location 是 "World"、"world" 或者 "WORLD" 等情况时,都会返回 true。

有时,你可能需要将字符串按顺序排列。调用 compareTo() 方法可以判断两个字符串是否按字典顺序排列:
first.compareTo(second)
如果 first 在 second 之前,那么该方法返回一个负整数(不一定是 −1);如果 first 在 second 之后,则返回正整数(不一定是 1);如果两者相等,则返回 0。

compareTo() 方法会依次比较每一个字符,直到其中一个字符串到达末尾,或者两个字符串不匹配。例如,当比较 "word" 和 "world" 时,前 3 个字符是匹配的,第 4 个字符 d 的 Unicode 值小于 l。因此,"word" 字符串在前。所以 "word".compareTo("world") 返回 −8,该值是 d 和 l 的 Unicode 值之间的差。

这种比较方式对很多人来说可能不是很直观,因为它取决于字符的 Unicode 值的大小。例如,"blue/green" 在 "bluegreen" 之前,因为字符 / 的 Unicode 值恰好小于 g 的 Unicode 值。

Java数值和字符串的相互转换

要将整数转换为字符串,可以调用静态 Integer.toString() 方法:
int n = 42;
String str = Integer.toString(n); // Sets str to "42"

这个方法也可以有第二个参数,即一个基数(范围为 2~36):
String str2 = Integer.toString(n, 2); // Sets str2 to "101010"
注意,更简单地将整数转换为字符串的方法是用空字符串和整数拼接,例如:"" + n 。但是有些人认为这样的代码很不美观,且效率稍低。

相反地,如果要将包含整数的字符串转换成为数值,那么可以使用 Integer.parseInt() 方法:
String str = "101010";
int n = Integer.parseInt(str); // Sets n to 101010
同样地,该方法也可以指定转换基数:
int n2 = Integer.parseInt(str, 2); // Sets n2 to 42

对于浮点数和字符串之间的相互转换,可以使用 Double.toString() 和 Double.parseDouble() 方法:
String str = Double.toString(3.14); // Sets str to "3.14"
double x = Double.parseDouble(str); // Sets x to 3.14

Java字符串API

就像你期望的那样,String 类定义了大量的方法。下表列出了一些经常使用的方法及其功能:

表:String类常用方法
方法 功能
boolean startsWith(String str)
boolean endsWith(String str)
boolean contains(CharSequence str)
检查字符串是否以给定的字符串开头、结尾,或是否包含给定字符串
int indexOf(String str)
int lastIndexOf(String str)
int indexOf(String str, int fromIndex)
int lastIndexOf(String str, int fromIndex)
获取 str 的第一个或最后一个出现的位置,搜索整个字符串或从 fromIndex 开始的子串,如果未找到匹配项,则返回 −1
String replace(CharSequence oldString, CharSequence newString) 将所有出现的 oldString 替换为 newString,并返回新字符串
String toUpperCase()
String toLowerCase()
将原始字符串中的所有字符转换为大写或小写,并返回新字符串
String strip() 返回通过删除所有前导空格和末尾空格获得的新字符串

需要注意的是,在 Java 中,String 类是不可变(immutable)的。也就是说,String 的众多方法中没有一个方法能够修改字符串本身内容。例如:
greeting.toUpperCase()
将返回一个新字符串 "HELLO,WORLD!",但并不会改变 greeting。

同样需要注意的是,有些方法具有 CharSequence 类型的参数。这是 String、StringBuilder 和其他字符序列的通用超类。

相关文章