String StringBuffer StringBuilder
注:拼接字符串的五种方法
- String a = “c” + “d”; //内部把String转换为StringBuilder调用append()方法,由于Sting对象每拼接一次要创建一个对象,频繁修改字符串不建议使用
- new StringBuilder.append(“a”).append(“d”);//频繁拼接字符串,建议使用
- new StringBuffer.append(“a”).append(“d”);//加上synchronized线程同步
- StringUtils.join(new String(“a”),",");
- new String(“a”).concat(“d”);
String
- String是一个被final修饰的最终类,hash没有被final修饰,每次修改字符串都会创建对象
注:String中拼接字符串“+”,其实是把String对象转换为StringBuilder对象然后调用StringBuilder.append()方法进行拼接
StringBuffer
- StringBuffer是为了解决频繁字符串拼接而出现的类
- 提供了append和add方法,将字符串添加到已有序列的末尾或者指定位置
- 一个线程安全的可修改的字符序列,所有修改数据的方法都加上了synchronized
- 继承了AbstractStringBuilder,底层是可修改的char[](JDK1.9之后为byte[])
StringBuilder
- JDK1.5发布
- 去掉了线程安全的StringBuffer
- 继承了AbstractStringBuilder,底层是可修改的char[](JDK1.9之后为byte[])
String StringBuilder StringBuffer的使用
- 速度从快到慢 StringBuilder StringBuffer String
- 大量字符串拼接且知道字符串大小,使用new StringBuffer或者StringBuilder的时候设置好capacity,避免多次扩容
字符串常量池
- String aa = “aa”;去检查常量池是否有此字符串,若存在则直接引用,反之在常量字符串再放入常量池
- String aa = new String(“aa”);直接在堆中创建对象,不会放入常量池
总结
- 在字符串不经常改变的情况下使用String
- 单线程且频繁的拼接字符串操作使用StringBuilder(比如JSON的封装)
- 多线程且频繁的拼接字符串操作使用StringBuffer(http参数解析和封装等)