希望对初学者有所帮助
1、== 对于基本类型来说比较的是值是否相等,对于引用类型来说比较的是内存地址 。
1.1 例 :基本类型数据比较
@Test
public void test1(){
double i = 0.001;
double y = 0.001;
System.out.print(i==y);
// 输出 true
}
1.2 例引用类型比较
@Test
public void test2(){
Integer i = new Integer(1);
Integer y = new Integer(1);
System.out.print(i==y);
// 输出false
}
在使用new 方式创建对象的时候 对象都处于堆内存中,而且都是新分配一块内存地址,所以i和y是 是2个不用的引用地址,而== 在用于对象比较的时候比较的是内存地址是否相等, 所以返回结果是false。
2、equals 是object类的方法 ,若要比较2个对象值(这里的值是说对象的表现特征)是否相等,则用equals 。
2.1 首先我们来看看Object中equals方法
public boolean equals(Object obj) {
return (this == obj);
}
从代码中可以看出,实际上 在不重写equals的情况下使用equals方法 还是在比较 内存地址 。
@Test
public void test3(){
People a = new People("1","zhang3",12);
People b = new People("1","zhang3",12);
System.out.print(a.equals(b));
// 返回 false
}
2.2 但是在实际业务中 ,我们想比较得是2个人是否为同一个人,并不是想要比较这2个对象是否为同一个。在实际应用中需要重写People对象得equals方法。
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if(obj instanceof People) {
People b = (People) obj ;
if (this.getId() == b.getId()
&& this.getUsername().equals(b.getUsername())
&& this.getAge() == b.getAge()) {
return true;
}
}
return false;
}
@Test
public void test4(){
People a = new People("1","zhang3",12);
People b = new People("1","zhang3",12);
System.out.print(a.equals(b));
// 返回 true
}
3、最后我们一起看下String 类的 equals方法
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;
}
解析:首先判断比较对象和自己是否为同一个引用,若是则返回true, 然后比较对象类型,比较长度,最后将对比对象和自己都转换成char数组,遍历数组逐一比较是否相同。也就是说对于String 来说他已经重写了equals方法 在我们使用 String的equals方法的时候 就已经是在比较值而不是比较内存地址:
@Test
public void test6(){
String str1 = new String("123");
String str2 = new String("123");;
System.out.println(str1==str2); // false
System.out.println(str1.equals(str2)); // true
}