1)对于一个程序的一次执行过程中,同一个对象的hashCode计算的结果一定相同,但是对于同一个程序的不同执行过程中,不要求其hashCode一定相同。
2)对于两个对象,如果使用equals方法比较,结果为true,那么这两个对象的hashCode值一定相同
3)对于两个对象,如果使用equals方法比较,结果为false,那么这两个对象的hashCode值不要求一定不同(但是如果不同可以提高程序性能)
当我们向HashSet中add对象,它首先调用它的HashCode方法,得到这个HashCode的返回整数值,这个整数值就会映射到set里面的某一个位置。如果这个对象里没有对象存在,就把这个对象直接放发哦set里面;如果这个位置已经有对象存在了,这个时候就用equals方法比较这两个方法,如果比较结果相同,就不进行插入。比如下面问题
Set set = new HashSet();
set.add("zhangsan");
set.add("lisi");
set.add("wangwu");
set.add("zhangsan");
这个最后一个set.add("zhangsan");是无法插入成功的,因为String重写了Object的equlas和HashCode方法,按照String的HashCode方法,相同的字符串的HashCode一定是一样的
下面详细分析最后一个set.add("zhangsan")具体插入过程
1.首先根据"zhangsan"调用HashCode方法,获得一个返回值
2.Set根据这个返回值获得一个位置
3.查找这个位置上是否有对象,结果发现有一个对象。值也是“zhangsan”
4.对两个对象调用equals方法,由于String重写了equals方法,这个方法返回true。
所以最后插入失败。
|