1. “ == ” 的使用
“ == ” 在比较基本“基本数据类型”(byte,short,int,long,float,double,boolean,char),比较的是基本数据类型的值;
比较“引用类型”(类(class)、接口(interface)、数组(array)),比较的是引用类型在内存中的存放地址。
下面用一些例子进行验证:
1.1 基本类型比较样例
1 == 1 , 结果为 true
System.out.println( 1 == 1 );
c == c, 结果为 true
System.out.println( 'c' == 'c');
1.2 引用类型比较样例
user1 == user2 ,结果为 false 。
User user1 = new User("111", "111");
User user2 = new User("111", "111");
System.out.println(user1 == user2);
User user3 = user1;User user4 = user1; user3 == user4 ; 结果为 true 。原因:user3 和 user4 引用user1,也就user3和user4的内存地址相同。
User user3 = user1;
User user4 = user1;
System.out.println(user3 == user4);
两个数组进行比较,array1 == array2,结果为 false 。
int[] array1 = new int[3];
int[] array2 = new int[3];
array1[0] = array2[0] = 1;
array1[1] = array2[1] = 1;
array1[2] = array2[2] = 1;
System.out.print("两个数组相比较");
System.out.println(array1 == array2);
2. equals 的使用
equals用来比较引用类型,默认情况下,比较的是地址值。
不过,我们可以根据情况自己重写该方法,比较对象的成员变量值是否相同。
例如:String 就重写了 equals 方法,下面这段代码结果为 true。
public class EqualsStudy {
public static void main(String args[]) {
String s1 = new String("1");
String s2 = new String("1");
System.out.println(s1.equals(s2));
}
}
JDK8 源码中的 String 对 equals 的实现如下:
/**
* Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
*
* @param anObject
* The object to compare this {@code String} against
*
* @return {@code true} if the given object represents a {@code String}
* equivalent to this string, {@code false} otherwise
*
* @see #compareTo(String)
* @see #equalsIgnoreCase(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;
}
接下来在 User 类中 重写这个 equals 方法 。
在Idea中你可以 使用快捷键,“ alt + insert ” , 自动生成 equals()and hashCode() 。
为什么要重写 hashCode() , 如果我们使用自定义的equals取判断两个自定义对象是否相等。然后我们在用自定义对象去做hashmap的键值,会出现重复,https://www.jianshu.com/p/75d9c2c3d0c1,简书上这篇文章是讲这个问题的。
自动生成 equals()and hashCode() 的User类如下:
package equals;
import java.util.Objects;
public class User {
private String id;
private String name;
public User() {
}
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(getId(), user.getId()) &&
Objects.equals(getName(), user.getName());
}
@Override
public int hashCode() {
return Objects.hash(getId(), getName());
}
}
再进行比较测试,下面对 user1.equals(user2) 结果就是 true。
package equals;
import java.lang.reflect.Array;
public class EqualsStudy {
public static void main(String args[]) {
User user1 = new User("1", "2");
User user2 = new User("1", "2");
System.out.println(user1.equals(user2));
}
}
END。