通常比较的数据分为:
基本数据类型 :boolean、float、char、byte、short、int、long 、double
(其中boolean 不能参与 == 运算符的比较)
引用数据类型 :类,接口,数组
1、 == :
当比较的是基本数据类型时,== 比较的是两个变量的值是否相等;(可以是相同或者不同的数据类型相互比较)
int a = 5;
double c = 5.0;
char i = 5;
System.out.println(c==a);//输出:true;
System.out.println(a==i);//输出:true;
如果比较的是引用数据类型,== 比较的引用所指向的地址值是否相等。
public class Test {
public static void main(String[] args) {
People p1 = new People(16, "小明"); //创建一个对象p1;
People p2 = new People(16,"小明"); //创建一个对象p2;
System.out.println(p1==p2); //输出:false
People p3 = p1;
System.out.println(p1==p3); //输出:true
}
}
class People{
int age;
String name;
public People(int age, String name) {
this.age = age;
this.name = name;
}
}
第一次比较 p1和p2,虽然两个对象的属性是相同的,但在 new 创建对象时系统会为对象在堆中分配一个地址,而创建的对象就指向这个地址,所以p1,p2是指向两个不同的地址返回false;
第二次比较p1和p3,程序中声明了一个p3,并且将其指向了p1,因为p1是引用数据类型,所以p1和p3指向同一个地址,所以返回true。
2、 equals :
对于 equals 来说在Object类中其本质也是 ‘ == ’,但一些类对equals语句进行了重写,如String、Date、File、包装类等。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
String类中对equals方法重写,比较的是内容;
String p1 = new String("小明");
String p2 = new String("小明");
System.out.println(p1.equals(p2));//true
People类在定义中没有重写equals,其功能等同于 == 。
People p1 = new People(16, "小明");
People p2 = new People(16,"小明");
System.out.println(p1.equals(p2));//输出:false;
简而言之,如果类重写equals语句则比较内容,若没有则等同于 == 。
String类对equals重写的源码
public boolean equals(Object anObject) {
//判断地址是否相同,相同就返回true
if (this == anObject) {
return true;
}
//地址不同,判断传进来的参数是否是字符串类型
if (anObject instanceof String) {
//强转,才能调用String中特有方法
String anotherString = (String)anObject;
//value是字符数组
int n = value.length;
//判断长度是否相同,不同直接返回false
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
//不知道需要循环多少次,用while
while (n-- != 0) {
//比较每一个字符,不相等就返回false
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}