Java笔试进阶《一》

 
 
 
 
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方法。

猜你喜欢

转载自blog.csdn.net/sinat_32176267/article/details/80988794
今日推荐