==与equals()的区别
==
对于基本类型和引用类型的作用效果是不同的:
-
对于基本数据类型来说,
==
比较的是值。 -
对于引用数据类型来说,
==
比较的是对象的内存地址。
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
equals()
不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()
方法存在于Object
类中,而Object
类是所有类的直接或间接父类,因此所有的类都有equals()
方法。
Object
类 equals()
方法:
public boolean equals(Object obj) { return (this == obj); }
equals()
方法存在两种使用情况:
-
类没有重写
equals()
方法:通过equals()
比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是Object
类equals()
方法。(但基本数据结构无equals()方法,即只有比较地址) -
类重写了
equals()
方法:一般我们都重写equals()
方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即,认为这两个对象相等)。
举个例子(这里只是为了举例。实际上,你按照下面这种写法的话,像 IDEA 这种比较智能的 IDE 都会提示你将 ==
换成 equals()
):
String a = new String("ab"); // a 为一个引用 String b = new String("ab"); // b为另一个引用,对象的内容一样 String aa = "ab"; // 放在常量池中 String bb = "ab"; // 从常量池中查找 System.out.println(aa == bb);// true System.out.println(a == b);// false System.out.println(a.equals(b));// true System.out.println(42 == 42.0);// true
总结:
==
对于基本类型和引用类型的作用效果是不同的:
-
对于基本数据类型来说,
==
比较的是值。 -
对于引用数据类型来说,
==
比较的是对象的内存地址。
equals()方法基本数据类型无该方法,若没有重写,则比较地址,但可重写为比较属性
(常用的引用数据类型自带重写方法比较值,如:String、Date、File、包装类等,List
接口本身并没有重写 equals()
方法,但是它的具体实现类,如 ArrayList
和 LinkedList
,都重写了 equals()
方法。其他集合类似,则一般只有自定义的类需要重写equals()方法,同时注意要同时重写hashCode()方法)