==和equals的区别:
1、==为操作符,适用于基本数据类型和引用数据类型
如果比较的是基本数据类型,则比较的是两个变量保存的数据是否相等(不一定类型形同)
用“==”比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译报错
如果比较的是引用数据类型,则比较的是两个对象的地址值是否相同,即两个引用是否指向同一个对象实体!
用“==”
2、而equals为方法,方法只能通过对象来调用,只适应于引用数据类型
equals():为根父类Object中的方法,所有类都是继承了Object中的equals方法,Object类中的equals方法和“==”的作用是相同的,比较两个对象的地址值是否相同
但是equals方法可以重写!比如String类中的equals()方法就被重写了,比较的是两个对象的内容是否相等
举例说明“==”和“equals”的区别:
1、声明一个Customer类
public class Customer {
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
声明一个CustomerTest测试类
public static void main(String[] args) {
int i = 10;
int j = 10;
double d = 10.0;
System.out.println(i == j);//true i和j都是基本数据类型,比较的是两者的值是否相同
System.out.println(i == d);//true 同上,基本数据类型(默认往大的数据类型转换)
char c = 10; //此时的10位ASC码表里面的十进制10,
System.out.println(i == c); //true i的值和c的值相同
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//true 同上
Customer cust = new Customer("TOM",21);
Customer cust2 = new Customer("TOM",21);
System.out.println(c1 == c2);//false 声明了两个Customer对象,地址值不同
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2); //false “==”比较两个引用数据类型,比较地址值
System.out.println("***********************************");
System.out.println(cust.equals(cust2));//false 此时的equals方法为Object中的方法和“==”的作用相同
System.out.println(str1.equals(str2));//true 此时的equals方法为String类中重写的方法,比较的是实体内容是否相同
Date date1 = new Date(32432535324L);
Date date2 = new Date(32432535324L);
System.out.println(date1.equals(date2));//true 此时的equals方法为Date类中重写的方法,比较的是实体内容是否相同
}
我们可以看下Object中equals方法的源码写法:
//Object类中equals方法
public boolean equals(Object obj) {
return (this == obj); //究其根本也是通过“==”来进行判断当前对象与形参传递过来的对象地址是否相同
}
下面我们再来看下String类中重写的equals方法:
//首先需要理解的Stirng类的底层其实是char类型的数组
public boolean equals(Object anObject) {
if (this == anObject) { //首先判断当前对象的地址值和形参传递过来的对象地址值是否相同,地址相同,则实体内容 必然相同
return true; //直接返回true
}
if (anObject instanceof String) { //否则判断形参传递过来的对象是否是String类的实例
String anotherString = (String)anObject;//是的话则强制转换为String类型
int n = value.length;//获取其长度
if (n == anotherString.value.length) {//通过char[],对每个字符进行比较
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;//完全相同则返回true
}
}
return false;
}