java常用API-String、StringBuilder、StringBuffer
StringBuilder
StringBuilder代表可变字符串对象,相当于是一个容器,它里面装的字符串是可以改变的,就是用来操作字符串的
好处: StringBuilder比String更适合做字符串的修改操作,效率会更高,代码也会更简洁。
构造方法:
构造器 | 说明 |
---|---|
public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
常用方法:
append:在字符串末尾添加内容(可以是任意类型) insert:在指定位置插入内容 delete:删除指定位置的字符 deleteCharAt:删除指定位置的字符 replace:替换指定位置的字符 substring:截取子串 indexOf:查找指定字符串位置 lastIndexOf:查找最后一次出现的指定字符串位置 length:获取当前字符串长度 setLength:设置字符串长度
toString : 可以把StringBuilder转换为String
reverse:反转字符串
常用方法的基本使用:
scss
public class StringDemo {
public static void main(String[] args) {
//StringBuilder
StringBuilder strbu=new StringBuilder("你好");
System.out.println(strbu);
//增
strbu.append("java修炼手册").append(19).append(90);
System.out.println(strbu); //你好java修炼手册1990
System.out.println(strbu.reverse()); //反转字符串
//0991册手炼修avaj好你
//删除
strbu.delete(1,2); // 删除序号1-2的字符串,但是不包括2
System.out.println(strbu); //091册手炼修avaj好你
// 改 replace
strbu.replace(0,1,"2020");
System.out.println(strbu); //202091册手炼修avaj好你
//获取长度
System.out.println(strbu.length());//16
//转换为一个字符串
String s = strbu.toString();
System.out.println(s);//202091册手炼修avaj好你
//插入insert
strbu.insert(0,88); //插入位置,插入的数据
System.out.println(strbu);//88202091册手炼修avaj好你
//查找indexOf
System.out.println(strbu.indexOf("手")); //9
}
}
为啥要用StringBuilder?
对于字符串相关的操作,如频繁的拼接、修改等,建议用StringBuidler,效率更高!
注意: 如果操作字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String。
ini
StringBuilder sb=new StringBuilder();
for (int i = 0; i < 100000; i++) { //运行速度比以往的String的速度快很多倍
sb.append(i);
}
System.out.println(sb);
StringBuffer
注意:
- StringBuffer的用法与StringBuilder是一模一样的
- 但stringBuilder是线程不安全的,StringBuffer是线程安全的
案例:返回任意整型数组的内容
typescript
public class StringDemo {
public static void main(String[] args) {
//返回任意整形数组的内容
int[] arr={23,54,675,7,5,2,4,6,432};
String arrayData = getArrayData(arr);
System.out.println(arrayData);//[23,54,675,7,5,2,4,6,432]
}
public static String getArrayData(int[] arr){
if(arr==null){
return null;
}
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append('[');
for (int i = 0; i <arr.length ; i++) {
if(i==arr.length-1){
//增加判断如果是最后一个元素了就不要添加逗号了
stringBuffer.append(arr[i]);
break;
}
stringBuffer.append(arr[i]).append(','); //就这样会多一个逗号
}
stringBuffer.append(']');
return stringBuffer.toString();
}
}
StringJoiner
可以实现高效快捷的拼接
JDK8开始才有的,跟StringBuilder一样,也是用来操作字符串的, 也可以看成是一个容器,创建之后里面的内容是可变的
好处:不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁
构造器 | 说明 |
---|---|
public stringJoiner(间隔符号) | 创建一个stringJoiner对象,指定拼接时的间隔符号 |
public StringJoiner(间隔符号,开始符号,结束符号) | 创建一个stringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号 |
常用方法:
方法名称 | 说明 |
---|---|
public stringJoiner add(添如的内容) | 添加数据,并返回对象本身 |
public int length() | 返回长度(字符出现的个数) |
public string tostring() | 返回一个字符串(该字符串就是拼接之后的结果) |
用StringJoiner实现返回任意整型数组的内容:
csharp
public static String getStringJoiner(int[] arr){
if(arr==null){
return null;
}
//创建对象,分别指定分隔符,开始符号,结束符号
StringJoiner strjoin=new StringJoiner(",","[","]");
for (int i = 0; i <arr.length ; i++) {
//里面不可以直接放一个数字啥的,只可以放CharSequence 字符序列
// strjoin.add(arr[i])
strjoin.add(String.valueOf(arr[i]));
}
return strjoin.toString();
}
相比较前面的StringBuffer 实现的代码更加简洁,并且运算速度更快一些
需要注意:StringJoiner 在add的时候里面需要放入CharSequence 字符序列,是数字啥的都是不可以的
CharSequence类
CharSequence类是java.lang包下的一个接口,此接口对多种不同的对char访问的统一接口,像String、StringBuffer、StringBuilder类都是CharSequence的子接口;
CharSequence类和String类都可以定义字符串,但是String定义的字符串只能读,CharSequence定义的字符串是可读可写的
String、String StringBuffer 和 StringBuilder 的区别是什么?
String是只读字符串 ,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final
类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的String对象。
arduino
private final char value[];
每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。
StringBuffer和StringBuilder 他们两都继承了AbstractStringBuilder抽象类,从
AbstractStringBuilder抽象类中我们可以看到
scss
/**
* The value is used for character storage.
*/
char[] value;
他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和
StringBuilder来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所
以是线程安全 的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
StringBuffer对方法都添加了同步锁:
java
@Override
public synchronized int length() {
return count;
}