当前位置: 技术问答>java相关
你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
来源: 互联网 发布时间:2015-03-03
本文导语: 这样讲对吗? | 给你一份我整理的equals()和==的比较 因为equals()方法是可以被重载的,但是按照java语言的本意来说:如果没有重写(override)新类的equals(),则该方法和 == 操作符一样在两个...
这样讲对吗?
|
给你一份我整理的equals()和==的比较
因为equals()方法是可以被重载的,但是按照java语言的本意来说:如果没有重写(override)新类的equals(),则该方法和 == 操作符一样在两个变量指向同一对象时返回真,但是java推荐的是使用equals()方法来判断两个对象的内容是否一样,就像String类的equals()方法所做的那样:判定两个String对象的内容是否相同,而==操作符返回true的唯一条件是两个变量指向同一对象。另外==操作符两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。首先 == 可以比较 基本类型和引用类型,而比较引用类型时, 比较首地址。 而equal 只能比较引用类型 ,比较首地址。但是 equal在比较封装类时 比较的是数据类型和值的大小
引用类型进行引用比较,但有四个类型除外:File、Date、String、封装类。对它们用equals()进行比较时,如果类型一致,且与它们相联系的内容一致,则返回true。
因为equals()方法是可以被重载的,但是按照java语言的本意来说:如果没有重写(override)新类的equals(),则该方法和 == 操作符一样在两个变量指向同一对象时返回真,但是java推荐的是使用equals()方法来判断两个对象的内容是否一样,就像String类的equals()方法所做的那样:判定两个String对象的内容是否相同,而==操作符返回true的唯一条件是两个变量指向同一对象。另外==操作符两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。首先 == 可以比较 基本类型和引用类型,而比较引用类型时, 比较首地址。 而equal 只能比较引用类型 ,比较首地址。但是 equal在比较封装类时 比较的是数据类型和值的大小
引用类型进行引用比较,但有四个类型除外:File、Date、String、封装类。对它们用equals()进行比较时,如果类型一致,且与它们相联系的内容一致,则返回true。
|
由于Java没有操作符重载,所以==只有一个意思,大概就是用来比较2个引用类型的
reference是否指向同一个“内存对象”(即内存地址是否相同),或是两个基本类型
的值是否相同
java.lang.Object::equals(...)缺省代码是这样的:
public boolean equals(Object obj) {
return (this == obj);
}
所以:
- 你如果不override equals(...)得话,就和==一样
- 你可以按照一定的策略来任意override equals(...),但要注意
这时你可能要同时override下列2个(如在EJB中):
java.lang.Object::equals(...)
java.lang.Object::hashCode(...)
有时还要override第3个:
java.lang.Object::clone(...)
即:要保持这3个行为要么都符合你的策略,要么都符合缺省的策略,
否则某些操作(如涉及java.util.Hashtable)会出现不一致的错误
reference是否指向同一个“内存对象”(即内存地址是否相同),或是两个基本类型
的值是否相同
java.lang.Object::equals(...)缺省代码是这样的:
public boolean equals(Object obj) {
return (this == obj);
}
所以:
- 你如果不override equals(...)得话,就和==一样
- 你可以按照一定的策略来任意override equals(...),但要注意
这时你可能要同时override下列2个(如在EJB中):
java.lang.Object::equals(...)
java.lang.Object::hashCode(...)
有时还要override第3个:
java.lang.Object::clone(...)
即:要保持这3个行为要么都符合你的策略,要么都符合缺省的策略,
否则某些操作(如涉及java.util.Hashtable)会出现不一致的错误