Java字符串操作方法大全(附带实例)
字符串是一个字符的序列。在 Java 中,字符串可以包含任意的 Unicode 符。例如,字符串 "Java™" 或 "Java\u2122" 由 5 个字符构成,分别是 J、a、v、a 和 ™。其中最后一个字符是“U+2122,注册商标”。
当你将一个字符串与另一个值拼接时,该值将会转换为字符串:
注意,如果混合使用拼接和加法运算,那么可能会得到意想不到的结果。示例如下:
如果要组合多个字符串,并使用分隔符将他们分隔开,请使用 join()方法:
如果需要连接大量的字符串,join() 方法的效率会有些低。在这种情况下,请使用 StringBuilder 来代替 join() 方法:
在以上的示例中,greeting 的第 12 个位置是
有时,你可能希望从一个由分隔符分隔的字符串中提取所有子串。split() 方法将能够实现这个功能,并返回一个由子串组成的数组:
注意,永远不要使用
但如果 location 是被计算得到的,例如:
与其他任何对象一样,String 变量可以是 null。null 表示这个变量不指向任何对象,甚至不指向一个空字符串。
如果在比较两个字符串时需要忽略字符的大小写,可以使用 equalsIgnoreCase() 方法。例如:
有时,你可能需要将字符串按顺序排列。调用 compareTo() 方法可以判断两个字符串是否按字典顺序排列:
compareTo() 方法会依次比较每一个字符,直到其中一个字符串到达末尾,或者两个字符串不匹配。例如,当比较 "word" 和 "world" 时,前 3 个字符是匹配的,第 4 个字符 d 的 Unicode 值小于 l。因此,"word" 字符串在前。所以 "word".compareTo("world") 返回 −8,该值是 d 和 l 的 Unicode 值之间的差。
这种比较方式对很多人来说可能不是很直观,因为它取决于字符的 Unicode 值的大小。例如,"blue/green" 在 "bluegreen" 之前,因为字符 / 的 Unicode 值恰好小于 g 的 Unicode 值。
这个方法也可以有第二个参数,即一个基数(范围为 2~36):
相反地,如果要将包含整数的字符串转换成为数值,那么可以使用 Integer.parseInt() 方法:
对于浮点数和字符串之间的相互转换,可以使用 Double.toString() 和 Double.parseDouble() 方法:
需要注意的是,在 Java 中,String 类是不可变(immutable)的。也就是说,String 的众多方法中没有一个方法能够修改字符串本身内容。例如:
同样需要注意的是,有些方法具有 CharSequence 类型的参数。这是 String、StringBuilder 和其他字符序列的通用超类。
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 类定义了大量的方法。下表列出了一些经常使用的方法及其功能:方法 | 功能 |
---|---|
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 和其他字符序列的通用超类。