Java之“==”

Java中的“==”的作用

  1. 如果基本数据类型比较,则比较的是他们的值是否相等。
  2. 如果是应用类型比较,则比较的是地址是否相等。
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”的作用

  1. 如果在Object类中比较,则equals比较的是地址是否相等。
  2. 由于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具体比较两个对象的内容步骤和方法。