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 } }
这个例子做出很好的演示