equals方法
定义:equals是Object类中的方法,用来判断引用类型是否相等(默认判断地址是否相等)
注意:因为equals是java.lang.Object(默认引入java.lang包)类中的方法,所有的类都会继承这个方法,八大基本数据类型、String等子类重写了equals方法(用于判断内容是否相等)
equals()方法与==的区别
-
==判断基本数据类型时,判断值是否相等;判断引用数据类型时,判断地址是否相等
-
equals只用来判断引用类型,默认是判断地址,但是往往子类会重写equals方法用于判断值是否相等,比如String类、Integer类等等
String str1 = new String("nihao"); String str2 = new String("nihao"); System.out.println(str1 == str2);//false,地址(对象)不同 System.out.println(str1.equals(str2));//true,比较里边的内容
为什么?看下面的源码分析
在idea中查看源码:光标定位到equals方法,用快捷键ctrl + B(idea会默认配置好JDK源码)或者输入String(查哪个类重写的输入哪个子类,例:Integer),光标移动到此处,ctrl+B,左侧打开Structure寻找equals方法。
Object类中equals方法的源码
public boolean equals(Object obj) {
//this表示当前对象,判断地址/对象是否相同
return (this == obj);
}
下面是String类中equals的源码分析(JDK8)
属性:
//String的内部是用的char型数组来存储字符串
private final char value[];
equals方法:
public boolean equals(Object anObject) {//判断字符串是否相等
//this是当前对象
//this和anObject都是引用类型,此时比较的是地址是否相同,因为地址如果相同,指向的值肯定相同
if (this == anObject) {
return true;
}
//判断obj是否是String类型的对象
if (anObject instanceof String) {
//向下转型,因为要访问子类String的成员
String anotherString = (String)anObject;
//因为value是数组,可以用length得到元素个数
int n = value.length;
//两者长度一样才进行值判断
if (n == anotherString.value.length) {
//把两个对象中的value属性的元素一个个进行比较
//只要有一个不相同,就返回false
//全部相同则返回true
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类型的对象或者字符串长度不同
}