集合

集合

存放数据类型的容器,可以是引用类型
Collection接口下的

  • List
    • ArrayList
      • 允许有重复的元素出现
      • 有序的
      • 是线程不安全的,运行效率高
  • Set
    • HashSet
      • 不允许有重复的元素
      • 无序的
      • hashset的set方法不保证迭代顺序,也不保证保存后的顺序是永恒不变的(比如你存了[a,b,c],1000年后可能就变成[a,c,b]了)
      • 线程不安全,效率高
      • 允许使用null,但是只能使用一个

hashSet是如何保证不会有重复的元素的呢?

  1. 首先看对象的hashCode值
  2. 如果hashCode不重复,直接存入
  3. 如果hashCode重复,则调用对象的equals方法
  4. 调用equals返回true或者false
  5. 如果返回true,不存入
  6. 如果返回false,挂载到相同hashCode的桶的下面

例子

		HashSet<String> integers = new HashSet<String>();
        integers.add("1");
        integers.add("1");
        integers.add("1");
        System.out.println(integers);

首先看String的hashCode方法(如果是Integer就去找Integer的hashCode方法呗)

还有如果是integers.add("a"+1);这种,会先去找String的hashCode方法,然后再去找Integer的hashCode方法,然后再把两个hashCode方法得到的值加起来

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

如果hashCode不重复,直接存入
integers.add("1");重复了,所以去调用 equals

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

跟已经在集合中的"1"比较(就是第一行存进去的那个"1"),返回true,所以不放入…

HashSet()
构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值