String-实例方法的实战
package com.string;
import java.lang.reflect.Array;
import java.util.Arrays;
public class Test {
public static void main (String[] args) {
String greeting = "Hello World";
System.out.println(greeting.hashCode()); // -862545276
System.out.println(greeting.length()); // 11
System.out.println(greeting.charAt(0)); // H
System.out.println(greeting.contains("l")); // true
System.out.println(greeting.indexOf("l")); // 2
System.out.println(greeting.concat("!!!")); // Hello World!!!,不修改原字符串
System.out.println(greeting.endsWith("ld")); // true , 是否以某字符串结尾
System.out.println(greeting.lastIndexOf("d")); // 10 ,从后往前找
System.out.println(greeting.replace(" ", "")); // HelloWorld
System.out.println(greeting.toUpperCase()); // HELLO WORLD
System.out.println(greeting.toLowerCase()); // hello world
System.out.println(" 996 ".trim()); // 996,去掉首尾空格
System.out.println(greeting.substring(0, 5)); // Hello,截取字符串
System.out.println(greeting.substring(6)); // World,截取字符串
String[] parts = greeting.split("l");
System.out.println(Arrays.toString(parts)); // [He, , o Wor, d],分割字符串
System.out.println("abe".compareTo("abc")); // 2,比较字符串大小 ASCII码差值
System.out.println('e' - 'c');
}
}
hashCode()
System.out.println(greeting.hashCode()); // -862545276
返回字符串的哈希码,常用于散列表中存储和检索对象。由于String
是不可变的,其哈希码在字符串生命周期内保持不变,非常适合作为键使用。当自定义类重写equals
方法时,也需要重写hashCode
方法以维护哈希一致性。
length()
System.out.println(greeting.length()); // 11
返回字符串中的字符数。length()
方法的执行时间是常数级别,性能优越。需要注意的是,length()
返回的是字符数而非字节数,适用于处理 Unicode 字符。
charAt(int index)
System.out.println(greeting.charAt(0)); // H
返回指定索引处的字符。使用时需确保索引在0
到length() - 1
之间,以避免IndexOutOfBoundsException
。如果需要遍历所有字符,可以考虑使用toCharArray()
或StringBuilder
以提高性能。
contains(CharSequence s)
System.out.println(greeting.contains("l")); // true
检查字符串是否包含指定的子序列。contains
方法区分大小写,如需不区分大小写的检查,可以先将字符串转换为统一的大小写。此外,对于大字符串,多次调用contains
可能影响性能,需优化查找逻辑。
indexOf(String str)
System.out.println(greeting.indexOf("l")); // 2
返回指定子字符串首次出现的索引,若不存在则返回-1
。在需要查找所有出现位置时,可以结合循环使用indexOf
。传入空字符串时,indexOf
会返回0
。
concat(String str)
System.out.println(greeting.concat("!!!")); // Hello World!!!,不修改原字符串
将指定字符串连接到当前字符串的末尾。对于多次拼接操作,建议使用StringBuilder
或StringBuffer
以提高效率,因为String
是不可变的,每次拼接都会创建新的对象。对于简单的拼接,concat
方法或+
运算符均可使用,后者在编译时会被优化为StringBuilder
。
endsWith(String suffix)
System.out.println(greeting.endsWith("ld")); // true , 是否以某字符串结尾
判断字符串是否以指定的后缀结束。常用于文件名检查,如验证文件扩展名。endsWith
方法区分大小写,根据需求调整使用。
lastIndexOf(String str)
System.out.println(greeting.lastIndexOf("d")); // 10 ,从后往前找
返回指定子字符串最后一次出现的索引,若不存在则返回-1
。适用于需要从后向前查找的场景。类似于indexOf
,在处理大字符串时需注意性能。
replace(CharSequence target, CharSequence replacement)
System.out.println(greeting.replace(" ", "")); // HelloWorld
替换所有匹配的子字符串。对于复杂的替换逻辑,可使用replaceAll
支持正则表达式。由于String
的不可变性,每次替换都会生成新的字符串,需注意内存使用。
toUpperCase()
System.out.println(greeting.toUpperCase()); // HELLO WORLD
将字符串中的所有字符转换为大写。处理多语言时,建议使用重载方法toUpperCase(Locale locale)
指定区域,以避免潜在问题。转换后的字符串是新的对象,需注意内存管理。
toLowerCase()
System.out.println(greeting.toLowerCase()); // hello world
将字符串中的所有字符转换为小写。与toUpperCase
类似,建议在处理国际化时使用toLowerCase(Locale locale)
指定区域。
trim()
System.out.println(" 996 ".trim()); // 996,去掉首尾空格
去除字符串首尾的空白字符,包括空格和制表符。trim
方法仅去除首尾空白,不影响中间空白。对于更复杂的空白处理,可结合正则表达式使用。由于String
的不可变性,trim
返回新的字符串对象。
substring(int beginIndex, int endIndex)
System.out.println(greeting.substring(0, 5)); // Hello,截取字符串
返回从beginIndex
开始到endIndex
结束的子字符串(不包括endIndex
)。使用时需确保beginIndex
和endIndex
在合法范围内且beginIndex <= endIndex
,以避免IndexOutOfBoundsException
。在 Java 7 及以后版本,substring
不会共享原始字符串的字符数组,避免了早期版本中的内存泄漏问题。
substring(int beginIndex)
System.out.println(greeting.substring(6)); // World,截取字符串
返回从beginIndex
到字符串末尾的子字符串。确保beginIndex
在合法范围内,常用于提取后缀或尾部部分。
split(String regex)
String[] parts = greeting.split("l");
System.out.println(Arrays.toString(parts)); // [He, , o Wor, d],分割字符串
根据给定的正则表达式分割字符串,返回字符串数组。需注意正则表达式的特殊字符转义。对于简单分隔符,split
方法简洁易用,但在高性能要求下,可考虑使用StringTokenizer
或手动分割。连续分隔符会导致空字符串,根据需求进行处理。
compareTo(String anotherString)
System.out.println("abe".compareTo("abc")); // 2,比较字符串大小 ASCII码差值
按字典顺序比较两个字符串,返回负值、零或正值,分别表示当前字符串小于、等于或大于参数字符串。常用于排序操作,如Collections.sort
。compareTo
区分大小写,使用compareToIgnoreCase
可实现不区分大小写的比较。基于 Unicode 值,适用于国际化应用。
字符运算
System.out.println('e' - 'c'); // 2
计算字符之间的差值,结果为整数。常用于字符的数值计算,如字母表位置计算。确保操作意图清晰,避免代码可读性下降。
注意事项与提示
String
类的不可变性使其在多线程环境中天然安全,但频繁的字符串修改操作会导致大量临时对象的创建,影响性能。推荐在需要频繁修改字符串的场景下使用StringBuilder
或StringBuffer
。在处理国际化应用时,进行大小写转换等操作时,务必考虑区域性(Locale
)参数,以确保正确性。使用字符串方法时,注意可能抛出的异常,进行适当的异常处理或输入验证。理解正则表达式的语法和行为,避免在使用split
、replace
等方法时出现意外结果。
// 使用StringBuilder进行高效的字符串拼接
StringBuilder stringBuilder = new StringBuilder(greeting);
stringBuilder.append("!!!");
System.out.println(stringBuilder.toString()); // Hello World!!!