Collection(Set)

本文介绍HashSet集合的特点,包括不重复元素、不保证顺序等,并详细解释了其内部实现机制,如哈希表支持、数据唯一性的保证方式。此外,还提供了实例代码,展示了如何通过重写hashCode和equals方法确保对象正确添加到HashSet中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  •            Set集合中不包含重复的元素,不保证元素输出的顺序
               接口实现类:HashSet:
               *  此类实现Set接口,由哈希表(实际为HashMap实例)支持。
               *  对集合的迭代次序不作任何保证; 特别是,它不能保证订单在一段时间内保持不变。
               *  这个类允许null元素。
               *  查询速度比List快
               *  保证数据唯一性
               * 
               *  插入数据:在对比数据的时候,首先会调用hash算法来确定位置,
               *  如果位置相同,就调用equals方法来判断,若还是相同就不添加,反之。
               * 
               *  HashSet 的计算方法:Hash表的存入
               *  每一个存入的值都是通过各自的属性来计算出hashcode
               * 
               *  当要存入很多同一个类的实例对象,需要重写该类的equals方法和hashCode()方法
    重写hashCode()方法

    //   重写该类的          hashCode()方法:用于计算得出唯一的hash值,用于在 set中 计算出位置
         @Override
         public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + age;
              result = prime * result + ((name == null) ? 0 : name.hashCode());
              return result;
         }
    重写equals方法

    //   重写equals方法
         @Override
         public boolean equals(Object obj) {
              if(obj == null){
                  throw new IllegalArgumentException("参数不能为空");
              }
              if(!(obj instanceof Person)){
                  throw new IllegalArgumentException("参数类型不是Person");
              }
              Person person = (Person)obj;
       return (person.getAge() == this.age && person.getName().equals(this.getName()));
         }

    重写toString()方法

    @Override
         public String toString() {
              return "Person [age=" + age + ", name=" + name + "]";
         }

    使用set :

    Set set = new HashSet();

              set.add(new Person(1,"szk"));
              set.add(new Person(2,"smy"));
              set.add(new Person(3,"lll"));
              set.add(new Person(4,"zmq"));
              set.add(new Person(1,"szk"));
              set.forEach(System.out::println);
              System.out.println("是否包含指定元素:"+set.contains(new Person(1,"szk")));
              System.out.println("返回set的大小:"+set.size());
              System.out.println("Iterator:迭代器输出:");
              Iterator iterator = set.iterator();
              while(iterator.hasNext()){
                  System.out.println(iterator.next());
              }

    控制台输出:
    Person [age=1, name=szk]
    Person [age=4, name=zmq]
    Person [age=3, name=lll]
    Person [age=2, name=smy]
    是否包含指定元素:true
    返回set的大小:4
    Iterator:迭代器输出:
    Person [age=1, name=szk]
    Person [age=4, name=zmq]
    Person [age=3, name=lll]
    Person [age=2, name=smy]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值