今天遇到一个java基础面试题:说说你对"=="和equals()的理解?根据以前的理解就简单的说了说,大致回答是:"=="是操作符,主要用于对基本数据类型的比较,如果比较两个对象的话实质是比较两个对象引用在栈内存的物理地址,而equals()是Object中的一个方法,它主要是用于比较对象是否相同,默认的方法实现与“==”操作一样,一般都是基于业务需求重写equals()方法来使用。(查了一下资料感觉说的意思大致正确 )。
相信很对小伙伴出去面试都会遇到这个问题,为了彻底弄懂,好好回顾一下java基础是十分有必要的。下面就好好的总结一下,如果有错误,希望各位看官不吝指教。
什么是“==”?
“==”是java编程语言中的一个二元操作符,用于比较原生类型和对象。原生对象指的是基本的数据类型,如int、long、short、boolean等,这个很好理解,“==”用于比较对象时,是比较对象在内存中的引用,这里就需要理解java的内存了,下面一个图简单的说明一下。
当用“==”比较obj1和obj2两个对象是否相等时实际上是比较的stack中的obj1物理地址是否等于obj2中的物理地址。
什么是equals方法?
equals()方法是Object类里面用于比较两个对象的相等性。默认的方法实现和“==”操作一样。在java中equals默认的实现:
public boolean equals(Object o) {
return (this == o);
} 。可以看出如果没有重写equals() ,“==”和equals()比较两个对象时本质是一样。
实践出真知,下面我就以上面的obj1和obj2两个对象为例,分别用“==”和equals()作比较。
Object obj1= new Object();
Object obj2= new Object();
System.out.println(obj1==obj2); false
System.out.println(obj1.equals(obj2)); false
根据上面的内存图可知,上面两个方法本质比较的是对象引用的地址,而obj1和obj2的地址不是同一个,所以结果都是false;
如果现在修改一下
Object obj1= new Object();
Object obj2= new Object();
obj1 = obj2; //此时obj1、obj2在stack中的地址相同
System.out.println(obj1==obj2); true
System.out.println(obj1.equals(obj2)); true
可以看到结果都为true,所以通过这个例子可以看出在没有重写equals()时,“==”和equals()比较对象本质是比较两个对象的地址。
上面说的都是equals()在Object中默认的方法实现去比较的,现在我们来看看一个典型的重写了equals(),这个就是我们熟悉的String类中的equals()。
String a = new String("abc");
String b = new String("abc");
System.out.println(a == b); false;
System.out.println(a.equals(b)); true;
a = b;//此时在stack中a, b地址相等
System.out.println(a == b); true;
出现这个结果是因为在String类中重写了equals(),在String中equals()规定只要引用指向的对象的内容相等,这两个对象就相等。
总结:
1)==常用于比较原生类型(基本数据类型),而equals()方法用于比较对象的相等性。
2)如果==和equals()用于比较对象,当引用地址相同时,==返回true,而equals()返回true或者false是由其重写实现来决定,最常见的一个例子是字符串的比较。