1.String 先来看一段代码
public class StringTest {
@org.junit.Test
public void fun(){
String a="123";
String a1="123";
String b=new String("123");
String c= new String("123");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
System.out.println(c.equals(b));//true
System.out.println(c==b);//false
System.out.println(a==a1);//true
}
}
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
那么为什么 a==a1 会为true呢?在这里其实a和a1是统一个对象,看String的源码、可以看到类是final的,内部其实也是一个final的char数组,所以String对象不能改变他的值,
String a=“123”,其实是定义了一个字符串常量,String a1=“123”,会把这个常来拿过来接着用,对String对象进行 + 操作时,也是重新生成的字符创常量,
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
2.StringBuffer 和StringBuild
StringBuffer 和StringBuil都继承自抽象类 AbstractStringBuilder 他的内部同样是一个char数组,并且是可变的,所以在做大量字符串连接操作时,比String效率会更高
而两者的区别就是Stringbuffer的方法都加了synchronized关键字,它是线程安全的,相对与Stringbuild来说效率就低一点,Stringbuild适合在对多线程没有要求的情况下
使用,一般我们都是使用Stringbuild