HashSet 详解

HashSet 总结

HashSet 特点
无序:取出和存入的顺序不一致。
唯一:集合中不存在相同的元素


注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序

A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
  执行顺序:
    首先比较哈希值是否相同
        相同:比较地址值或者继续执行equals()方法
            返回true:元素重复了,不添加
            返回false:元素不同,直接把元素添加到集合
        不同:就直接把元素添加到集合
C:如何保证元素唯一性的呢?
    由hashCode()和equals()保证的
D:开发的时候,代码非常的简单,自动生成即可。(alt+s选择生成hashCode和equals方法)
E:HashSet存储字符串并遍历
F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)



一般来说,需要重写类中的hashCode()和equals()方法,才能保证集合内元素的唯一性。
如果类没有重写这两个方法,默认使用Object()中相应的两个方法,则不能保证元素唯一性。
但是 String、Integer、Double 等类都已重写了hashCode() 和equals()方法,故可直接使用

<span style="font-size:14px;">HashSet<String> hs=new HashSet<String> ();</span>


如果集合内是自定义对象,则必须要重写hashCode()、equals()方法

   例如:HashSet集合内为 Student学生类对象


<span style="font-size:24px;"> public class Student{
           private String name;
           private int age;
           ...
************************hashCode()方法****************************************************
       Tips 1:
     * @Override
     *  public int hashCode(){
     *  
     *          return super.hashCode();
     *  }
     如果不重写,默认调用Object的hashCode方法,每个对象得到的hashCode都不同,故最终造成添加进了重复的对象


    Tips 2:
     * @Override public int hashCode(){
     *      return 0;
     *  }
     这样写,虽然能得到正确的结果(即能把重复的元素删去),但是所有的对象的hashCode都相同,
    也就意味着所有的对象都要经过equals方法再比较,才能防止添加重复对象,复杂了很多
    

    Tips 3:
     * @Override
     * public int hashCode() {
     *
     *         int num = this.name.hashCode() +this.age * 11;  //  11为任意给定的整数
     *         return num;
     * }
     这样写就能尽可能地使不同对象的hashCode不同

     Tips 4:(自动生成的标准代码)
        @Override
        public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        
        //( 31 + age ) *31 +name.hashCode();
        return result;
      }


**************************equals()方法****************************
        Tips 1:
        @overrides
        public boolean equals(Object obj){
            if(this==obj)
                return true;
            if(obj==null)
                return false;
            if(!(obj instanceof Student))
                return false;
            Student s=(Student)obj;
            return (this.name.equals(s.getName())&&this.age==s.getAge());

        }

        Tips 2:(自动生成)
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Student other = (Student) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
       }
   }</span>


--------------------------------------------------------------
-------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值