Set

作者: 发光的老金 | 来源:发表于2020-02-29 13:55 被阅读0次

    Set是元素无序并且不可以重复的集合,被成为集
    HashSet 哈希集,是Set的一个重要实现类

    主要方法

    • boolean add(E e) 如果当前列表中不存在e, 则将e加入列表
    • void clear() 从列表中删除所有元素
    • boolean contains(Object j) 判断列表中是否有元素j
    • Iterator<E> terator() 得到当前列表的遍历器
    • boolean remove(Object j) 如果列表中存在元素j,则将其从列表中删除
    • int size() 得到列表中元素的个数
      使用中我发现,在set中添加String类型的数据时,如果同时添加两个相同的字符串,那么实际上只能添加一个,因为HashSet不允许添加相同的元素。而添加两个相同的对象的时候却可以添加成功,那应该怎么处理呢?
      浅显的说,String重写了Object类的equals方法和hashCode方法。因此,在比较的时候,HashSet调用了String类中重写的equals方法和hashCode方法。因此会按照String类中定义的判断方式来比较对象是否相同。
      判断两个对象是否相等的方式
      首先两个对象的hashCode是否相等,假如相等的话,那么就认为两个对象相等
      假如两个对象的hashCode值不等,那么就通过equals方法来判断两个对象是否相等。默认的equals方法是比较两个对象指向的对象在内存中存储的地址的值是否相等。
      如果利用对象里的某个值来判断是否相同,则应该怎么处理呢?
    1. 首先需要重写hashCode方法.(必须重写hashCode方法!)
    2. 其次需要重写equals方法。
      假如只重写equals方法会出现什么情况呢?
      只重写equals方法,那么重写的equals方法是无效的!
      原因是添加对象时首先会调用父类Object类中的hashCode方法(本地方法,无法根据散列码得到对象的内存地址,但实际上,hashcode是根据对象的内存地址经哈希算法得来的)。因此两个对象的hashCode的值是不相等的!这样就会认为这是两个不同的元素.
    public class Student implements Cloneable {
        private int age;
        private String name;
    
        public Student(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Student [age=" + age + ", name=" + name + "]";
        }
    
        @Override
        public Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    
        public int hashCode() {
            return name.hashCode();
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            Student other = (Student) obj;
            return other.name.equals(this.name);
    
        }
    }
    

    这样就根据Student里的name字段判断是是否传入的是同一个学生对象。

    HashMap和HashSet的区别

    • HashMap 实现了 Map 接口而HashSet 实现了 Set 接口
    • HashMap 储存键值对而HashSet 仅仅存储对象
    • 使用 put() 方法将元素放入 map 中而HashSet使用 add() 方法将元素放入 set 中
    • HashMap 中使用键对象来计算 hashcode 值而HashSet 使用成员对象来计算 hashcode 值,对于两个对象来说 hashcode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回 false
    • HashMap 比较快,因为是使用唯一的键来获取对象而HashSet 较 HashMap 来说比较慢

    相关文章

      网友评论

          本文标题:Set

          本文链接:https://www.haomeiwen.com/subject/tkqphhtx.html