String、StringBuffer和StringBuilder区别

我用的是jdk1.8 

为什么出现StringBuffer和StringBuilder?

            String 字符串是不可变的字符序列,一旦存在,不能修改,如果出现了字符串拼接,那么不能在常量池中已经存在的字符串的内存上追加内容,必须在常量池另外开辟一块新内存来存放拼接的新的字符串内容,在实际开发中,如果有大量的拼接字符串操作,则意味着要在常量池里开辟更多的新内存来存放拼接的对象,那么方法区的内存就可能会逐渐被占满。造成内存空间的浪费,给java的方法区字符串常量池带来很大的压力。所以出现了可变的字符序列=========》StringBuffer.class和StringBuilder.class,String.class没有字符串append追加方法

           

三者实例

  • String实例
package com.atguigu.gulimall.product;

public class test {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "cd";
        String concat = str1.concat(str2);//str1拼接str2 【abcd】 //产生新的字符串对象concat
        System.out.println(str1); //str1字符串经过拼接之后还是abc,没变
    }
}
  • StringBuffer(StringBuilder和StringBuffer相同)实例
package com.atguigu.gulimall.product;

public class test {
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("x");
        System.out.println(stringBuffer);    //输出x
        stringBuffer.append('y');
        System.out.println(stringBuffer);     //输出xy,同一个stringBuffer引用指向的对象的值发生改变了,没有创建新对象
    }
}
  • StringBuffer的构造方法
// 定义一个空的字符串缓冲区,含有16个字符的容量
StringBuffer str1 = new StringBuffer();
// 定义一个含有10个字符容量的字符串缓冲区
StringBuffer str2 = new StringBuffer(10);
// 定义一个含有(16+4)的字符串缓冲区,"青春无悔"为4个字符
StringBuffer str3 = new StringBuffer("青春无悔");
/*
*输出字符串的容量大小
*capacity()方法返回字符串的容量大小
*/
System.out.println(str1.capacity());    // 输出 16
System.out.println(str2.capacity());    // 输出 10
System.out.println(str3.capacity());    // 输出 20
  • StringBuffer和StringBuilder的父类=======》AbstractStringBuilder【StringBuffer和StringBuilder执行append方法扩容时直接调的是父类的append的重载方法】

             

三者继承结构 

                                              

三者区别 

            1.三个类上都有final关键字修饰【注意用final关键字修饰,证明此类不想被继承,其类中的方法不能被重写,仅有此限制,不会限制其他的】

            2.构造参数时接收外界的字符串的char[] value前String类有final关键字修饰,StringBuffer.class和StringBuilder.class都没有final关键字修饰

            3.StringBuffer.class中的方法都有synchorinzed关键字修饰,在多线程环境下安全,StringBuilder.class没有,线程不安全,但是两者都属于可变字符序列,其使用方法几乎相同

 

  •       String.class

                       

                     

  •       StringBuffer.class

                          

                           

  •       StringBuilder.class

                              

                               

                               

建议:在使用StringBuffer可变序列时,构造其对象时,首相指明一个容量,因为默认容量是16,可根据实际情况指定 

有问题,请及时联系我,谢谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值