zoukankan      html  css  js  c++  java
  • 【HashSet:重写比较方法示例一】

    package com.yjf.esupplier.common.test;
    
    import java.util.HashSet;
    
    /**
     * @author shusheng
     * @description
     * @Email shusheng@yiji.com
     * @date 2018/12/14 14:11
     */
    public class HashSetDemo {
        /**
         * 需求:存储自定义对象,并保证元素的唯一性
         * 要求:如果两个对象的成员变量值都相同,则为同一个元素。
         * 
         * 目前是不符合要求的:因为我们知道HashSet底层依赖的是hashCode()和equals() 方法
         * 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类的。
         * 这个时候,他们的哈希值是不一样的,根本就不会继续判断,执行了添加操作。
         */
        public static void main(String[] args) {
            //创建集合对象
            HashSet<Student> hs = new HashSet<Student>();
            Student s1 = new Student("林青霞", 27);
            Student s2 = new Student("王祖贤", 21);
            Student s3 = new Student("柳岩", 23);
            Student s4 = new Student("林青霞", 27);
            Student s5 = new Student("范冰冰", 32);
            Student s6 = new Student("林青霞", 27);
    
            //添加元素hs.add(s1);
            hs.add(s2);
            hs.add(s3);
            hs.add(s4);
            hs.add(s5);
            hs.add(s6);
    
            for (Student s : hs) {
                System.out.println(s.getName() + "---" + s.getAge());
            }
        }
    }
    
    class Student {
    
        private String name;
        private int age;
    
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        /**
         * 如果对象的哈希值相同了,就会走equals()方法进行比较对象的成员变量是否相同
         * 如果不同,就添加到集合,如果相同,就不添加
         * 哈希表:是一个元素为链表的数组,综合了数组和链表的好处。如何优化代码:
         * 让对象的哈希值尽可能的不同。哈希值和哪些内容相关呢?
         * 和对象的成员变量值相关。
         * 所以,我们的最终解决方法就是把对象的成员变量值进行相加: 如果是基本类型,就直接加值。
         * 如果是引用类型,就加哈希值。
         */
        @Override
        public int hashCode() {
            return this.name.hashCode() + this.age * 113;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
    
            if (!(obj instanceof Student)) {
                return false;
            }
    
            Student s = (Student) obj;
            return this.name.equals(s.name) && this.age == s.age;
        }
    
    }
    终身学习者
  • 相关阅读:
    主从热备+负载均衡(LVS + keepalived)
    这12行代码分分钟让你电脑崩溃手机重启
    Linux 下虚拟机——Virtual Box
    软件著作权登记证书申请攻略
    ecshop整合discuz教程完美教程
    NetHogs——Linux下按进程实时统计网络带宽利用率
    深入研究CSS
    SSH远程会话管理工具
    nginx防止SQL注入规则
    mysql完美增量备份脚本
  • 原文地址:https://www.cnblogs.com/zuixinxian/p/10340897.html
Copyright © 2011-2022 走看看