一.为什么会有StringBuilder和StringBuffer?
这就要引出字符串修改的相关问题
先来看一段代码
public static void main(String[] args) { String s = "hello"; s += " world"; System.out.println(s); // 输出:hello world }
但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。比如:如果在循环中使用+号对字符串进行拼接,加入循环100次,就要创建100个临时对象,然后进行拼接,这种效率是极其低下的。
既然有问题,那么我们就可以解决他,也就是想办法将效率提高
二.StringBuilder和StringBuffer的使用
public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); StringBuilder sb2 = sb1; sb1.append("world"); //helloworld sb1.append(123);//可以拼接数字 helloworld123 System.out.println(sb1 == sb2); // true System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h System.out.println(sb1.length()); // 获取字符串的有效长度13 System.out.println(sb1.capacity()); // 获取底层数组的总大小 21 sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Helloworld123 sb1.insert(0,"Hello world--!");//在数组开头插入字符串 System.out.println(sb1); //Hello world--!Helloworld123 System.out.println(sb1.indexOf("Hello"));//获取Hello第一次出现的位置 System.out.println(sb1.lastIndexOf("hello"));//获取hello最后一次出现的位置 sb1.deleteCharAt(0); // 删除首字符 sb1.delete(0,5); // 删除[0, 5)范围内的字符 System.out.println(sb1); }
从上述例子可以看出: String 和 StringBuilder 最大的区别在于 String 的内容无法修改,而 StringBuilder 的内容可 以修改 。频繁修改字符串的情况考虑使用 StringBuilder。注意: String 和 StringBuilder 类 不能直接转换 。如果要想互相转换,可以采用如下原则 :String 变为 StringBuilder: 利用 StringBuilder 的构造方法或 append() 方法StringBuilder变为 String: 调用 toString() 方法。
String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象
答案是 第一个会创建2个对象,一个是常量池ab对象 ,一个是在堆上的对象
第二个会创建5个对象