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
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值