[Java基础]StringBuilder和StringBuffer

StringBuilder和StringBuffer的产生背景:

String一经初始化后,就不会改变其内容了。对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。比如:
String s = “a”;创建了一个字符串;
s = s+“b”;实际上原来的"a"字符串对象已经丢弃了,现在又产生了另一个字符串s+“b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。
相反,StringBuilder和StringBuffer是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。

StringBuilder和StringBuffer的区别:

StringBuilder是线程不安全的,相对于StringBuffer来说,效率更高,安全性低,这是由于StringBuilder内的大多方法都是不加synchronized锁的,而StringBuffer内的方法都是加synchronized锁的:
[Java基础]StringBuilder和StringBuffer_第1张图片

可变字符串常用方法:

  • 对字符串值倒序重组:reverse();
  • 对指定索引位置的字符进行替换:setCharAt(int index, char ch);
  • 在指定索引位置插入字符:insert(int offset, Object obj);
  • 删除指定区间的字符:delete(int start,int end);
  • 删除指定索引位置的字符:deleteCharAt(int index);

可变字符串和不可字符串使用时的陷阱:

  • 字符串拼接:
    • 使用String进行字符串的拼接:
      /**使用String进行字符串的拼接**/
      String str = "";
      for (int i = 0;i < 5000;i++){
          str = str + i; //相当于创建了10000个对象
      }
      
    • 使用StringBuilder进行字符串的拼接:
      /**使用StringBuild进行字符串的拼接**/
      StringBuilder sb = new StringBuilder("");
      for (int i = 0;i < 5000;i++){
          sb.append(i); //不需要频繁产生的额外的对象,既节省空间,又节省时间
      }
      

注:工作中一定不要使用String进行字符串的拼接,这样很容易导致服务器崩溃。

你可能感兴趣的:(Java基础)