Java之“==”
Java中的“==”的作用
- 如果基本数据类型比较,则比较的是他们的值是否相等。
- 如果是应用类型比较,则比较的是地址是否相等。
int a = 10;
int b = 10;
System.out.println(a==b);
String str1 = "Jim";
String str2 = "Jim";
System.out.println(str1==str2);
由代码可见,a和b为基本数据类型,==表示值是否相等,a,b都为10所以输出true。
第二块代码比较是引用类型,由Sting的实例话知识知道,str1和str2是储存在常量池中的,所以地址肯定是一样的,输出结果也是true。
Java之“equals”
Java中的“equals”的作用
- 如果在Object类中比较,则equals比较的是地址是否相等。
- 由于String类重写了equals方法,所以比较两个字符串内容是否相同
下面我们详细讲一下equals方法。
下面代码就是具体的equals方法。
0 public boolean equals(Object anObject) {//anObject变量存放的是上转型对象地址
1 if (this == anObject) { //比较地址是否相同
2 return true;
}
3 if (anObject instanceof String) { //判断anObject变量所指向的对象是否是String类型
4 String anotherString = (String)anObject; //将上转型对象下转型
5 int n = value.length; //调用equals方法 String对象(也就是谁调用就是谁,这里是name11调用的就是name11的Char的长度)每个字符组成的Char类型数组的长度
6 if (n == anotherString.value.length) { //anotherString也就是传入的变量的长度,也就是上面的name22,name33.
7 char v1[] = value; //调用equals方法 String对象每个字符组成的Char类型数组
8 char v2[] = anotherString.value; //anObject所对应的字符串的字符构成的Char类型数组
9 int i = 0;
10 while (n-- != 0) {//进行字符比较
11 if (v1[i] != v2[i]) //对应字符不相同,则两个字符不相同
12 return false;
i++;
}
return true;
}
}
return false;
}
当我们执行下面的代码:
String name11 = "Tim";
String name22 = "TIm";
System.out.println(name11.equals(name22));
我们会发现name11去调用了这个equals方法,并传入一个参数name22,我们可以先看第0行代码public boolean equals(Object anObject) {
中anObject是要传入的变量,也就是name22,可以看到anObject变量是一个上转型对象,因为anObject(name22)是一个Object类型的变量,但是传入的name22是String类型的变量(Object类是),也就满足上转型对象的条件了,看代码第一行if (this == anObject) {
this是指name11,因为name11调用的equals方法,而这个代码的作用就是比较name11和name22的地址是否相同,地址相同了(都是常量池中的变量),内容肯定也相同,所以就返回true。说明name11和name22相等。代码到这就结束了。
当我们执行这下面的代码:
Test test = new Test();
System.out.println(name11.equals(test));
同样也会执行的到以上结果,但是我们可以发现test和name11地址显然不一样了(一个在常量池中,一个在堆中),所以if (this == anObject) {
返回false,则继续执行下面代码,当执行到第3行代码if (anObject instanceof String) {
时,这行代码的作用就是判断anObject变量所指向的对象是否是String类型,很显然,anObject所指的对象时Test类不是String类,所以返回false。下面代码就无法执行了。
当执行这下面的代码:
String name33 = new String("Tim");
System.out.println(name11.equals(name33));
同理,会执行到第3行代码,但是这时候anObject指向的对象name33是String类,所以返回true,所以继续执行下面代码,第4行代码String anotherString = (String)anObject;
作用是一个上转型对象下转型,并将其赋给anotherString这个变量,第五行代码int n = value.length;
value.length是获取调用equals方法对象的每个字符组成的Char类型数组的长度,这里是name11调用了equals方法,这里也就是获取了name11的长度,继续执行,第六行代码if (n == anotherString.value.length) {
因为name33已经赋给了anotherString,该行代码就是判断name11的长度是否等于name33的长度,如果不想等,则返回false,二者不想等。
若返回true,则两者虽然地址不同,但是长度已经相等了,接下来就要一个字符一个字符的去比较,都相同则name11和name33内容相等,也就是name11 equals name33。
第7行代码char v1[] = value;
把调用equals方法的String对象(name11)每个字符生成的Char类型数组,第八行代码char v2[] = anotherString.value;
把anObject(name33)所对应的字符串的字符生成Char类型数组。后面的代码就是进行一一比较,都相同则name11和name33内容相等。
package sun;
public class Test {
public static void main(String[] args) {
//equals 与 ==
//==;基本数据类型比较的是值是否相等;引用类型比较的是地址是否相等
int a = 10;
int b = 10;
System.out.println(a==b);
String str1 = "Jim";
String str2 = "Jim";
System.out.println(str1==str2);
//equals
//object类中equals比较的是地址是否相等,String类重写了equals方法,比较两个字符串内容是否相同
String name11 = "Tim";
String name22 = "TIm";
System.out.println(name11.equals(name22));
Test test = new Test();
System.out.println(name11.equals(test));
String name33 = new String("Tim");
System.out.println(name11.equals(name33));
}
}
/*
public boolean equals(Object anObject) {//anObject变量存放的是上转型对象地址
if (this == anObject) { //比较地址是否相同
return true;
}
if (anObject instanceof String) { //判断anObject变量所指向的对象是否是String类型
String anotherString = (String)anObject; //将上转型对象下转型
int n = value.length; //调用equals方法 String对象(也就是谁调用就是谁,这里是name11调用的就是name11的Char的长度)每个字符组成的Char类型数组的长度
if (n == anotherString.value.length) { //anotherString也就是传入的变量的长度,也就是上面的name22,name33.
char v1[] = value; //调用equals方法 String对象每个字符组成的Char类型数组
char v2[] = anotherString.value; //anObject所对应的字符串的字符构成的Char类型数组
int i = 0;
while (n-- != 0) {//进行字符比较
if (v1[i] != v2[i]) //对应字符不相同,则两个字符不相同
return false;
i++;
}
return true;
}
}
return false;
}
*/
这就是equals具体比较两个对象的内容步骤和方法。