# Java-Equals


# Java中如何比较两个值

# 区分equals和==

Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。所以我们不能单纯的说equals到底比较的是什么。你想知道一个类的equals方法是什么意思就是要在类中去看定义(equals的overridde)

equals()和"=="操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法,后者是操作符。由于Java不支持操作符重载(overloading),"=="的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden) 另一个需要注意的不同点是"=="习惯用于原生(primitive)类型之间的比较,而equals()仅用于对象之间的比较

总结:

  • equals通常用来比较两个对象的内容是否相等,==用来比较两个对象的地址是否相等。
  • equals方法默认等同于"=="

Java中所有的对象都默认继承自Object类,equals方法源码如下。当没有重写equals的方法时,若使用equals来判断两个对象的是否相等时(实际使用的是==),只有这两个对象指向的是同一个内存地址时,才会返回true,否则即使内容完全相同但在内存中是两个不同的内存地址也是返回false

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

所以可以归为两种情况: 1、类未复写equals方法,则使用equals方法比较两个对象时,相当于==比较,即两个对象的地址是否相等。地址相等,返回true,地址不相等,返回false 2、类复写equals方法,比较两个对象时,则根据复写之后的逻辑判断。通常,我们会将equals复写成:当两个对象内容相同时,则equals返回true,内容不同时,返回false

# 在String类中的比较

Java中String类型具有一个equals的方法可以用于判断两种字符串是否相等,但是这种相等又与运算符==所判断的"相等"有所不同

String的equals函数只要两个字符串对象所存放的内容相同时,不需要存放的内存地址相同,就返回true

那么在String类中的比较为什么不一样呢? 因为在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;
}

当我们使用字符串连接方式一般为+concat("substring")的方式创建字符串时,都会构建一个新的String对象,即在内存中开辟一个新的地址来存放,所以这个时候即使内容相同。用==判断的话,也是返回false;当我们使用等号赋值时,若内存中有该字符串,则该变量指向此内存地址二不是重新创建一个,所以此时用==时会返回true

  //测试string 类
        String hello="hello";
        String hel1=hello;
        String hel2="hel";
        String hel3=hel2+"lo";
        String hel4=hel2.concat("lo");

        //==等号测试
        System.out.println(hello==hel1); //相等
        System.out.println(hello==hel3); //不相等
        System.out.println(hello==hel4); //不相等
        System.out.println(hel3==hel4);  //不相等 会开辟新的内存

        //equals函数测试
        System.out.println(hello.equals(hel1)); //相等
        System.out.println(hello.equals(hel3)); //相等
        System.out.println(hello.equals(hel4)); //相等
        System.out.println(hel3.equals(hel4)); //相等

        //StringBuilder测试
        StringBuilder helloBuilder = new StringBuilder("hel");
        System.out.println(helloBuilder.equals(hel2)); //不相等

在StringBuilder类中比较特殊,因为StringBuilder并没有重写equals函数

陕ICP备20004732号-3