public class HashSetTest { public static void main(String[] args) { String s1,s2,s3 = "abc", s4 ="abc" ; s1 = new String("abc"); s2 = new String("abc"); System.out.println(s1==s2); //false System.out.println(s1.equals(s2)); //true 指向的不是一个对象,但是是同一个内容,故相等。 String a1 = "abc"; String a2 = "abc"; String a3 = "ab"; String a4 = a3+"c"; System.out.println(a1==a2);// true System.out.println(a1.equals(a2));//true System.out.println(a1==a4); //字符串常量 先构造一个StringBuilder ,引用地址肯定不一样, false ==比较的是引用的变量 **** System.out.println(a1.equals(a4));//true 比较的是地址 equals比较的是值 StringBuilder b1 = new StringBuilder("a"); StringBuilder b2 = new StringBuilder("a"); System.out.println(b1==b2);//false System.out.println(b1.equals(b2)); //false System.out.println(s3==s4);//true String d1 = "abc"; String d2 = "ab"; String b3 = "ab" + "c"; String b4 = b2 + "c"; System.out.println(d1==b3);//true System.out.println(d1==b4);//false // 其中d1 = b3 ? true;d1 = b4 ? false。String b3 = "ab" + "c"会直接在常量池中查找"abc"对象,若存在,直接引用该对象。 //而String b4 = d2 + "c"会生成新的对象,其内部实现是先new一个StringBuilder,然后 append(b2),append("c");然后让b4引用toString()返回的对象。 // 对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即使没有s3=s4这样一个赋值语句) } }
public class HashSetTest {超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等。该方法的源码如下:
public boolean equals(Object obj) { return (this == obj); }
总结:==比较的如果是基本数据类型,则比较的值引用的地址 即比较的是值的大小 如果 比较对象一般不比较引用的地址
equals 比较的是对象的话,比较的是其内存地址是否相同,除非是同一对象,否则结果都不一样。但是对于String类,Integer ,Double,Math比较的是内容因为内部重写了equals方法。