• 50. Set接口和Set的实现类HashSet


    集合分类:
    -------------------| Collection 单列集合的根接口   
    ---------------| List 如果实现了List接口的集合类,具备的特点是:有序,可重复
    -----------| ArrayList ArrayList底层维护的是一个Object类型的数组,特点是:查询快,增删慢
    使用场景:如果目前的数据查询多,增删少,那么就使用ArrayList存储数据
    注意:使用ArrayList无参构造方法时,Object默认的长度时10,不够的话自动增长0.5倍
    -----------| LinkedList LinkedList底层使用了链表数据结构实现的。特点是:查询慢,增删快
    使用场景:数据查询少,增删多的时候,用LinkedList存储

    ---------------| Set 如果实现了Set接口的集合类,具备的特点是:无序,不可重复
    注意:Set接口没有get()方法,迭代器才是通用遍历集合的方法,所以我们最好使用迭代器遍历
    -----------| HashSet

    HashSet的实现原理:
        往HashSet添加元素的时候,HashSet会自动先调用元素的hashCode方法得到元素的哈希表,
        然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置
        
        情况一:如果算出元素的存储位置目前还没有元素,那么该元素可以直接存储到该位置
        
        情况二:如果算出元素的存储位置已经存在其他元素,那么会自动调用equals方法再进行比较一次
        如果equals返回ture那么就视为重复元素,不可添加,如果返回false,那么就可以添加
        
        注意:hashCode和equals方法,都是自动调用的,并不是我们手动调用(注意List接口和Set实现原理不同之处)
    -----------| ThreeSet

    下面是HashSet的实例

    class People{
        
        int id;
        String name;
        
        public People(int id , String name) {
            this.id = id;
            this.name = name;
        }
        //在现实生活中只要身份证一样那么人也就一样
        @Override
        public int hashCode() {
            //确保相同的id可以找到相同的哈希表的位置
            return this.id;
        }
        
        @Override
        public boolean equals(Object obj) {
            People p = (People)obj;
            return p.id == this.id;
        }
        //重写是为了可以输出我们需要数据模式(防止println输出时调用Object的toString方法)
        @Override
        public String toString() {
            
            return "{ 省份证:"+this.id+" 姓名:"+this.name+" }";
        }
    }
    public class Demo1 {
        
        public static void main(String[] args) {
            //创建HashSet对象
            HashSet set = new HashSet();
            set.add(new People(1001,"狗蛋"));
            set.add(new People(1002,"狗娃"));
            set.add(new People(1003,"老李"));
            //添加一个身份证一样的,姓名不一样的人
            set.add(new People(1001,"老八"));
            //使用迭代器遍历
            Iterator it =  set.iterator();
            while(it.hasNext()) {
                System.out.println(it.next());
            }
        }
    }

  • 相关阅读:
    java nb
    hdu5293(2015多校1)--Tree chain problem(树状dp)
    点击交互的四种处理
    Java实现二维码技术探讨。
    折腾开源WRT的AC无线路由之路-1
    C语言及程序设计[套餐]课程主页
    09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider
    C语言打印字母金字塔(第一行是A 第二行是ABA ……)
    成员函数的const究竟修饰的是谁
    linux pdb调试总结
  • 原文地址:https://www.cnblogs.com/zjdbk/p/8994782.html
Copyright © 2020-2023  润新知