今天我们又来学习Java关于String,StringBuilder,StringJoiner三大类的使用和内部逻辑~
1.StringBuilder的使用
StringBuilder是Java已经写好的类,Java在底层对他做了一些特殊处理,打印的对象不是地址值而是属性值.
StringBuilder的创建格式为
StringBuffer sb=new StringBuffer();
这样就可以创建的sb为空
当然你可以在()里加上内容如
StringBuffer sb=new StringBuffer("abc");
这时候sb中存储的就是abc
StringBuilder有四大常用的成员方法
1.append,就是添加数据到对象的方法
StringBuffer sb=new StringBuffer("abc");
sb.append(1);
sb.append(1.25);
sb.append("原神");
System.out.println(sb);
以上代码打印的结果是
2. reverse(),反转容器中的内容(什么是容器接下来会讲)
StringBuffer sb=new StringBuffer("abc");
sb.append(1);
sb.append(1.25);
sb.append("原神");
sb.reverse();
System.out.println(sb);
结果如下
3.就是length(),可以返回容器的长度
StringBuffer sb=new StringBuffer("abc");
sb.append(1);
sb.append(1.25);
sb.append("原神");
sb.reverse();
System.out.println(sb);
int length = sb.length();
System.out.println(length);
结果为
4.toString(),将StringBuilder转换为String
StringBuffer sb=new StringBuffer("abc");
sb.append(1);
sb.append(1.25);
sb.append("原神");
sb.reverse();
System.out.println(sb);
String str=sb.toString();
System.out.println(sb);
结果如下图,可以看出来str和sb其实是一模一样滴
2.为什么非要加入StringBuilder而不一直使用String
首先我们要知道,String其实是不能改变的,每一次改变String其实是重新创建一个新的String然后把老的String赋值进去。所以如果一直用String去+其他的多个字符串是非常损耗时间和性能的。
但是StringBuilder其实是创建了一个容器,在里面可以更改字符串而不需要创建新的字符,StringBuilder由于不用每次都创建新的字符串把老的字符串放进去,所以StringBuilder对于字符串的改动效率是更高的
并且,StringBuilder都有自己特别好用的成员方法,所以灵活转化String和StringBuilder可以更好的解决出现的问题
在编程的过程中可以多使用链式编程
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串");
String str=sc.next();
//链式编程
String result=new StringBuilder().append(str).reverse().toString();
if(str.equals(result)){
System.out.println("是回文数");
}
else{
System.out.println("不是回文数");
}
}
如上图,贴一个判断回文数(字符串)的代码,其中就用到了链式编程,可以更好的将StringBuilder和String进行转换
3.StringJoiner的使用
在拥有了String和StringBuilder的基础上,在JDK8中加入了StringJoiner,StringJoiner是StringBuilder的进化版,StringJoiner也不用每次创建新的字符串,然后public StringJoiner(间隔符号, 开始符号,结束符号)是它的格式。是一种更为方便的写法
StringJoiner sj=new StringJoiner("---");
sj.add("aaa").add("bbb").add("ccc");
System.out.println(sj.add("aaa").add("bbb").add("ccc"));
当然StringJoiner()中只写间隔符号也可以
结果如下
再加入开始符号和结束符号的话(add的意思在下面讲)
public static void main(String[] args) {
StringJoiner sj=new StringJoiner("---","[","]");
System.out.println(sj.add("aaa").add("bbb").add("ccc"));
}
结果如下
讲一下StringJoiner中的常见的成员方法
1.add,可以类似于StringBuilder的append
public static void main(String[] args) {
StringJoiner sj=new StringJoiner("---","[","]");
System.out.println(sj.add("aaa").add("bbb").add("ccc"));
}
就跟上面的代码一样,把“aaa”等字符串拼接起来。
2.length(),跟StringBuilder的length一样,这里不过多赘述
3.toString(),这里的功能跟StringBuilder中的一样,这里也不过多赘述
4.String和StringBuilder字符拼接时候的原理
字符串String拼接时用+的原理:如果拼接的时候没有变量,都是字符串,则在编译的时候就已经是最终结果了
在拼接之前的时候如果有变量,JDK8之前底层会使用StringBuilder
意思就是它首先会在堆区new出来一个StringBuilder函数然后用append把变量和字符串拼接起来,之后在用toString返回字符串回去,其中字符串会存在串池中
在JDK8之后稍微改善了一下字符串的拼接,首先会预估一下拼接后的字符串长度,放在一个数组里,在创建字符串,但也会浪费很多时间!
字符串拼接时用StringBuilder的原理:而用StringBuilder去拼接字符串只会产生一个可变容器,这样比较节省空间和时间
StringBuilder首先会创建一个容量为16的数组,如果数组满了则会扩容成原数组容量*2+2的新数组
如果一下子存超过了原数组容量*2+2也就是34,则新容量则会以实际为准。StringBuilder的底层代码逻辑这里就不过多赘述。感兴趣的可以自行搜索。
4.谢后
感谢你的收看~,之后我也会带来更多的Java知识,如有错误欢迎指出~