Java 将字符串作为 String
类型的对象,不像其他语言,以字符数组的方式实现。
字符串创建之后就不可修改。进行修改相关操作返回的是新字符串,原先的字符串不会发生变化。将字符串以不可变的方式实现是为了更有效率。与 String 对应的 StringBuffer
和 StringBuilder
类创建之后可以修改。
三种字符串类型都声明为 final,不可能有子类;都实现了 CharSequence
接口。
String 构造器
String 的初始化方式如下
// ""
String a = new String();
char[] ch = {'a', 'b', 'c', 'd'};
// "abcd"
String b = new String(ch);
// "bc" 起始索引,个数
String c = new String(ch, 1, 2);
// "abcd"
String d = new String(b);
// 字节到字符的转换使用平台的默认编码
new String(byte[]);
new String(byte[], int startIndex, int num);
字节到字符的转换也可以自己指定字符编码方式,不过一般都是使用平台的默认编码。
new String(StringBuffer);
new String(StringBuilder);
// 使用扩展的 Unicode 字符集
new String(int[] codePoints, int startIndex, int charNum);
特定的字符串操作
对于每个字符串字面量,Java 都会将其自动转换成一个 String 对象。
String a = "abc";
+
号连接两个字符串。
String 对象和非 String 对象使用 + 号时,非 String 对象转换成它的 String 形式然后再将两个 String 对象拼接。
对于 String.valueOf()
方法,传入内建类型时,返回其值的字符串表示;当传入类类型时,调用类的 toString()
方法,该方法定义在 Object 对象中。当将一个类和 String 对象拼接或者输出这个类时,调用这个类的 toString()
方法。
提取字符
char charAt(int index)
索引非负且需要处于有效范围,返回对应位置的单个字符。
void getChars(int start, int end, char[] target, int tStart)
从索引 start 开始,到 end-1 为止的所有字符复制到 target 中,从索引 tStart 开始填充。
byte[] getBytes()
将 String 对象中的字符使用平台默认编码转换为字节,返回字节数组。
char[] toCharArray()
将 String 对象的内容以字符数组的方式返回。
比较 String
boolean equals(Object str)
比较两个 String 对象的内容是否相同,相同为 true,否则 false。
boolean equalsIgnoreCase(String str)
功能与 equals 相同,区别在于此时忽略大小写。
boolean regionMatches(int startIndex, String s2, int s2StartIndex, int num)
调用该方法的 String 对象从 startIndex 索引开始的 num 个字符和 s2 的 s2StartIndex 索引开始的 num 个字符比较,如果所有字符的顺序和内容相同,则返回 true;否则返回 false。
boolean regionMatches(boolean ignoreCase, int startIndex, String s2, int s2StartIndex, int num)
与上一个方法功能相同,区别在于此时比较字符时不区分字符的大小写。
boolean startsWith(String str)
调用该方法的 String 对象是否以 str 开头,是则返回 true;否则 false。
boolean endsWith(String str)
调用该方法的 String 对象是否以 str 结尾,是则返回 true;否则 false。
boolean startsWith(String str, int index)
调用该方法的 String 对象从索引 index 开始的子串是否和 str 相同,是则返回 true;否则 false。
equals()
方法比较两个字符串的内容是否完全相同,而 == 操作符比较两个 String 变量是否引用相同的 String 对象。
int compareTo(String str)
以字典序比较两个字符串,调用该方法的 String 对象位于传入的 String 对象之前,则返回负整数;相等则返回 0;之后则返回正整数。
int compareToIgnoreCase(String str)
功能与上一个方法相同,区别在于比较时不区分大小写。
搜索 String
int indexOf(int ch)
/int indexOf(String str)
寻找指定字符、字符串在调用该方法的 String 对象中是否出现,如果出现,返回第一次出现的索引位置;如果不存在,返回 -1。
int lastIndexOf(int ch)
/int lastIndexOf(String str)
寻找指定字符、字符串在调用该方法的 String 对象中是否出现,如果出现,返回最后一次出现的索引位置;如果不存在,返回 -1。
int indexOf(int ch, int index)
/int indexOf(String str, int index)
功能与重载方法相同,区别在于此时从 index 索引开始往后搜索。
int lastIndexOf(int ch, int index)
/int lastIndexOf(String str, int index)
功能与重载方法相同,区别在于此时从 index 索引开始往前搜索。
修改 String
String substring(int index)
返回从 index 索引开始的所有字符构成的字符串。
String substring(int index, int end)
返回从 index 索引开始,到 end-1 索引为止的字符构成的字符串。
String concat(String str)
拼接字符串。
String replace(char origin, char replace)
用字符 replace 替换字符串中所有的字符 origin。
String replace(CharSequence origin, CharSequence replace)
用字符串 replace 替换字符串中所有的子串 origin。
String trim()
删除字符串中最开始和最后面的空白符。编码小于等于 32 的字符会被删除。
String strip()
JDK11 引入,删除字符串中最开始和最后面的空白符。使得 Character.isWhitespace()
方法返回 true 的字符会被删除。
String stripLeading()
JDK11 引入,删除字符串中最开始的空白符。
String stripTrailing()
JDK11 引入,删除字符串中最后面的空白符。
static String valueOf(char[], int index, int num)
字符数组中从 index 索引开始的 num 个字符作为字符串返回。
String toLowerCase()
String toUpperCase()
static String join(CharSequence de, CharSequence... strs)
将 strs 中的多个字符串以 de 作为连接符拼接成一个字符串,返回。de 是一个字符串。
StringBuffer
构造器如下,StringBuffer 会预留 16 个字符的空间,剩余空间少于此大小才会重新分配空间。
// 创建一个预留 16 个字符空间的 StringBuffer 对象
new StringBuffer();
// 创建指定大小的 StringBuffer 对象
new StringBuffer(int size);
// 使用 Stirng 对象作为初始值创建 StringBuffer 对象,预留 16 个字符空间
new StringBuffer(String str);
// 使用字符序列作为初始值创建 StringBuffer 对象,预留 16 个字符空间
new StringBuffer(CharSequence chars);
int length()
返回当前字符个数。
int capacity()
返回当前 StringBuffer 的容量大小。
void ensureCapacity(int min)
设置已创建的 StringBuffer 对象的最小容量,实际容量由于效率原因可能比设置的大。
void setLength(int len)
设置 StringBuffer 对象的长度。如果设置的长度比当前实际长度长,则多出来的部分使用空字符填充;如果短,则去除比设置的长度长的部分字符。传入的参数必须非负。
char charAt(int index)
void setCharAt(int index, char ch)
在 index 索引位置使用传入的字符 ch。
void getChars(int start, int end, char[] target, int tStart)
将从索引 start 到 end-1 的内容复制到 target 数组,从索引 tStart 开始填充。target 数组必须能够容纳填充的内容。
StringBuffer append(type)
将传入的参数转换成字符串添加到 StringBuffer 对象末尾。
StringBuffer insert(int index, String s)
/StringBuffer insert(int index, char ch)
/StringBuffer insert(int index, Object o)
将传入的参数转换成字符串插入到 index 索引位置。
StringBuffer reverse()
反转内容顺序。
StringBuffer delete(int start, int end)
删除从索引 start 开始,到 end-1 为止的字符。
StringBuffer deleteCharAt(int index)
删除指定索引位置的字符。
StringBuffer replace(int start, int end, String s)
使用 s 替换从索引 start 开始,end-1 为止的字符。
String substring(int start)
String substring(int start, int end)
int indexOf(String s)
int lastIndexOf(String s)
StringBuilder
StringBuilder 和 StringBuffer 类似,区别在于,StringBuilder 是不同步的,即不是线程安全的。优点是有更好的性能。
参考
[1] Herbert Schildt, Java The Complete Reference 11th, 2019.
[2] https://websparrow.org/java/difference-between-trim-and-strip-methods-in-java