String类代表字符串,String一旦创建就不能改变,就不能改变,如果需要大量的字符串修改操作,就要到StringBuffer/StringBuilder,或者字符串数组,最终结果会被转换成为String对象。
StringBuffer是线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,通过某些方法调用就能够改变该序列 的长度和内容。
//举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。
StringBuffer sbf = new StringBuffer();
for(int i=0;i<100;i++){
sbf.append(i);
}
//上面的代码效率很高,因为只创建了一个StringBuffer对象
//而下面的代码效率很低,因为创建了101个对象。
String str = new String();
for(int i=0;i<100;i++){
str = str + i;
}
StringBuilder是在jdk5以后,为StringBuffer类补充了一个供单个线程使用的等价类。线程是不安全的。
以StringBuilder为例:
String st1= "zxs";
/**
* 第一种:如果再次定义一个String st3="zxs";
* 首先会去字符串池里面去看有没有"zxs"这个字符串
* 有的话就直接让st3这个引用指向这个字符串,否则创建一个新的
*/
//下面这种,new了几次,就创建了几次,即使创建的字符串的内容相同
String st2=new String("abc");
//StringBuilder sb="abc"; //没有此种声明方式
//StringBuilder sb = new StringBuilder();//默认为16个大小的字符容量
//StringBuilder(int capacity);有这个构造方法,所以可以改变初始的容量大小
//StringBuilder sb = new StringBuilder(100);
StringBuilder sb = new StringBuilder(); //常用方法,其余方法可查看API文档
sb.append("hello");
sb.append(10);
sb.append(10.6);
sb.append(true);
System.out.println(sb.length()); //输出字符串的长度
System.out.println(sb.capacity()); //输出容量大小,默认为16
sb.insert(5, "zxs"); //在5的地方插入字符串
System.out.println(sb.toString());
System.out.println(sb.indexOf("z")); //查找字符串
sb.replace(5, 6, "w"); //替换
System.out.println(sb.toString());
System.out.println(sb.reverse()); //倒序输出
1、 在单线程当中,与StringBuffer相比,优先考虑使用StringBuilder类,因为它支持所有相同的操作,但是它不同步,所以速度更快。
举个例子,StringBuffer是一个房间你只能进去一个人,如果第二个人进来,首先会去判断房间里面有没有人,如果有人的话,就会去等待。等第一个人出来。但是StringBuilder的话第二个人来的话不会等待,会推门直接进去。
2、String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。