java面试题:==与equals 的区别

希望对初学者有所帮助

 1、== 对于基本类型来说比较的是值是否相等,对于引用类型来说比较的是内存地址 。

      1.1 例 :基本类型数据比较

    @Test
    public void test1(){
        double i = 0.001;
        double y = 0.001;
        System.out.print(i==y);
        // 输出 true
    }

      1.2 例引用类型比较

    @Test
    public void test2(){
        Integer i = new Integer(1);
        Integer y = new Integer(1);
        System.out.print(i==y);
        // 输出false
    }

 在使用new 方式创建对象的时候 对象都处于堆内存中,而且都是新分配一块内存地址,所以i和y是 是2个不用的引用地址,而== 在用于对象比较的时候比较的是内存地址是否相等, 所以返回结果是false。

2、equals  是object类的方法 ,若要比较2个对象值(这里的值是说对象的表现特征)是否相等,则用equals 。

  2.1 首先我们来看看Object中equals方法

public boolean equals(Object obj) {
        return (this == obj);
}

从代码中可以看出,实际上 在不重写equals的情况下使用equals方法 还是在比较 内存地址 。

    @Test
    public void test3(){
        People a = new People("1","zhang3",12);
        People b = new People("1","zhang3",12);
        System.out.print(a.equals(b));
        // 返回 false
    }

 2.2 但是在实际业务中 ,我们想比较得是2个人是否为同一个人,并不是想要比较这2个对象是否为同一个。在实际应用中需要重写People对象得equals方法。

    @Override
    public boolean equals(Object obj) {

        if (this == obj) {
            return true;
        }
        if(obj instanceof People) {
            People b = (People) obj ;
            if (this.getId() == b.getId()
                    && this.getUsername().equals(b.getUsername())
                    && this.getAge() == b.getAge()) {
                return true;
            }
        }
        return false;
    }
    @Test
    public void test4(){
        People a = new People("1","zhang3",12);
        People b = new People("1","zhang3",12);
        System.out.print(a.equals(b));
        // 返回 true
    }

3、最后我们一起看下String 类的 equals方法

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

解析:首先判断比较对象和自己是否为同一个引用,若是则返回true, 然后比较对象类型,比较长度,最后将对比对象和自己都转换成char数组,遍历数组逐一比较是否相同。也就是说对于String 来说他已经重写了equals方法 在我们使用 String的equals方法的时候 就已经是在比较值而不是比较内存地址:

    @Test
    public void test6(){
        String str1 = new String("123");
        String str2 = new String("123");;
        System.out.println(str1==str2); // false
        System.out.println(str1.equals(str2)); // true

    }

猜你喜欢

转载自blog.csdn.net/qq_24739007/article/details/87692026
今日推荐