JavaSE String类(补充)
1. 字符串修改
先看下面这段代码:
public class Test1 {
public static void main(String[] args) {
String s = "hello";
s += " world";
System.out.println(s);
}
}
//执行结果
hello world
上述代码看直接修改了字符串s
,将world
直接加到s后面,实际上并不是,因为String类是不能修改的,所有的修改都会创建新对象,效率低下,像上述代码,中间就创建了很多临时对象:
对此,如果想要修改字符串建议使用StringBuffer或者StringBuilder
2. StringBuilder & StringBuffer
在Java中,StringBuilder
和 StringBuffer
这两个类大部分功能是相同的,这里介绍StringBuilder常用的一些方法:
方法 | 说明 |
---|---|
StringBuffer append(String str) | 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、 double、float、int、long、Object、String、StringBuffer的变量 |
char charAt(int index) | 获取index位置的字符 |
int length() | 获取字符串的长度 |
int capacity() | 获取底层保存字符串空间总的大小 |
void ensureCapacity(int mininmumCapacity) | 扩容 |
void setCharAt(int index, char ch) | 将index位置的字符设置为ch |
int indexOf(String str) | 返回str第一次出现的位置 |
int indexOf(String str, int fromIndex) | 从fromIndex位置开始查找str第一次出现的位置 |
int lastIndexOf(String str) | 返回最后一次出现str的位置 |
int lastIndexOf(String str, int fromIndex) | 从fromIndex位置开始找str最后一次出现的位置 |
StringBuffer insert(int offset, String str) | 在offset位置插入:八种基类类型 & String类型 & Object类型数据 |
StringBuffer deleteCharAt(int index) | 删除index位置字符 |
StringBuffer delete(int start, int end) | 删除[start, end)区间内的字符 |
StringBuffer replace(int start, int end, String str) | 将[start, end)位置的字符替换为str |
String substring(int start) | 从start开始一直到末尾的字符以String的方式返回 |
String substring(int start,int end) | 将[start, end)范围内的字符以String的方式返回 |
StringBuffer reverse() | 反转字符串 |
String toString() | 将所有字符按照String的方式返回 |
代码示例:
package demo2;
public class Test2 {
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder("hello");
StringBuilder s2 = s1;
//append: 可在字符串尾部添加字符、字符串、整形数字
s1.append(' '); // hello
System.out.println(s1);
s1.append("world"); // hello world
System.out.println(s1);
s1.append("123"); // hello world123
System.out.println(s1);
System.out.println(s1==s2); // true
System.out.println(s1.charAt(2)); // 获取2号位上的字符 l
System.out.println(s1.length()); // 获取字符串有效长度 14
System.out.println(s1.capacity()); // 获取底层数组的总大小 21
s1.setCharAt(0,'H'); // 设置任意位置的字符 Hello world123
System.out.println(s1);
s1.insert(0,"hahaha"); // 在任意位置插入字符串 hahahaHello world123
System.out.println(s1);
System.out.println(s1.indexOf("Hello")); // 获取Hello第一次出现的位置 6
System.out.println(s1.lastIndexOf("world")); // 获取world最后一次出现的地方 12
s1.deleteCharAt(0); // 删除首字符 ahahaHello world123
System.out.println(s1);
s1.delete(0, 5); // 删除[0,5)范围内的字符
System.out.println(s1);
String str = s1.substring(0, 5); // 截取[0,5)范围内的字符
System.out.println(str);
s1.reverse(); // 字符串翻转
System.out.println(s1);
str = s1.toString(); // 将StringBuilder以String的方式返回
System.out.println(str);
}
}
从上述例子可以看出:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder
注:String和StringBuilder类不能直接转换,如果想要互相转换,可以采用如下原则:
- String变为StringBuilder:利用StringBuilder的构造方法或append()方法
- StringBuilder变为String:调用toString()方法
3. String、StringBuffer、StringBuilder的区别:
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作,而StringBuilder未采用同步处理,属于线程不安全操作