String和StringBuilder和StringJoiner的使用和内部逻辑的实现

今天我们又来学习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知识,如有错误欢迎指出~

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值