• 集合 hashset


    HashSet集合介绍

    HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。

    HashSet集合存储数据的结构(哈希表)

    什么是哈希表呢?

    哈希表底层,使用的也是数组机制数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表

    object hashCode     equals

    当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。由于任何对象都是Object类的子类,所以任何对象有拥有这个方法。即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。

    总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

     HashSet存储JavaAPI中的类型元素

    给HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equals方法,因为这两个方法,在JavaAPI的每个类中已经重写完毕,如String类、Integer类等。

     

    l  创建HashSet集合,存储String对象。

    publicclass HashSetDemo {

         publicstaticvoid main(String[] args) {

             //创建HashSet对象

             HashSet<String> hs = new HashSet<String>();

             //给集合中添加自定义对象

             hs.add("zhangsan");

             hs.add("lisi");

             hs.add("wangwu");

             hs.add("zhangsan");

             //取出集合中的每个元素

             Iterator<String> it = hs.iterator();

             while(it.hasNext()){

                  String s = it.next();

                  System.out.println(s);

             }

         }

    }

    输出结果如下,说明集合中不能存储重复元素:

    wangwu

    lisi

    zhangsan

    HashSet存储自定义类型元素

     如果是自定义的类型      必须要重写hashcode  equals、

    给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

    例子

    l  创建自定义对象Student

    publicclass Student {

         private String name;

         privateintage;

         public Student(String name, int age) {

             super();

             this.name = name;

             this.age = age;

         }

         public String getName() {

             returnname;

         }

         publicvoid setName(String name) {

             this.name = name;

         }

         publicint getAge() {

             returnage;

         }

         publicvoid setAge(int age) {

             this.age = age;

         }

         @Override

         public String toString() {

             return"Student [name=" + name + ", age=" + age + "]";

         }

         @Override

         publicint hashCode() {

             finalint prime = 31;

             int result = 1;

             result = prime * result + age;

             result = prime * result + ((name == null) ? 0 : name.hashCode());

             return result;

         }

         @Override

         publicboolean equals(Object obj) {

             if (this == obj)

                  returntrue;

             if(!(obj instanceof Student)){

                  System.out.println("类型错误");

                  returnfalse;

             }

             Student other = (Student) obj;

             returnthis.age ==  other.age&&this.name.equals(other.name);

         }

    }

    l  创建HashSet集合,存储Student对象。

    publicclass HashSetDemo {

         publicstaticvoid main(String[] args) {

              //创建HashSet对象

             HashSet hs = new HashSet();

             //给集合中添加自定义对象

             hs.add(new Student("zhangsan",21));

             hs.add(new Student("lisi",22));

             hs.add(new Student("wangwu",23));

             hs.add(new Student("zhangsan",21));

             //取出集合中的每个元素

             Iterator it = hs.iterator();

             while(it.hasNext()){

                  Student s = (Student)it.next();

                  System.out.println(s);

             }

         }

    }

    输出结果如下,说明集合中不能存储重复元素:

    Student [name=lisi, age=22]

    Student [name=zhangsan, age=21]

    Student [name=wangwu, age=23]

  • 相关阅读:
    ThinkPHP模版验证要注意的地方
    js关闭子页面刷新父页面
    js替换字符指定字符方法
    Ubuntu安装后的一些配置
    Docker入门
    RabbitMQ 基本概念和使用
    JAX-WS注解
    Linux 常用命令
    ubuntu16.04 搭建 Mysql服务器
    ubuntu 安装 Tomcat
  • 原文地址:https://www.cnblogs.com/1997WY/p/10436272.html
Copyright © 2020-2023  润新知