我用的是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,可根据实际情况指定
有问题,请及时联系我,谢谢