A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

ArrayList al = new ArrayList();
Person p = new Person("lisi",19);
al.add(new Person("lisi",19);
Iterator it = al.iterator();
while(it.hasNext()){
                        Person p1 = (Person)(it.next());
System.out.println(p1==p);
我复写了Person类中的equals方法,compar方法和hashCode方法,输出都是fasle,请问 == 是否调用了Object的哪个方法,原理是什么

4 个回复

倒序浏览
这位兄弟==操作符,
对于基本数据是值比较,
对于相同类型对象是引用比较,
对于不同类型对象,那么其中一个对象的类型必须是另一个类型的父类后者子类,也就是说,必须是继承关系
对于不符合上述条件的对象在使用==比较时,编译时通不过的
回复 使用道具 举报
调用的是object的方法,比较的内存地址。
回复 使用道具 举报
==属于运算符,没有调用方法,==这个运算符表示的是比较对象的地址。
就ArrayList al = new ArrayList();
Person p = new Person("lisi",19);//这里创建了一个对象
al.add(new Person("lisi",19);//这里创建了一个对象
Iterator it = al.iterator();
while(it.hasNext()){
                        Person p1 = (Person)(it.next());
System.out.println(p1==p);
也就是说这2个对象的内存地址比较是不会相等的!如果你要true那这样
Person p = new Person("lisi",19);
al.add(p );//这里把P赋进去
Iterator it = al.iterator();
while(it.hasNext()){
Person p1 = (Person)(it.next());
System.out.println(p1==p);
回复 使用道具 举报
疑问 "=="是调用了谁的hashCode,equals还是comparaTo
==是比较运算符比较的是内存空间地址值是否相等 不会调用任何方法参与运算
ArrayList al = new ArrayList();
Person p = new Person("lisi",19);
al.add(new Person("lisi",19);
Iterator it = al.iterator();
while(it.hasNext()){
                        Person p1 = (Person)(it.next());
System.out.println(p1==p);所以这里比较的是p1 和 p在堆内存的地址是否想等 跟hashCode,equals compareTO方法没关系
结果为false
如果是System.out.println(p1.equals(p));如果你在Person类覆盖了equals方法则就按照了覆盖的方法来比较 我们覆盖equals方法是想比较对象中的元素是否想到从而对象是否想到 所以结果是true 如果没覆盖那就按照Object类的equals方法判断 更用==比较运算符一样结果false
在集和中hashCode,equals还是comparaTo方法的作用
ArrayList集合对于元素的删查工作如 removo  indexOf contains 需要判断元素是否存在  那它是怎么判断的了 它是通过调用equals方法来判断集合中是否有该元素从而进行后续操作  LinkedList 和vector也是通过equals判断 跟hashCode compareTO无关
HashSet 增删改查操作也需要判断而它是先通过hashCode方法判断hashCode是否想到 如果不想到不在进行判断结果false 如果想等 在拿相等的HashCode进行equals判断在进行后续操作  跟compareTo无关
TreeSet 的增删改查的比较是跟据compareTo方法进行的在进行后续操作跟equals和hashCode无关

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马