为什么出现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,可根据实际情况指定