• Set接口——HashSet集合


    不重复,无索引,不能重复元素,没有索引;

    HashSet集合:

    此时实现Set接口,有哈希表(HashMap的一个实例)支持,哈希表意味着查询速度很快,

    是无序的,即元素的存取的顺序可能不一致;

    且此实现也不是同步的,即多线程的;

    其中,能用iterator迭代器因为是继承集合的祖宗类collection接口的;

    没有索引,所以不能使用普通for循环;

    不重复,所以第二个add(1)没有添加进去;

    HashSet是无序的,所以添加顺序是132,打印取出可能是123等;

    哈希值:

    HashSet存储数据的结构是哈希表,哈希表的底层是数组加链表,jdk1.8版本之后加入了红黑树;

    Object类源码中:

    其中,点hashCode和toString方法都是Object类的方法,

    打印的取出的哈希值为10进制的整数值;

    直接打印对象名的时候,默认执行打印这个对象名存储地址的toString方法,调用的是Object祖宗类的toString方法,实际是打印栈内存中对象名存储的指向堆内存对象的地址值,是16进制的,

    和它的哈希值即系统随机分配十进制的模拟逻辑地址是10进制和16进制相互转换的关系;

    如果子类覆盖重写hashCode方法:

    覆盖重写之后:

    虽然地址是一样的,但是两个对象是不等的;

    String类覆盖重写了Object类的hashCode方法:

    其中,s1和s2两个不同对象的元素一样,但是是不同的两个对象,而哈希值一样,说明String类覆盖重写了Object类的hashCode()方法;

    new String创建的String对象不在堆内存字符串常量池中,new了两次及时对象内容一样也是不同的对象,栈中引用对象名存储的是不同的地址值,但是hashCode是一样的,说明String重写Object类的hashCode()方法;正常情况下不同的物理地址值得hashCode是不一样的;

    特例: “重地” 和 “通话” 是两个特殊的字符串,内容不一样,物理地址值不一样,但哈希值一样;

    哈希表的原理解析:

    Set集合存储不重复的原理:

    不同的对象,但是对象的元素内容一样,哈希值肯定一样,也是重复的;

    特例就是 “重地” “通话” 两个字符串,哈希冲突,哈希值一样,但是元素不一样;

    HashSet集合存储自定义的元素:

    自定义的person类:

    其中,除了这两个框框中三个覆盖重写的方法,就是正常定义的一个类person;

    其中,==双等于还是比较的两个对象是不是同一个,p1和p2还是两个不同的对象;

    equals没有重写比较的是两个元素的地址值,person类中重写equals方法之前p1和p2的哈希值是不同的,重写了之后是相同的,哈希值也是地址值,和实际存储的物理地址类似,10进制和16进制的转换关系,所以两个地址值的相等不相等是一致的;
    当哈希值相同,equals为true的时候,被认为是重复对象(包含元素相同)但不是同一个对象,不存储;
    对象是封装了元素组成的,同一个元素对象不一定是同一个;

     

  • 相关阅读:
    java 多线程面试题
    finally语句块一定会被执行吗
    redis 数据结构
    哪些可以作为GC ROOT
    mybatis 源码分析--日志分析
    mybatis selectKey
    spring cache 和redis
    kafka是如何保证消息不被重复消费的
    kafka面试题及答案
    浅谈:2019 前端面试题
  • 原文地址:https://www.cnblogs.com/wmqiang/p/10660084.html
Copyright © 2020-2023  润新知