黑马程序员--equals方法与==操作符的异同



 -------android培训java培训、期待与您交流! --------


equals方法与==操作符的异同

==操作符:

1.  引用类型比较引用(是否指向同一个对象);

例:Person p1=new Person(); Personp2=new Person();if(p1==p2){…}

2.  基本类型比较值;

例:int a=5; if(a==6){…}

注:用"=="进行比较时,符号两边的数据类型必须一致(可自动转换的基本数据类型除外),否则编译出错;

 

equals()方法:

equals()方法是Object类的方法,由于所有类都继承Object类,也就继承了equals()方法。只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。格式:obj1.equals(obj2)

特例:当用equals()方法进行比较时,对类File、String、Date及封装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象;原因:在这些类中覆盖了equals()方法。

 

为了更好的理解equals()方法和==操作符,我们用下面一段代码来说明它们的异同和特点.

public class equalsTest {
	public static void main(String args[]) {

		Person person1 = new Person("AA", 12);
		Person person2 = new Person("AA", 12);
		System.out.println(person1 == person2); // flase 
		System.out.println(person1.equals(person2));// flase 

		String str1 = new String("aaa");
		String str2 = new String("aaa");
		System.out.println(str1 == str2);// flase 
		System.out.println(str1.equals(str2));// true
												
		String str3 = "bbb";
		String str4 = "bbb";
		System.out.println(str3 == str4);// true
		System.out.println(str3.equals(str4));// true

		equalsTest et = new equalsTest();
		// System.out.println(et==person1);编译出错
	}

}

class Person {
	private String name;
	private int age;

	public Person() {
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
}

分析:

1.person1==person2和person1.equals(person2) 都返回flase是因为==操作符和equals()方法都判断person1和person2引用类型不是指向同一个对象,所以都返回flase.

2.str1 == str2和str1.equals(str2),前者返回false原因和1一样,str1和str2不是指向同一对象,而后者返回true是因为String,Date,File,及封装类类重写了equals方法, 是比较类型及内容而不考虑引用的是否为同一对象,内容相等则返回ture.

下面这是String类中重写的equals方法:

public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

它首先判断传入的对象是同一对象,如果是,直接返回true,如果不是,再判断类型是否为String类型,如果是,强制转换传入的对象为String类型,并让其与当前对象的字符逐个对比.全部相同则返回ture.其它情况都返回flase.

3.str3==str4和str3.equals(str4)都返回ture;这个和2结果不同,原因是在内存中有一个字符串缓存池,在创建str3的时候把字符串bbb放入字符串缓存池中,等到创建str4的时候,会优先去缓存池中去找,如果要初始化的值和bbb字符串一样,则直接把字符串的引用地址赋给str4,所以==操作符和quals方法都判断两个变量指向同一对象,都返回ture.

4.// System.out.println(et==person1);编译出错 :是因为==操作符进行比较时,符号两边的数据类型必须可兼容(可自动转换).


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值