淘先锋技术网

首页 1 2 3 4 5 6 7

1.== 可以比较基本数据类型也可以比较引用数据类型,比较基本数据类型时比较的是值是否相等,比较引用类型时比较的是引用地址是否相同

2.equals只适合引用数据类型的比较,默认情况下和==一致都是比较引用地址是否相同

3.但是很多java类库里的类都已经重写了equals方法,用来比较值是否相等,当你自己定义类时,如果没有重写equals方法,那它会是默认情况,所以要注意是不是需要重写equals方法

测试代码如下(没有重写equals方法时)

//定义一个类,生成一个有参构造,此时没有重写equals
public class EqualsObject {

    private String name;

    public EqualsObject(String name) {
        this.name = name;
    }
}
public class Test {
    public static void main(String[] args) {
        EqualsObject equalsObject1 = new EqualsObject("11");
        EqualsObject equalsObject2 = new EqualsObject("11");

        System.out.println(equalsObject1==equalsObject2);//false
        System.out.println(equalsObject1.equals(equalsObject2));//false,此时默认比较的是地址
    }
}

测试代码如下(重写equals方法之后)

public class EqualsObject {

    private String name;

    public EqualsObject(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof EqualsObject)) return false;

        EqualsObject that = (EqualsObject) o;

        return name != null ? name.equals(that.name) : that.name == null;
    }

}
public class Test {
    public static void main(String[] args) {
        EqualsObject equalsObject1 = new EqualsObject("11");
        EqualsObject equalsObject2 = new EqualsObject("11");

        System.out.println(equalsObject1==equalsObject2);//false
        System.out.println(equalsObject1.equals(equalsObject2));//true,此时比较的是值
    }
}

4.补充instanceof知识

a instanceof B a的类型与B类型必须是同类或者A与B在同一个继承分支上,且A在下层,这样才是true

//前置类
public class Test1 {

    void test(){
        System.out.println("我是:Test1");
    }
}

class Test2 extends Test1{
    @Override
    void test() {
        System.out.println("我是:Test2");
    }
}

class Test3 extends Test2{
    @Override
    void test() {
        System.out.println("我是:Test3");
    }
}

public class MainTest {

    //继承情况下的比较
    public static void main(String[] args) {

        //true
        Test2 test2 = new Test2();
        if(test2 instanceof Test1){
            System.out.println(true);
        }else {
            System.out.println(false);
        }

        //true
        if(test2 instanceof Test2){
            System.out.println(true);
        }else {
            System.out.println(false);
        }

        //Error:(17, 29) java: 不可比较的类型: java.lang.Class<capture#1, 共 ? extends reflecttest.Test2>和java.lang.Class<reflecttest.Test1>
        /*if(test2.getClass() == Test1.class){
            System.out.println(true);
        }else {
            System.out.println(false);
        }*/

        //true
        if(test2.getClass() == Test2.class){
            System.out.println(true);
        }else {
            System.out.println(false);
        }

        //true
        if(test2.getClass().equals(Test2.class)){
            System.out.println(true);
        }else {
            System.out.println(false);
        }

        //false
        if(test2.getClass().equals(Test1.class)){
            System.out.println(true);
        }else {
            System.out.println(false);
        }

        Test3 test3 = new Test3();
        //多级继承 true
        if(test3 instanceof Test1){
            System.out.println(true);
        }else {
            System.out.println(false);
        }

        //false
        if(test2 instanceof Test3){
            System.out.println(true);
        }else {
            System.out.println(false);
        }
    }
}