zoukankan      html  css  js  c++  java
  • 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());
            }
        }
    }

  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/zjdbk/p/8994782.html
Copyright © 2011-2022 走看看