• java 集合(Set1)


    ----------------|Collection(为什么要画这个图?学多了之后该忘了)

    --------------------------|List

    ----------------------------------------|ArrayList

    ----------------------------------------|LinkedList

    ----------------------------------------|Vector

    ---------------------------|Set

    ----------------------------------------|HashSet

    ----------------------------------------|TreeSet

    Set:

    特有的方法在前面有接触。所以没有太特别的方法(查看API)

    哈希表:有行有列的才能称为表,可以把哈希表想成那种普通的表格,

        而哈希码可以简单的理解为地址,每当new 出一个对象调用

        其hashCode方法时,会算出该对象所对应的哈希值,然后

        对照着哈希值填入哈希表(就是在内存中找到自己的位置),

        也就是通过元素的哈希值通过等位移运算,算出该元素在哈希表中

        的储存位置。

        哈希表的一个特点是“桶式结构”(一个坑里可以填多个萝卜),

        这里所说的坑就好比与哈希表的一个个小格,萝卜就好比于你创建的对象。

        就是在集合里的元素啦。问题来了,如果这时没有重写hashCode方法,两个一样的对象

        就会被填入一个格中,这就与Set集合的特点(有序,不重)相违背,

        相当于有重复的元素,所以要重写hashCode方法。


    hashSet的实现原理:

    向HashSet 添加元素时,HashSet先调用hashCode方法,算出哈希值

    找到该元素在哈希表的储存位置。

    情况1:算出元素的存储位置同时没有任何元素存储在这,则该元素可以存储在该位置上。

    情况2:如果位置上有了元素,这是会调用equals方法,与该位置的元素再比较一次,

              如果返回true,该元素就是重复的,不能添加。返回false可以。

    import java.util.*;
    import java.util.ListIterator;
    public class ex12 {
        public static void main(String[] args) {
    
            HashSet set = new HashSet();
            set.add(new Person(100, "Tom"));
            set.add(new Person(101, "Jack"));
            set.add(new Person(102, "LiLi"));
            System.out.println(set);//此时运行输出的不是你想的,要重写toString()
            System.out.println();//打印空行,为了好看
            set.add(new Person(101, "Tom"));
            System.out.println(set);//明明是一样的为什么还可以填进去呢? 去重写hashCode()
                                    //还是没用  去重写equals()
        }
    }
    
    class Person {
        int id;
        String name;
    
        public Person(int id, String name){
            this.name = name;
            this.id = id;
        }
    
        @Override
        public String toString() {
            return "{ id = " + this.id  + " name = " + this.name + " }";
        }
    
        @Override
        public int hashCode() {
            System.out.println("----------hashCode-----------");//方便看出分别调用了词hashCode 和  equals()
            return this.id;
        }
    
        @Override
        public boolean equals(Object obj) {
            System.out.println("----------equals-----------");
            Person p = (Person)obj;
            return this.id == p.id;
        }
    }
    ----------hashCode-----------
    ----------hashCode-----------
    ----------hashCode-----------
    [{ id = 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name = LiLi }]
    
    ----------hashCode-----------
    ----------equals-----------
    [{ id = 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name = LiLi }]
    
    Process finished with exit code 0

        

        

  • 相关阅读:
    vlc-ts
    es 模板
    zookeeper 启动脚本
    received shard failed for shard id
    gitlab runner 配置
    kafka 配置文件注释
    logstash 统计告警
    BigBao 的python开发到DevOps 之路
    logstash 自动重新加载配置
    rsyslog 传输日志
  • 原文地址:https://www.cnblogs.com/lifehrx/p/5797615.html
Copyright © 2020-2023  润新知