== : 如果比较的是基本数据类型,那么比较的是变量的值
== :如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)
equals:如果没有重写equals方法比较的是两个对象的地址值。 如果重写了equals方法后我们往往比较的是对象中的属性的内容
一 、 java.lang.Object 中的 equals()方法:
public boolean equals(Object obj) {
return (this == obj);
}
二、 像String,Date等系统类中已经重写了equals方法用来比较对象中的属性的内容。
三 一般我们自定义类中都会重写equals方法用来对属性的内容进行比较。
如果没有重写equals方法那么调用的就是 Object中的equals方法用来比较两个对象的地址值。
我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较
1、基本数据类型比较
==和Equals都比较两个值是否相等。相等为true 否则为false;
2、引用对象比较
==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;
1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;
2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;
/*
* String 重写了equals方法 ;
* ==比较两变量的内存地址
*
*/
class Studen{
String name;
int id;
public Studen(String name, int id) {
super();
this.name = name;
this.id = id;
}
public String toString() {
return "姓名:"+name+" 学号:"+id;
}
public boolean equals(Object obj) {
return super.equals(obj);
// return true;
}
}
public class equals和双等比较地址 {
public static void main(String[] args) {
Studen a = new Studen("小明 ",1);
Studen b = new Studen("小明 ",1);
System.out.println(a);
System.out.println(b);
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println("====================()");
String c="hello";
String d="hello";
System.out.println(c);
System.out.println(d);
System.out.println(c==d);
System.out.println(c.equals(d));
System.out.println("==========");
int e=6;
int f=5;
System.out.println(e==f);
}
}
结果:
姓名:小明 学号:1
姓名:小明 学号:1
false
false
====================()
hello
hello
true
true
==========
false
equals()本质上还是= = 只是很多类重写了equals()方法
equals()默认使用的是引用比较,只是很多类重写了equals()让其变成了值比较,所以通常情况下equals()是值比较
*****两个对象的hashCode()相等 那么equals()一定为true吗?
hashCode()相等不一定为true,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等
长篇大论的话,我这里就不多写了,相信大家入门java 的时候就知道个大概了,这里想表述的是,如果面试官问你《关于==和equals的区别》,该怎么回答完美呢?可以这样说
总结的来说:
1)对于==,比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。