Java ==和equals的区别:是否比较地址值

首先我们要比较的是引用类型。

==比较的是引用类型对象在内存中存放的地址。准确的说是堆内存中的地址。

而equals是基类Object自带的方法,我们写的每个类都会有这个默认的方法,你可以重写它也可以不重写。代码是:

也就是说当我们自己写的类,我们没有重写equals方法时,equals等同于==。

我们来看下一个小demo:

class A{
	int a=0;
	public A(int a)
	{
		this.a=a;
	}
	
}

public class Test {

	public static void main(String[] args) {
		
		
		A a1=new A(1);
		A a2=new A(1);
		System.out.println(a1==a2);
		System.out.println(a1.equals(a2));
	}

结果:

false false 原因:因为没有重写equals方法,所以equals等同于==。

我们来打印下它们的地址:(当没有重写toString方法的时候可以这么打印它们的地址)

System.out.println(a1);
	System.out.println(a2);

结果:

Chapter_one_02.A@6d06d69c Chapter_one_02.A@7852e922

(正常来说,你们的结果和我的不一样,但是我们需要知道的是,第一个地址和第二个地址不一样就行了,所以是false。)

然后我们再来看另一种情况:

String s1=new String("a");
String s2=new String("a");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));

结果:

false true

那么在这里为什么equals是true呢?创建两个对象,地址肯定不一样。

是因为String重写的equals方法,我们来看下String类的equals方法:

因为它重写了equals方法,所以在调用equals方法的时候,就不等同于==。

我们不能直接打印它们的地址,因为String类重写了toString方法。

总结:如果类没有重写equals方法,那么equals等同于==。

如果重写了,equals就不等同于==。

在eclipse中 鼠标方法方法名上,ctrl+ t,就可以看到源码。

如果发生Source not found ,参考:

经验分享 程序员 微信小程序 职场和发展