游客您好
第三方账号登陆
  • 点击联系客服

    在线时间:8:00-16:00

    客服电话

    020-85534346

    电子邮件

    81058337@qq.com
  • 码云社APP

    随时掌握码云社动态

  • 扫描二维码

    关注砺锋微信公众号

推荐阅读
鸿buff 初显锋芒
未知星球 | 未知职业
  • 关注0
  • 粉丝0
  • 帖子23
热议话题
精选帖子

JAVASE 陈培鸿-Day21 学习心得

[复制链接]
鸿buff 发表于 2020-11-30 20:19:07 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
Set集合

疑问一:为什么HashSet的值能够保证唯一
        HashSet底层维护的是由HashMap提供的哈希表:就是一个哈希地址值组成的表字典
        HashSet虽然底层维护的是哈希表,但是还依靠了其他的数据结构作为支撑:
           JDK7:数组+链表+哈希表
           JDK8:数组+链表+(红黑树)+哈希表
                   链表的元素的如果没有超过8个元素:则由数组+链表+哈希表支持
                   链表的元素的如果超过8个元素:则由数组+链表+红黑数+哈希表支持
           HashSet保持值唯一的原理:
               保证唯一必须强制依赖于hashCode()和equals()方法
               1.当你的集合需要存储某一个元素,则会调用该元素的hashCode()方法来计算元素的哈希值
                   每一个引用数据类型都是继承自Object,所以Object的hashCode()都会为每一个类来计算他对应的地址值
               2.计算好哈希地址之后,回去判断这个哈希地址是否已经存在元素
               3.如果算出来的哈希地址不存在任何的元素(此哈希地址没有被使用过),则直接将数据存入
               4.如果算出来的哈希地址已经存在元素,则只能证明集合当中存在了同类型的数据 不能证明是重复的数据
                 此时则需要调用equals()进行完全比较。
               5.如果equals()比较成立,则可以证实为重复元素,则不插入数据,类似HashMap的键
               6.如果equals()比较不成立,则继续在同哈希地址的链表位置追加数据
                   如果链表的长度在8以内,则直接追加
                   如果链表的长度在8以外,则使用红黑树进行追加

疑问二:为什么存入的顺序和取出的顺序是不一致的
   因为他们存入的时候是靠哈希地址来存的,而每一个的数据类型的哈希地址是不一致的,所以没有办法做到存取一致。

疑问三: LinkedHashSet元素的存取顺序是一致?
   其实本质上和HashSet没有区别,只不过LinkedHashSet有多了一层链表的维护
   维护的其实就是每次存入集合当中的哈希地址和链表地址,当每一次存入的时候都会想记录
   取出的时候,则不再直接从哈希地址直接提取,而通过维护链表依次提出地址。
   总结:LinkedHashSet之所以有序是因为他记录了每一次存储的地址,取出的时候 按照地址的先后顺序进行提取


TreeSet使用方法一:
创建一个MyComparator
public class MyComparator implements Comparator<Integer> {    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
}

MyComparator myComparator = new MyComparator();TreeSet treeSet1 = new TreeSet<Integer>(myComparator);
方法二:
TreeSet treeSet1 = new TreeSet<Integer>(new Comparator<Integer>(){    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
});
方法三:
在要被存入的类中实现接口Comparable
public class Student implements Comparable<Student>{    int id;
    String name;
    int age;

    @Override
    public int compareTo(Student o) {
        return this.id - o.id;
    }
}


Collections类

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
码云社-用代码改变世界!
回复 关闭延时

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

CODESEEDING(码云社)一家致力于程序员成长、以内容为核心、以提问为引导的多元化成长社区。我们在线上为技术爱好者提供了一个优质的交流氛围环境,在线下同样和众多高校联合开办了技术沙龙品牌。
020-85534346
关注我们
  • 访问移动H5版
  • 官方微信公众号

码云社 - CODESEEDING 2.0© 2018-2019 码云社. TOOBUG ( 粤ICP备16114193号-3 )