String类型中"=="和"equals"的区别

"=="比较的是两个字符串的内存地址。  "equals"比较的是两个字符串的实际值。

例子1.

String s1="abc";
String s2="abc";
if(s1.equals(s2)){
    System.out.println("两个字符串值相等")
}
if(s1==s2){
     System.out.println("两个字符串指向同一个内存地址");
}

此时输出:两个字符串值相等

     两个字符串指向同一个内存地址

why:当给s2赋值abc时,s2会自动去寻找有没有abc这个值得字符串。如果有,会copy  s1(包含内存地址)。如果没有,再创建一个新内存地址。

例子2.

String s1="abc";
String s2=new String("abc")
if(s1.equals(s2)){
    System.out.println("两个字符串值相等")
}
if(s1==s2){
     System.out.println("两个字符串指向同一个内存地址");
}

此时输出:两个字符串值相等

why:s2创建了一个新对象,值为abc,与s1不再是同一个内存地址,所以只输出:两个字符串相等

例子3.

String s1="abc";
String s2=new String()
s2="abc";
if(s1.equals(s2)){
    System.out.println("两个字符串值相等")
}
if(s1==s2){
     System.out.println("两个字符串指向同一个内存地址");
}

此时输出:两个字符串值相等

     两个字符串指向同一个内存地址

why: 虽然new了一个新对象,但没有在此时给值,后来赋值的时候,仍是copy 了s1的内存地址。

例子4.

String s1="abc";
String s2=new String("abc");
s2=s2.intern();
if(s1.equals(s2)){
    System.out.println("两个字符串值相等")
}
if(s1==s2){
     System.out.println("两个字符串指向同一个内存地址");
}

此时输出:两个字符串值相等

      两个字符串指向同一个内存地址

why: 调用了intern()方法,此时s2先去找有没有abc,如果有,copy 内存地址,如果没有,创建新的。

原文地址:https://www.cnblogs.com/xiao-ran/p/9829795.html