String:它是一个常量,对字符串的拼接无非就是创建多个字符串对象而已
创建字符串的方式:
String str=”abc”;(推荐使用这种方式,会节约内存空间)
String str = new String(“abc”);
StringBuffer:线程安全的字符串缓冲区
StrtingBuilder:功能和StringBuffer一模一样,唯一的区别是线程不安全.(单线程效率比较高,多线程以后我们自己加锁解决并发的问题,所以动态字符串只要掌握StringBuilder即可)
StringBuilder和String的区别?
String是常量,一旦声明了就不能改变了.
StringBuilder底层是一个字符数组,只要数组没有放满,就可以继续对这个数组的空间进行增删改操作,不会开辟新的空间,只有默认的数组放满了才会开辟新的一块数组空间,把原数组中的数据拷贝到新创建的数组中.
如何创建StringBuilder?
StringBuilder sb = new StringBuilder();//长度默认为16个
StringBuilder sb = new StringBuilder(32);//直接给定初始数组大小
StringBuilder sb = new StringBuilder(“abc”);//初始大小,是字符串的长度加16
示例代码:
public class StringDemo {
public static void main(String[] args) {
/*String str1 = "abc";
String str2 = "abc";//先到常量池找有没有这个常量,有的话直接返回地址,没有的
//在常量池中创建
//String是引用数据类型,在栈和堆中都会分配空间
System.out.println(str1 == str2);//两个变量中的地址是否一样 true
System.out.println(str1.equals(str2));//比的是指向的字符串的内容是否一样 true
System.out.println("---------------------------------------");
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3 == str4);//指向两块不同的空间,所以变量中的地址肯定不一样false
System.out.println(str3.equals(str4));//true*/
/* String str="abc";
str=str+"d";
System.out.println(str);*/
StringBuilder sb = new StringBuilder();//创建一个动态字符串(底层是一个长度为16的字符数组)
String str = null;
sb.append("abc");
sb.append("abc");
sb.append("abc");
sb.append("abc");
sb.append("abc");//给动态字符串赋值(只要不操作16个操作的是同一个字符数组)
sb.append("abc");
sb.append(str);
System.out.println(sb);
System.out.println(sb.length());//动态字符串的字符个数
System.out.println(sb.capacity());//动态字符串的容量
StringBuilder sb1 = new StringBuilder("abc");
}
}