浅析==和equals的区别
编程过程中我们会经常使用==和equals,但是对其中的原理有一些迷迷糊糊的地方,这里我就来简单来说一说我的看法,借鉴了网上前辈们的一些看法,自己也有一些自己的感受,下面我就来说一下。(希望小伙伴们能够积极指正不足之处,小白勿喷,)
1. ==
1.1 返回值类型:boolean
1.2 底层原理:
1.2.1 比较基本数据类型(byte,short,int,long,float,double,char,boolean)——直接比较数值,数值一样为true,反之为false。
简单举一个例子代码如下:
int num1 = 5;
int num2 = 5;
int num3 = num1;
System.out.println(num1==num2); //true
System.out.println(num2==num3); //true
1.2.2 引用数据类型(除了基本数据类型之外的数据类型)——比较引用对象的内存地址指向是否一致。
举一个自定义实体类例子,代码如下:
//Apple为自定义的一个实体类
Apple apple1 = new Apple(100, "红富士");
Apple apple2 = new Apple(100, "红富士");
Apple apple3 = apple1;
//new关键字相当于创建一个新的对象,两个对象指向的内存地址当然不同,所以返回false
System.out.println(apple1==apple2); //false
//没有创建新的对象,相当于对象指针的传递,传递的是同一个内存地址,所以返回true
System.out.println(apple1==apple3); //true
引用数据类型中较特殊的String,代码如下:
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = s1;
String s4 = "Program" + "ming";
System.out.println(s1 == s3); //true
System.out.println(s1 == s2); //false
System.out.println(s1 == s4); //true
System.out.println(s2 == s4); //false
2. equals方法
2.1 返回值类型:同==
2.2 底层原理:
在讲equals之前我们需要知道一件事,首先我们需要明白equals是属于Object超级父类里面的一个方法,所以基本数据类型不能使用该方法,而引用数据类型(前提该引用数据类型没有重写equals方法)调用该方法的时候都是默认调用的父类里面的equals方法,下面让我们看一下Object类里面的equals方法的源代码吧。
代码如下:
public boolean equals(Object obj) {
return (this == obj);
}
(看了上面的代码我们可以知道equals底层实现还是调用的==的原理)
前面我已经强调了,前提是没有重写equals方法。
下面这个Apple类就没有重写equals方法,测试代码如下:
Apple apple1 = new Apple(100, "红富士");
Apple apple2 = new Apple(100, "红富士");
Apple apple3 = apple1;
System.out.println(apple1.equals(apple2)); //false
System.out.println(apple1.equals(apple3)); //true
其中的String就是个例外,ta就重写了equals方法,源代码如下:
public boolean equals(Object anObject) {
//1.先比较内存地址是否一致,如果一致返回true,否则就进行下一步判断
if (this == anObject) {
return true;
}
//2.判断这个对象是否是这个特定类或者是它的子类的一个实例,不一致直接返回false
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;
}
测试代码举例,如下图:
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = s1;
String s4 = "Program" + "ming";
System.out.println(s1 .equals(s3) ); //true
System.out.println(s1 .equals(s2) ); //true
System.out.println(s1 .equals(s4) ); //true
System.out.println(s2 .equals(s4) ); //true
总结: 如果我们想要在自定义实体类中也能使用equals方法,可以参照String类中的重写的模式,设计出适合实际项目开发的equals方法。