操作字符串的类
Java 中,常用的对字符串操作的类有 String、StringBuffer、StringBuilder
-
String : final 修饰,String 类的方法都是返回 new String。即对 String 对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
-
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
-
StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以 new StringBuilder 对象,调用 StringBuilder 对象的 append()、replace()、delete() 等方法修改字符串。
String
源码
final修饰的字节数组
方法,如substring等 是new了一个新的数组,所以会有一定开销
private final char[] value;
public String substring(int beginIndex, int endIndex) {
int length = length();
checkBoundsBeginEnd(beginIndex, endIndex, length);
int subLen = endIndex - beginIndex;
if (beginIndex == 0 && endIndex == length) {
return this;
}
return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)
: StringUTF16.newString(value, beginIndex, subLen);
}
public static String newString(byte[] val, int index, int len) {
return new String(Arrays.copyOfRange(val, index, index + len),
LATIN1);
}
- String 类对象称为不可变字符串
String 类没有提供用于修改字符串的方法。由于不能修改 Java 字符串中的字符, 所以在 Java 文档中将 String 类对象称为不可变字符串
不可变字符串的优点:编译器可以让字符串共享。
想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量, 原始字符串与复制的字符串共享相同的字符。
常用API
equals:字符串是否相同
equalsIgnoreCase:忽略大小写后字符串是否相同
compareTo:根据字符串中每个字符的Unicode编码进行比较
compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较
indexOf:目标字符或字符串在源字符串中位置下标
lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标
valueOf:其他类型转字符串
charAt:获取指定下标位置的字符
codePointAt:指定下标的字符的Unicode编码
concat:追加字符串到当前字符串
isEmpty:字符串长度是否为0
contains:是否包含目标字符串
startsWith:是否以目标字符串开头
endsWith:是否以目标字符串结束
format:格式化字符串
getBytes:获取字符串的字节数组
getChars:获取字符串的指定长度字符数组
toCharArray:获取字符串的字符数组
join:以某字符串,连接某字符串数组
length:字符串字符数
matches:字符串是否匹配正则表达式
replace:字符串替换
replaceAll:带正则字符串替换
replaceFirst:替换第一个出现的目标字符串
split:以某正则表达式分割字符串
substring:截取字符串
public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)
beginIndex -- 起始索引(包括), 索引从 0 开始。
endIndex -- 结束索引(不包括)。
toLowerCase:字符串转小写
toUpperCase:字符串转大写
trim:去字符串首尾空格
附:
Integer.parseInt(String s); 返回用十进制参数表示的整数值。
StringBuilder
JDK5.0 中引入 StringBuilder 类。可以更有效的进行字符串的连接等操作。
常用API:
StringBuffer
是StringBuilder类的前身, 其效率稍有些低, 但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑 (通常都是这样,) , 则应该用 StringBuilder 替代它。 这两个类的 API 是相同的。
反转字符串
- 使用 StringBuilder 或 StringBuffer 的 reverse 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。(JDK1.8)
- 不考虑字符串中的字符是否是 Unicode 编码,自己实现。
- 递归(或者使用栈)
- 双指针(不使用额外空间)
https://www.javanav.com/interview/a961e4d2347f4ffd87b527c334de4f0c.html
https://leetcode-cn.com/problems/reverse-string/submissions/