目录
StringBuilder
有String不就行了吗?我们学StringBuilder干嘛?
来看下面这个例子:
public class Main{
public static void main(String[] args) {
String s = "";//创建一个空的字符串 底层new了一个空间
for(int i =0;i<1000000;i++){
s = s+ "abc";
}
System.out.println(s);
}
}
这段代码要等很久很久 因为由于字符串是不可变的,所以每次执行s = s + "abc"这条指令的时候,都需要创建一个新的s 来存放 这样导致效率极低,因此时间很久.
而StringBuilder就是来解决上述的这种问题的. 下面是用StringBuilder的例子:
public class Main{
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("");
for(int i =0;i<10000000;i++){
sb.append("abc");
}
System.out.println(sb);
}
}
这段代码的运行速度就相当快了 , 至于为什么?我们接着往下看.
StringBuilder是什么
StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的
- 作用:提高字符串的操作效率
如下图:
字符串放置在容器中即可改变而无需一直创建(new String(...))新的对象
这也就是为什么上面那个例子中第二个代码的运行效率快的原因了
那么StringBuilder如何构造呢?
StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变的字符串对象,不含有任何内容 |
public StringBuilder(Stringstr) | 根据字符串的内容,来创建可变字符串对象 |
由于上面写的是空参的构造StringBuilder的方法
那么这里就来说明一下有参的 :
StringBuilder sb = new StringBuilder("abc");
这个代码的意思是在一个StringBuilder对象在创建时已存放了一个字符串"abc"
说完了构造方法,我们来说一下StringBuilder中有那些常用的方法
StringBuilder常用方法
方法名 | 说明 |
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回长度(字符出现的个数) |
public String toString | 通过toString()就可以实现把StringBuilder转换为String |
public class Main{
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//2.添加元素
sb.append(1);
sb.append(2.3);
sb.append(true);
//反转
sb.reverse();
//获取长度
int len = sb.length();
System.out.println(len);
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//java在底层对他做了一些特殊处理
//打印对象不是地址值而是属性值
System.out.println(sb);
}
}
public class Main{
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");
System.out.println(sb);
//再把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);
}
}
这样多行可能有点复杂,如果使用熟练后, 可以用链式编程的思想来进行书写
何为链式编程?就是当我们调用一个方法的时候,不需要用变量接受ta的结果,可以继续调用其他的方法.
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
int len = getString().
substring(1).
replace("A","Q").length();
}
public static String getString(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
return str;
}
}
做两个练习来看看自己的StringBuilder这部分的知识点,掌握的怎么样叭!
练习一:对称字符串
需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或者不是对称字符串.
例如: 堆成字符串 123321 111 非对称字符串: 123123
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
//输入一个字符串
Scanner sc = new Scanner(System.in);
String str = sc.next();
//将这个字符串放在StringBuilder中然后进行翻转看看是否跟原来的相等即可
StringBuilder sb = new StringBuilder(str);
StringBuilder reverse = sb.reverse();
String string = reverse.toString();
if(string.equals(str)){
System.out.println("这是一个对称字符串捏!");
}else{
System.out.println("是一个非对称字符串啊!");
}
/*
也可以用链式编程思想:
String result = new StringBuilder().append(str).reverse().toString();
if(str.equals(result)){
...
}else{
...
}
*/
}
}
练习二:按要求打印
需求:定义一个方法,把int数组中的数据按照指定给的格式拼接成一个字符串返回
调用该方法,并在控制台输出结果
例如:数组为int[] arr = {1,2,3};
执行方法后的输出结果为:[1,2,3]
public class Main{
public static void main(String[] args) {
//1.定义一个数组
int[] arr = {1,2,3};
//2.调用方法把数组变成字符串
String str = arrToString(arr);
System.out.println(str);
}
private static String arrToString(int[] arr) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i = 0;i<arr.length;i++){
if(i==arr.length-1){
sb.append(arr[i]);
}else{
sb.append(arr[i]+",");
}
}
sb.append("]");
return sb.toString();
}
}
但其实这个练习可以做的更快,更优雅!也就是我们下面要将的StringJoiner .
StringJoiner
如果我们学会了StringJoiner就可以将上面的练习写成这样:
StringJoiner是什么?
StringJoiner是Java8新出的用于处理字符串拼接的工具类,可以让你的代码看起来更优雅,不拉跨。
StringJoiner构造方法
方法名 | 说明 |
public StringJoiner(间隔符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号 |
public StringJoiner(间隔符号,开始 符号,结束符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号,开始符号,结束符号 |
StringJoiner的成员方法
方法名 | 说明 |
public StringJoiner add(添加的内容) | 添加数据,并返回对象本身 |
public iunt length() | 返回长度(字符出现的个数) |
public String toString() | 返回一个字符串(该字符串就是拼接后的结果) |
public class Main{
public static void main(String[] args) {
//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc
}
}
public class Main{
public static void main(String[] args) {
StringJoiner sj = new StringJoiner(",","[","]");
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
System.out.println(sj);
String str = sj.toString();
System.out.println(str);
}
}