假设一下一个HashSet集合:
HashSet set = new HashSet() ;
set.add(new String(“abc”)) ;
set.add(new String(“abc”)) ;
set.add(new String(“bbc”)) ;
set.add(new String(“bbc”)) ;
哈希表
在存储是会先调用对象哈希值new String(“abc”).hashCode(); 96354;
集合在容器内进行搜索,有没有和96354一样的哈希值;
如果没有,就会存在索引的上面;
再次存储的时候调用对象哈希值:
new String(“abc”).hashCode(); 96354;
集合在容器内找到了,已经有一个对象也是96354;
集合会让后来的对象new String(“abc”)调用方法equals(已经有的对象)
此时两个对象的哈希值是一样的;而且equals方法返回值为true ;此时集合判定元素重复;
此时继续存储一个数据new String(“adc”);
集合继续调用对象方法:
new String(“abc”).hashCode(); 假设此时Hash值也是 96354(假设值);
此时集合去容器中找,有没有96354的对象,找到有,
此时集合会让后面的对象new String(“abc”)调用方法equals(new String(“adc”));
此时结果是f,
两个对象new String(“abc”)和new String(“adc”)哈希值相同;但是equals结果fasle;
集合判定对象没有重复;采用了”桶”的存储方式;
判断后如果没有的话就会和链表一样连接到下面,由于加载因子是0.75;存到16*0.75满后数组扩容;
加载因子另叙;