前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java的Set类和Hashset类

java的Set类和Hashset类

作者头像
用户7886150
修改2021-04-23 10:47:02
7070
修改2021-04-23 10:47:02
举报
文章被收录于专栏:bit哲学院

参考链接: Java HashSet类

集合 的体系: ------------| Collection 单例集合的根接口 ----------------| List  如果是实现了List接口的集合类,具备的特点: 有序,可重复。  -------------------| ArrayList  ArrayList 底层是维护了一个Object数组实现的。 特点: 查询速度快,增删慢。 -------------------| LinkedList LinkedList 底层是使用了链表数据结构实现的, 特点: 查询速度慢,增删快。 -------------------| Vector(了解即可)  底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。   ----------------| Set  如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。 -------------------| HashSet  底层是使用了哈希表来支持的,特点: 存取速度快.  -------------------| TreeSet   如果元素具备自然顺序 的特性,那么就按照元素自然顺序的特性进行排序存储。    

无序: 添加元素 的顺序与元素出来的顺序是不一致 的。 

import java.util.HashSet;

import java.util.Set;

public class Demo1 {

    public static void main(String[] args) {

        Set set = new HashSet();

        set.add("王五");

        set.add("张三");

        set.add("李四");

        System.out.println("添加成功吗?"+set.add("李四"));

        System.out.println(set);

    }

}

运行结果: 添加成功吗?false [张三, 李四, 王五] 

  hashSet的实现原理: 往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 , 然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。  情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。   情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次 ,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行 添加。  

import java.util.HashSet;

import javax.print.attribute.HashAttributeSet;

class Person{

    int id;

    String name;

    public Person(int id, String name) {

        super();

        this.id = id;

        this.name = name;

    }

    @Override

    public String toString() {

        return "{ 编号:"+ this.id+" 姓名:"+ this.name+"}";

    }

    @Override

    public int hashCode() {

        System.out.println("=======hashCode=====");

        return this.id;

    }

    @Override

    public boolean equals(Object obj) {

        System.out.println("======equals======");

        Person p = (Person)obj;

        return this.id==p.id;

    }

}

public class Demo2 {

    public static void main(String[] args) {

    /*

        HashSet set = new HashSet();

        set.add("狗娃");

        set.add("狗剩");

        set.add("铁蛋");

        System.out.println("集合的元素:"+ set);

    */    

        HashSet set = new HashSet();

        set.add(new Person(110,"狗娃"));

        set.add(new Person(220,"狗剩"));

        set.add(new Person(330,"铁蛋"));

        //在现实生活中只要编号一致就为同一个人.

        System.out.println("添加成功吗?"+set.add(new Person(110,"狗娃")));

        System.out.println("集合的元素:"+set);

    }

 运行结果: =======hashCode===== =======hashCode===== =======hashCode===== =======hashCode===== ======equals====== 添加成功吗?false 集合的元素:[{ 编号:220 姓名:狗剩}, { 编号:110 姓名:狗娃}, { 编号:330 姓名:铁蛋}]      需求: 接受键盘录入用户名与密码,如果用户名与密码已经存在集合中,那么就是视为重复元素,不允许添加到HashSet中。

import java.util.HashSet;

import java.util.Scanner;

/*

 需求: 接受键盘录入用户名与密码,如果用户名与密码已经存在集合中,那么就是视为重复元素,不允许添加到HashSet中。

 */

class User{

    String userName;

    String password;

    public User(String userName, String password) {

        super();

        this.userName = userName;

        this.password = password;

    }

    @Override

    public String toString() {

        return "{ 用户名:"+this.userName+" 密码:"+ this.password+"}";

    }

    @Override

    public boolean equals(Object obj) {

        User user = (User)obj;

        return this.userName.equals(user.userName)&&this.password.equals(user.password);

    }

    @Override

    public int hashCode() { //  abc 123   , 123 abc

        return userName.hashCode()+password.hashCode();

    }

}

public class Demo3 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        HashSet set = new HashSet();

        while(true){

            System.out.println("请输入用户名:");

            String userName = scanner.next();

            System.out.println("请输入密码:");

            String password = scanner.next();

            //创建一个对象

            User user = new User(userName, password);

            if(set.add(user)){

                System.out.println("注册成功...");

                System.out.println("当前的用户有:"+ set);

            }else{

                System.out.println("注册失败...");

            }

        }

    }

}

   运行结果: 请输入用户名: 1 请输入密码: q 注册成功... 当前的用户有:[{ 用户名:1 密码:q}] 请输入用户名: 2 请输入密码: w 注册成功... 当前的用户有:[{ 用户名:2 密码:w}, { 用户名:1 密码:q}] 请输入用户名:

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档