你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。 对于没有重载了equals这个方法的那些类,两个是一致的。只有重载了才有区别,如:String就重载了这个方法。所以它才是判断里面的值。所以你这样的说法是不太正确的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OKOK,那么你们能不能给出一个关于==和equals()区别的绝对正确的说法? 给你一份我整理的equals()和==的比较因为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)会出现不一致的错误 equals()方法实际上比较的是两个对象的hashCode()方法的返回值,如果两个引用指向相同的对象,那么hashCode()的返回值肯定是相同的。而如果不是相同的对象,即使来源于同一个类,也不会有相同的hashCode()值,因此默认时会与==有相同的结果。所以,如果你重载equals()方法,同时也应该重载hashCode(),以保证你认为相等的对象具有相同的hashCode()。 hashCode()是什么?干什么用的? 每一个类都会有这个方法,当其实例化时,会自动调用hashCode()为其计算出一个int值。大概类似于,这个对象的一个唯一的标示 hashCode()是产生一个唯一标示这个对象的int值,至于怎么能是唯一的,这个问题应该不难吧。 照这么说的话,hashCode()是当对象初始化后就产生了,而且不变了喽?那么请看这个程序:public class SL275{ public static void main(String args[]) { Object o1=new Object(); Object o2=new Object(); System.out.println("o1="+o1.hashCode()); System.out.println("o2="+o2.hashCode()); o1=o2; System.out.println("o1="+o1.hashCode()); System.out.println("o2="+o2.hashCode()); }}你们试试看编译后运行的结果。为什么在o1=o2;语句后,也就是o1和o2的值都是指向原来的o2初始化的对象的地址后,o1的hashCode()会变成和o2一样,不是说hashCode()是对象唯一的标识符吗?是不是因为hashCode()本身是属于对象内容的一个部分啊? o1和o2现在是同一个对象的引用,当然hashcode会一样了 这样o1=o2;也就是o1和o2都指向那个指向o2对象的内容存放的地址的指针喽?那么o1=o2后o1和o2的hashCode()相同,到底hashCode()是属于对象的内容部分,还是。? mina 框架乱码问题 简单题目 速度JF 问一个stringbuffer的问题,求大牛帮忙解答 csdn里为什么我将帖子转到别的板块后帖子在论坛里没有了? 有没有把彩色图片转换为黑白图片的方法? java怎么读取doc和rtf格式的内容到txt文件中??? JTextField的问题 为何int len=InputStream.read(temp[],begin,length)不返回-1? 一个数据类型转换问题,向诸位请教! 送分!!调用PL/SQL存储过程问题 不知java可不可以修改注册表。如果有请给一些例子 中文解决问题
引用类型进行引用比较,但有四个类型除外:File、Date、String、封装类。对它们用equals()进行比较时,如果类型一致,且与它们相联系的内容一致,则返回true。
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)会出现不一致的错误
所以,如果你重载equals()方法,同时也应该重载hashCode(),以保证你认为相等的对象具有相同的hashCode()。
至于怎么能是唯一的,这个问题应该不难吧。
public class SL275
{
public static void main(String args[])
{
Object o1=new Object();
Object o2=new Object();
System.out.println("o1="+o1.hashCode());
System.out.println("o2="+o2.hashCode());
o1=o2;
System.out.println("o1="+o1.hashCode());
System.out.println("o2="+o2.hashCode());
}
}
你们试试看编译后运行的结果。为什么在o1=o2;语句后,也就是o1和o2的值都是指向原来的o2初始化的对象的地址后,o1的hashCode()会变成和o2一样,不是说hashCode()是对象唯一的标识符吗?是不是因为hashCode()本身是属于对象内容的一个部分啊?