HashMap和HashSet、hashcode

在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
        }

版权声明:本文为github_26672553原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。