HashMap和HashSet、hashcode

来源:互联网 发布:中国网络日报有无权威 编辑:程序博客网 时间:2024/05/20 06:26

在Java中集合除了有Collection还有Map

Collection包括:List(ArrayList、LinkedList、Vector)、Queue、Set
Map包括:HashMap、HashTable、TreeMap、WeakHashMap。

HashMap

线程不安全

        Map<String,String> map = new HashMap<String,String >();        map.put("name","zhangsan");        map.put("name","jack"); // 同一个key,后面的会覆盖前面的        System.out.println(map.get("name"));        // 遍历集合        map.put("age","19");        Set<String> set = map.keySet();  // 使用map.keySet()来遍历        for (String s : set){            System.out.println(s); // 打印key值        }

也是在import java.util.*包里。

HashSet

      Set<String> set = new HashSet<String>();      set.add("jack");

的内部也是调用的HashMap的方法,可以说没有HashMap就没有HashSet。

与HashMap不同的地方:

        set.add("jack"); //相同的值不会再加入        set.add("jack"); //相同的值不会再加入

相同的字符串不会再次加入,所以只有一个”jack”值存在。

那么添加对象呢?

        set.add(new Product(101,"java"));        set.add(new Product(102,"php"));        set.add(new Product(101,"java"));        for (Product p :set){            System.out.println(p.getId()+"=="+p.getName());        }

尝试添加3个Product对象,其中2个对象数据是相同的,但还是添加进去了。
因为对象的内存地址是不同的。

hashCode

是通过一定的算法计算出一个散列值。
上面3个Product对象,其最后的hashCode值是不一样的,这个hashCode值是用来作为key保存HashSet的add()方法的数据的。

更多内部原理,可以去看源码。^_^

看了源码我们知道,如果要判断2个对象内容是否相等,可以重写2个方法。
我们重写Product类下面2个方法:

    @Override    public int hashCode() {        return (this.getName()+String.valueOf(this.getId())).hashCode();    }    @Override    public boolean equals(Object obj) {        Product product = (Product)obj;        if (this.getId()==product.getId() && this.getName().equals(product.getName())){            return true;        }        return false;    }

现在加入相同的数据,就不会重复了:

      Set<Product> set = new HashSet<Product>();        set.add(new Product(101,"java"));        set.add(new Product(102,"php"));        set.add(new Product(101,"java"));        for (Product p :set){            System.out.println(p.getId()+"=="+p.getName());            //打印:            // 102==php            //101==java        }