String、StringBuffer、StringBuilder

1.String、StringBuffer、StringBuilder三者的对比
String:不可变的字符序列;底层使用char[]存储
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
 
2.StringBuffer与StringBuilder的内存解析
以StringBuffer为例:
String str = new String();//char[] value = new char[0];
String str1 = new String("abc");//char[] value = new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的数组。
System.out.println(sb1.length());//
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16];
//问题1. System.out.println(sb2.length());//3
//问题2. 扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
         默认情况下,扩容为原来容量的2倍 + 2,同时将原数组中的元素复制到新的数组中。
        指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)
 
3.对比String、StringBuffer、StringBuilder三者的执行效率
从高到低排列:StringBuilder > StringBuffer > String
 
4.StringBuffer、StringBuilder中的常用方法
增:append(xxx)
  将指定的字符串追加到此字符序列。实现了不同类型的xxx的方法重载。
删:delete(int start,int end)
  移除此序列的子字符串中的字符
  s.deleteCharAt(s.length()-1);
  移除此序列的子字符串中的字符
改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
  使用给定 String 中的字符替换此序列的子字符串中的字符。
查:charAt(int n )
  返回此序列中指定索引处的 char 值。
插:insert(int offset, xxx)
  在指定位置插入xxx。
长度:length();
*遍历:for() + charAt() / toString()
反转:reverse()
 
关于索引:
int indexOf(String str)
  返回第一次出现的指定子字符串在该字符串中的索引。
int indexOf(String str, int fromIndex)
  从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(String str)
  返回str 在字符串最后一次出现的位置。
int lastIndexOf(String str, int fromIndex)
  返回 String 对象中子字符串最后出现的位置。
 
关于字串
String substring(int start)
  返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
String substring(int start, int end)
  返回一个新的 String,它包含此序列当前所包含的字符子序列。
 
 
原文地址:https://www.cnblogs.com/lemonzhang/p/12825668.html