String 、StringBuffer和StringBuilder的区别

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

三者实例
● String实例

1. package com.atguigu.gulimall.product;
  2.  
  3. public class test {
  4.     public static void main(String[] args) {
  5.         String str1 = "abc";
  6.         String str2 = "cd";
  7.         String concat = str1.concat(str2);//str1拼接str2 【abcd】 //产生新的字符串对象concat
  8.         System.out.println(str1); //str1字符串经过拼接之后还是abc,没变
  9.     }
  10. }

● StringBuffer(StringBuilder和StringBuffer相同)实例

1. package com.atguigu.gulimall.product;
  2.  
  3. public class test {
  4.     public static void main(String[] args) {
  5.         StringBuffer stringBuffer = new StringBuffer("x");
  6.         System.out.println(stringBuffer);    //输出x
  7.         stringBuffer.append('y');
  8.         System.out.println(stringBuffer);     //输出xy,同一个stringBuffer引用指向的对象的值发生改变了,没有创建新对象
  9.     }
  10. }

● StringBuffer的构造方法

1. // 定义一个空的字符串缓冲区,含有16个字符的容量
  2. StringBuffer str1 = new StringBuffer();
  3. // 定义一个含有10个字符容量的字符串缓冲区
  4. StringBuffer str2 = new StringBuffer(10);
  5. // 定义一个含有(16+4)的字符串缓冲区,"青春无悔"为4个字符
  6. StringBuffer str3 = new StringBuffer("青春无悔");
  7. /*
  8. *输出字符串的容量大小
  9. *capacity()方法返回字符串的容量大小
  10. */
  11. System.out.println(str1.capacity());    // 输出 16
  12. System.out.println(str2.capacity());    // 输出 10
  13. 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,可根据实际情况指定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值