StringBuilder
接口文档:详情可自行查看
字符串变量(非线程安全)。在内部,StringBuilder 对象被当作是一个包含字符序列的变长数组。
java.lang.StringBuilder 是一个可变的字符序列,是 JDK5.0 新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)
三种重载构造器的使用案例
//几种重载构造器的使用案例
StringBuilder sb1 =new StringBuilder();//#1 无参
StringBuilder sb2=new StringBuilder("123");//#2
StringBuilder sb3=new StringBuilder(123);//#3 有参
在StringBuilder类重载的三种构造器中都调用了父类abstractStringBuilder重载的构造器,在StringBuilder类重载的三种构造器中传参,实际上都是在指定继承于abstractStringBuilder父类中的char类型数组的长度
调用StringBuilder类中的空参构造器,在调用abstractStringBuilder父类的构造器时默认传入16,即char类型value数组的长度为16.
调用StringBuilder类中的形参为string类型的构造器,在调用abstractStringBuilder父类的构造器时传入该string类型字符串的长度string.length()+16,即char类型value数组的长度为string.length()+16.(16为构造器默认长度)
调用StringBuilder类中的形参为int类型的构造器,在调用abstractStringBuilder父类的构造器时传入该int类型数据,即char类型value数组的长度为该int类型数据值.
append()方法的使用
对于string类型的字符串,在实现拼接操作时可以使用“+”连接符、concat()方法、join()方法(join()方法用于多个字符串或字符串数组按照指定字符串逐个拼接)
这三个方法的使用都不会改变原字符串,而是返回一个新的字符串
String str="x"; str=str+"a"; str=str.concat("b"); System.out.println(str); String str1="w"; str=str.join("@", str,str1); System.out.println(str);
运行结果:
xab xab@w
StringBuilder类中append()方法的具体使用:在原字符串尾部直接追加一个字符串或字符,改变原字符串
//append()方法的使用 StringBuilder le =new StringBuilder("好好"); le.append("学习").append("天天向上"); System.out.println(le); }
运行结果是:
好好学习天天向上
replace()方法的使用
string类中replace()方法:将指定原字符串中的子字符串或字符替换为指定的字符串或字符。不会改变原字符串,而是返回一个新的字符串
//string类中replace()方法的使用 String str="人生在世,孰能无错"; str=str.replace("人生", "老子").replace('错', '过'); System.out.println(str);
运行结果:
老子在世,孰能无过
StringBuilder类中replace()方法的具体使用:将从指定启使下标开始到指定结尾下标(不含尾下标)的子字符串替换为指定字符串。
replace()方法的使用 StringBuilder le =new StringBuilder("不知所措啊"); le.replace(1, 3, "lel"); System.out.println(le); }
运行结果:
不lel措啊
delete()方法的使用:将从指定启使下标至指定结尾下标(不含尾下标)的子字符串删除
//delete()方法的使用 StringBuilder le = new StringBuilder("好好学习"); le.delete(1, 3); System.out.println(le); }
运行结果:
好习
insert()方法的使用:在指定下标位置插入字符串、字符、布尔值等
//insert()方法的使用 StringBuilder le=new StringBuilder("好好学习"); le.insert(3, "天").insert(4, '弟').insert(0, "好的"); System.out.println(le);
好的好好学天弟习
reverse()方法的使用:将原字符串逆序
//reverse()方法的使用 StringBuilder le=new StringBuilder("不服就干别哔哔"); le.reverse(); System.out.println(le);
运行结果
哔哔别干就服不
public class RunoobTest{ public static void main(String args[]){ StringBuilder sb = new StringBuilder(10); sb.append("Runoob.."); System.out.println(sb); sb.append("!"); System.out.println(sb); sb.insert(8, "Java"); System.out.println(sb); sb.delete(5,8); System.out.println(sb); } }
运行结果:
Runoob.. Runoob..! Runoob..Java! RunooJava!
StringBuffer 和 StringBuilder 类的区别
StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
public class Test{ public static void main(String args[]){ StringBuffer sBuffer = new StringBuffer("菜鸟教程官网:"); sBuffer.append("www"); sBuffer.append(".runoob"); sBuffer.append(".com"); System.out.println(sBuffer); }}
以上实例编译运行结果如下:
菜鸟教程官网:www.runoob.com
String、StringBuffer、StringBuilder的区别
1. String是不可变的{final修饰},如果尝试去修改,会新⽣成⼀个字符串对象,StringBuffer和StringBuilder是可变的
2. StringBuffer是线程安全的{synchronized},StringBuilder是线程不安全的,所以在单线程环境下StringBuilder效率会更⾼
使用建议:
(1) 如果要操作少量的数据,建议用String;
(2) 如果在多线程操作字符串缓冲区下操作大量的数据,建议使用SreingBuffer;
(3) 如果在单线程操作字符串缓冲区下操作大量数据,建议使用StringBuilder。
练习:
描述
将一个由英文字母组成的字符串转换成从末尾开始每三个字母用逗号分隔的形式。
输入描述:
一个字符串
输出描述:
修改后的字符串
理解解释:
因为String类型字符串不可变,我们用这个字符串创建一个新的StringBuilder型的字符串,然后从字符串末尾第3位开始,每次三位三位地遍历,将逗号用insert函数插入其中。最后将StringBuilder型转变成String输出即可。
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = scanner.next(); //write your code here...... StringBuilder m = new StringBuilder(); //用str初始化m m.append(str); //遍历m,每次跳跃3个字符,然后插入一个',' for(int i=str.length()-3;i>=0;i-=3) { //利用for循环在每3个后加入逗号 m.insert(i,","); } //输出改变后的字符串 System.out.println(m.toString()); }
运行结果:
aaabbbcccd a,aab,bbc,ccd 引用文章:1,2,3