一、基本类型
对于java中的简单类型int,如若比较两个值的大小只能用“==”。
int n1 = 10;
int n2 = 10;
if(n1 == n2){ //相等
System.out.println("n1 == n2");
}
二、JDK自带的类
比如ArrayList、HashMap等等类型,“==”比较的是两个对象的类型,equals比较的是对象中的值是否相等。
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(1, 2, 3);
if (list1 != list2) {//list2和list1不是同一个对象
System.out.println("list1 != list2");
}
if (list1.equals(list2)) {//list2和list1对象中的值相等
System.out.println("list1.equals(list2)");
}
输出结果:
list1 != list2
list1.equals(list2)
但是,String类型的对象很特殊
如果new一个String对象,用法同上;如果只是定义一个对象,则从字符串池中拿字符。
1. new 一个String对象
String s = new String("hello");
String ss = new String("hello");
if (s.equals(ss)) { //两个对象中的值相等
System.out.println("s.equals(ss)");
}
if (s != ss) { //两个对象不相等
System.out.println("s != ss");
}
输出:
s.equals(ss)
s != ss
2.定义一个String对象
/*s和ss都从字符串池中拿字符串,"hello world"在字符串池中已经分配好了一块内存,现在s和ss都指向了字符串池中同一块内存,多以两个对象是相等的*/
String s = "hello world";
String ss = "hello world";
if (s.equals(ss)) {//两个对象中的值相等
System.out.println("s.equals(ss)");
}
if (s == ss) {//两个对象相等
System.out.println("s == ss");
}
输出:
s.equals(ss)
s == ss
三、自定义的类
自定义的类如果没有继承JDK自带的类或者没有重写Object中的equals方法,则“==”和equals()方法事项的功能相同,都是比较两个对象是否相同。
1、例如自定义了一个Customer类,默认继承了Object类,但没有重写equals方法
public class Customer {
}
测试方法如下:
Customer c1 = new Customer();
Customer c2 = new Customer();
if (c1 != c2) {//c1和c2是两个不同的对象
System.out.println("c1 != c2");
}
if (!c1.equals(c2)) {//Customer没有实现equals方法,实质也是比较的c1和c2两个对象是否相等
System.out.println("!c1.equals(c2)");
}
输出:
c1 != c2
!c1.equals(c2)
由此可知,自定义的类,如果没有实现equals方法的话,则“==”和equals()实现的功能相等。Customer没有重写equals方法,则默认调用Object中的equals方法。Object中的equals方法的源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
源码中也是通过“==”直接比较两个对象是否相等,因此equals()方法 和“==”实现的功能相等,都是直接比较两个对象是否相等。
2、例如自定义了一个Customer类,默认继承了Object类,但重写equals方法
public class Customer {
private String name;
public Customer(String name) {
super();
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (null == obj) {
return false;
}
Customer objCustomer = (Customer) obj;
if (this.name.equals(objCustomer.name)) {
return true;
}
return false;
}
}
测试方法如下:
Customer c1 = new Customer("lzj");
Customer c2 = new Customer("lzj");
if (c1 != c2) {//c1和c2是两个不同的对象
System.out.println("c1 != c2");
}
if (c1.equals(c2)) {//实质是比较两个对象中的name的值是否相等
System.out.println("c1.equals(c2)");
}
输出如下:
c1 != c2
c1.equals(c2)
由于Customer重写了自己的equals()方法,因此两个对象进行equals比较的时候,实质是比较的重写的equals()方法中定义的逻辑。本例中比较c1.equals(c2)
实质是比较的两个对象中属性name的值是否相等,因此返回true。