String 和StringBuffer字符串拼接

  1. package com.stringbuffer;
  2. /**
  3. * 思考:在实际的开发中,如果需要频繁拼接字符串,会有什么问题?
  4. *
  5. * 因为java中的字符串是不可变的,每一次拼接都会产生新的字符串,占用大量的方法区内存,造成内存空间的浪费
  6. * String s = "abc";
  7. * s += "hello"
  8. * 以上代码在方法区字符串常量池中创建了3个对象
  9. *
  10. * 如果以后需要字符串的拼接:建议使用JDK自带的:
  11. * java.lang.StringBuffer
  12. * java.lang.StringBuilder
  13. *
  14. * 如何优化StringBuffer的性能
  15. * 在创建StringBuffer的时候尽可能给定一个初始化容量
  16. * 最好减少底层数组的扩容次数,预估一下,给一个大一些的初始化容量
  17. */
  18. public class Demo01 {
  19. public static void main(String[] args) {
  20. StringBuffer stringBuffer = new StringBuffer();
  21. stringBuffer.append("a");
  22. stringBuffer.append("b");
  23. stringBuffer.append("c");
  24. // 数组长度一旦定了,不可变,数组前没有+final,数组空间满了,会进行数组拷贝,之前的会被垃圾回收
  25. stringBuffer.append(3.14);
  26. stringBuffer.append(true);
  27. System.out.println(stringBuffer.toString());// abc3.14true
  28. }
  29. }

StringBuilder和StringBuffer的区别

  1. package com.stringbuffer;
  2. public class Demo02 {
  3. /*
  4. StringBuffer方法都有 synchronized 修饰,表示StringBuffer在多线程环境下运行时安全的
  5. StringBuilder方法没有 synchronized 修饰,表示StringBuffer在多线程环境下运行时是不安全的
  6. */
  7. public static void main(String[] args) {
  8. StringBuilder stringBuilder = new StringBuilder();
  9. stringBuilder.append("a");
  10. stringBuilder.append("b");
  11. stringBuilder.append("c");
  12. System.out.println(stringBuilder.toString());
  13. }
  14. }