这是我整理出来的结果,大家要是有兴趣可以看一看:- public class TestHashSet {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String s1=new String("zhangjinyu");
- String s2=new String("zhangjin");
- System.out.println("s1==s2:"+(s1==s2));
- System.out.println("s1.equals(s2):"+s1.equals(s2));
- System.out.println("s1.hashCode()==s2.hashCode():"+(s1.hashCode()==s2.hashCode()));
- System.out.println("s1.hashCode():"+s1.hashCode());// String类重写了hashCode()
- System.out.println("s2.hashCode():"+s2.hashCode());
- Set hash_set=new HashSet();
- hash_set.add(s1);
- hash_set.add(s2);
- System.out.println(hash_set);
- System.out.println("hash_set.hashCode():"+hash_set.hashCode());// hash_set运行的hashCode()是AbstractSet中实现的
- }
- /**
- * 来浅析一下为什么hash_set.hashCode()==s1.hashCode()==s2.hashCode()?
- * 答案: 我改了下s2,发现就不会相等了,原来是这样:HashMap中的hashCode的hash算法与他的每个元素有关,上面之所以相同是因为hash_set中只有一个元素
- * //HashSet.class
- * private transient HashMap<E,Object> map;
- * private static final Object PRESENT = new Object(); // 额,是个常量,并且是final型的,这是jdk为了方便将value设为常量PRESET,因为value是可以重复的。
- * public boolean add(E e) {
- return map.put(e, PRESENT)==null; // 所以说,调用一下HashSet的add方法,实际上就是想HashMap中增加一行(key-value)记录;
- }
- ** HashMap.class **
- public V put(K key, V value) {
- if (key == null)
- return putForNullKey(value);
- int hash = hash(key); // 这里调用hash()方法计算
- int i = indexFor(hash, table.length); // 用key的hash码的int值和table的长度(也就是key-value对数)进行“与”计算
- for (Entry<K,V> e = table[i]; e != null; e = e.next) {
- // 这个table有讲究,他是transient Entry<K,V>[] table;
- * 而Entry是实际上真正存放key-value对的地方
- Object k;
- if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { // 如果存在相同的对象,则不添加,而是进行替换工作
- V oldValue = e.value;
- e.value = value;
- e.recordAccess(this);
- return oldValue;
- }
- }
- // 添加对象
- modCount++;
- addEntry(hash, key, value, i);
- return null;
- }
- ** 计算HashMap中的Key值的hash码 **
- *hash方法就是我们在数据结构中讲的散列函数。它是经过放进HashSet里面的对象作为key得到hashCode码,在进行散列得到的一个整数。
- final int hash(Object k) {
- int h = 0;
- if (useAltHashing) {
- if (k instanceof String) {
- return sun.misc.Hashing.stringHash32((String) k);
- }
- h = hashSeed;
- }
- h ^= k.hashCode(); // k.hashCode()用k对象的hashCode()得到hash码
- // This function ensures that hashCodes that differ only by
- // constant multiples at each bit position have a bounded
- // number of collisions (approximately 8 at default load factor).
- h ^= (h >>> 20) ^ (h >>> 12);
- return h ^ (h >>> 7) ^ (h >>> 4);
- }
- **** hash_set.hashCode() ****
- public int hashCode() { // 这里,说明hash_set.hashCode()的值为hash_set中每个对象的hashCode的和
- int h = 0;
- Iterator<E> i = iterator();
- while (i.hasNext()) {
- E obj = i.next();
- if (obj != null)
- h += obj.hashCode();
- }
- return h;
- }
- * */
- }
复制代码 |