这个问题在面试或者源码分析都经常出现,先不着急,让我们来了解一下Java中的数据类型。
java中的数据类型分为: 基本数据类型和引用数据类型。
基础类型
4种整数类型:int、long、byte、short
2种浮点数类型:float、double
1种字符类型:char
1种布尔类型:boolean
引用数据类型
类
接口
数组
简单来说:
对于基本类型来说,== 比较的是值是否相等
对于引用类型来说,== 比较的是两者在内存中存放的地址(堆内存地址)
运行代码,可以得到以下结果:
str1和str2的内存地址都是1174290147,所以使用==为true,但是str3和str4的地址是不同的,所以为false。
equals()
所有类都是继承于Object这个超类的,有一个equals()方法
if (this == anObject) { return true; }
这个方法很简单,就是比较对象的内存地址的。所以对象没有重写这个方法时,默认使用此方法,即比较对象的内存地址值。
由于类的多态,如果我i们重写了equals()方法,那么判断结果将为我们自己定义。下面来看下String类重写的方法:
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; }
可以看出,String的equals()方法仅仅是对比它的 数据值,而不是对象的内存地址,所以不管String对象的内存地址是否相同并不影响其结果,equals()比较的仅仅是数据值。
equals()和hashCode的关系可以看:
月薪过万的java程序员连hashCode都不知道
总结
equals()和==的区别:
==
基本类型:对比它们的值是否相等
引用类型:对比它们的内存地址是否相等
equals()
引用类型:默认情况下,对比它们的地址是否相等;如果equals()方法被重写,则根据重写过程来比较