String StringBuffer StringBuilder
1<,String
String str1 = "hello";
str1 = str1+" world";
System.out.println(str1);//str1额外生成一个对象
对这段代码进行反汇编
可以看出用invokevirtual调用了StringBuilder的构造函数创建了一个StringBuilder对象。第二句调用了StringBulider 的append方法,最后再调用toString方法返回了一个新的String对象。
因此执行这段代码之后Str1的地址已经发生改变,它已经是新的一个String对象了。
2<,StringBuilder
StringBuilder str3 = new StringBuilder("hello");
str3.append("world");//append 新的对象
System.out.println(str3);
对其反汇编
可以看出仅仅调用了append方法进行字符串相加,并没有产生 新的对象。
StringBuilder 和String都是创建一个StringBuilder对象,那么它们有什么区别呢?
循环的情况下
这个时候StringBuilder明显更好一点,因为它只会创建一个StringBuilder对象。
3>,StringBuffer
StringBuffer str2 = new StringBuffer("hello");
str2.append("world");//append 新的对象
System.out.println(str2);
对其进行反汇编
看出来StringBuffer也是调用了其append方法,并没有产生一个新的对象。
我们查看源码
发现StringBuffer里面的方法都是synchronized定义的,(synchronized是Java中的关键字,是一种同步锁保护线程安全)
所以在多线程时我们应该使用StringBuffer,在单线程时使用StringBuilder。
一些方法:
append方法:字符串拼接
toString:返回一个String对象
subString():截取字符串
System.out.println(str3.substring(3,5));
CharAt():返回下标对应的字符
System.out.println(str3.charAt(3));
indexOf():查找字符
System.out.println(str3.indexOf("o"));
String.intern()方法:
先去常量池里找当前字符串的引用并返回该字符串在常量池当中的引用
String str3 = new String("abcd");
String str4 = str3.intern();
String str5 = "abcd";
//native C++/c编写的
System.out.println(str4 == str5);
在JVM中表示