hashcode()和equals()都继承于object,在Object类中的定义为:
return ( this == obj);
}//比较的是对象的内存地址
hashCode是一个本地方法,返回的对象的地址值。
1.hashcode()和equals()是在哪里被用到的?什么用的?
HashMap是基于散列函数,以数组和链表的方式实现的。而对于每一个对象,通过其hashCode()方法可为其生成一个整形值(散列码),该整型值与数组长度取模后,将会作为数组下标,存放该对象所对应的Entry(存放该对象及其对应key值)。
equals()方法则是在HashMap中插入值或查询时会使用到。当HashMap中插入值或查询值对应的散列码与数组中的散列码相等时,则会通过equals方法比较key值是否相等,所以想以自建对象作为HashMap的key,必须重写该对象继承object的equals方法。
2.为什么要重写hashcode()和equals()?直接用原来的不行么?
Student st1 = new Student("wei","man");
Student st2 = new Student("wei","man");
正常理解这两个对象在存入到hashMap中应该是相等的,但如果你不重写 hashCode方法的话:
插入时:根据对象地址计算hash值,计算出的数组下标很有可能不相等!就会造成数组中存了很多重复内容的项。
查找时:内容相同的对象在查找时根本查不到。
如果重写了hashCode而没有重写equals方法时,
插入时:st1和st2虽然会存在数组相同的位置,但是在链表中使用equals方法比较其地址肯定不相等,所以链表中会造成重复的项。
查找时:内容相同的对象还是查不到。
此外,位置0上存放的一定是null。
参考:http://blog.csdn.net/tuolaji8/article/details/48417031