java中String与equals,==详解

首先,String str1="abc",这个str1所指向的是常量池中的一块内存。

如果又有,String str2="abc",那么str1和str2所指向的是同一块内存。

其次,String str3=new String("abc"),那么str3所指向的是堆中的一块内存。

str3.intern(),这个方法在常量池中查找是否存在字符串"abc",如果存在的话就返回这个

地址,如果不存在,那么在常量池中生成字符串"abc",并返回该地址。

下面谈谈equals,==这两个方法

对于其他的java类,equals和==是等价的,都是比较两个引用的地址

而对于String类来说,java重写了它的equals函数,equals函数不再比较地址,而是比较其值

而==依然比较两个String引用的地址。

另外,String还从Object类继承了hashCode方法,对于其它类来说,hashCode()是以地址来进行

散列的,而String类既然重写了equals方法,自然也要重写hashCode()方法。String的hashCode()方法

是以其值来进行散列的。

public class test {     
    public static void main(String[] args) {     
        String str = "abc";     
        String str1 = "abc";     
        String str2 = new String("abc");     
        System.out.println(str == str1);//true     
        System.out.println(str1 == "abc");//true  
        System.out.println(str2 == "abc");//false     
        System.out.println(str1 == str2); //false    
        System.out.println(str1.equals(str2)); //true    
        System.out.println(str1 == str2.intern()); //true    
        System.out.println(str2 == str2.intern());  //false   
        System.out.println(str1.hashCode() == str2.hashCode());//true     
   } 
  }

这个例子做出很好的演示

原文地址:https://www.cnblogs.com/elnino/p/5853503.html