`

Set集合的简单总结

阅读更多

hashSetTreeSet的区别:

1HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,用的是key

2hashSetTreeSet都的元素都具有唯一性,TreeSet多了一个排序功能;

3HashCodeequals是提供给HashSet用的,因为不需要排序所以只要关注唯一性即可,

hashCode是用来计算hash值的,hash值是用来确定hash表索引的,具有在内存中定位对象位置的功能

hash表中一个索引处存放一个链表,所以需要通过equal方法循环比较链表上的每一个对象才可以确定键值对应的实体(Entity)

put时如果hash表中没有定位到,则新增一个实体并返回null,如果定位到了则覆盖原来的值,并返回原来的值;

TreeMap使用comparator对键值进行排序,Comparator可以在创建键值的时候指定,如果创建的时候没有指定就使用key.compareTo方法,这就要求key必须实现Comparable接口;

TreeMap使用Tree数据结构实现的,所以使用comparator接口就可以了

 HashCode冲突问题:

综述:通过一定的算法将keyhashCode转换成数组的index;将keyvaluehashcode保存到数组的index位置上;

Hashcode冲突问题:

1、  某些keyhashcode相同

2、  Hashcode不同,但通过了一定的算法映射到数组上的index相同

HashMap的解决方法:

a、  hashMap本身数据结构:

使用Entry存储数据的,Entry封装了HashMapkeyvaluehash值,next指针

b、  存储过程:

根据hashCode得到存储位置index后存储的不仅仅是改元素的keyvaluehash值还有

指向下一个entry的引用;如果出现了hashcode冲突问题则新建一个entry对象,将改entry的对象指向已存在的entry;一个index指向的可能不是一个entry;也有可能是一个entry链,如下图:

 HashSet存储结构

c、取值过程:

还是hash—index---entry的过程,不是直接returnindex上的entry对象,而是检查entry链上真正对应的那个entry对象

hashMapget(key)方法说明:

1、  根据key算出hash

2、  根据hash值算出数组的index

3、  根据index获取一个Extry链,Entry<K,V> e = table[indexFor(hash, table.length) ,如上图浅蓝色部分

4、  遍历entry对象,通过keyequal方法找到key对应的value

Set是如何实现排序的:

HashSet是按照hash值排序的,不保证集合的迭代顺序,不保证该顺序的恒久不变,允许null元素;

TreeSet 按照元素的自然顺序排序或者按照构造时传入的比较器进行排序

LinkedHashSet 按照插入的顺序排序

分享到:
评论

相关推荐

    求2个集合的交集

    最简单、粗暴的循环遍历2个集合,判断如果有相同的元素就取出来。假设集合1的长度为M,集合2的长度为N,那么,时间复杂度为:O(M*N) 代码: public static List&lt;string&gt; GetIntersection(List&lt;string&gt; list1, ...

    实现经典“四则运算”算法优化Redis集合运算

    一万六千字谈谈如何实现经典“四则运算”算法优化Redis集合运算二、为什么要“优化”Redis集合运算2.1Redis集合运算简介2.1.1无序集合set命令2.1.2有序集合sortedset命令2.2.1普通原生集合命令实现2.2.2普通原生集合...

    corejava基础重要知识点总结

    类:一组类型相同事物高度抽象之后的集合概念 创建对象的模板 -》 class 对象:类的一个具体的实例 例子: 人和范冰冰之间的关系? 类和对象 HelloKitty和猫之间的关系? 对象和类 引用:对象的名字 *:一个...

    利用redis实现排行榜的小秘诀

    在日常一些简单的活动开发中,我经常会碰到需要对用户的分值等进行排行,此时一般会选择redis的有序集合对用户的分数进行存储,但是不同的场景排行榜的方式也略有不同,以下根据自己日常的开发进行了一下归纳总结 ...

    redis数据类型及应用场景知识点总结

    Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 一、string 简介:Strings数据类型是最常用、简单的key-value类型,普通的key/ value 存储都可以...

    java 面试题 总结

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...

    jpivot学习总结.doc

    它的属性比较简单,只有 id 和 queryName 两个,而且比较容易理解。 4.4. clickable 该标签的作用是给一个 dimension 或一个 level 里的所有的 members 加上超链,使得它们变的可以进行点击操作。生成的 URL 中...

    python运维视频.zip

    08 字符串简单操作.py 09 列表.py 10 字典.py 11 集合.py 12 元祖.py 13 用户交互.py 14 if语句.py 15 while循环.py 16 break和continue.py day01 视频 01 Python介绍.mp4 02 注释和变量.mp4 03 常量和命名规范和...

    NHibernate中文帮助手册API

    总结  2. 体系结构(Architecture)  2.1. 概况(Overview)  2.2. 实例状态  2.3. 上下文相关的(Contextual)Session  3. 配置  3.1. 可编程的配置方式  3.2. 获得ISessionFactory  3.3. 用户自行...

    Android代码-WLeetCode

    后续,在空闲时间总结了单链表的面试题目,排序算法等知识,目前在整理 Java 集合框架相关源码,相关文章在本人的掘金专栏和简书与CSDN博客都有发布。欢迎关注本项目的朋友去浏览。 &gt; -- 2018年04月12日更新 Java ...

    Hibernate3的帮助文档

    2.3.2. 一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. 体系结构(Architecture) 3.1. 概况(Overview) 3.2. 实例状态 3.3. JMX整合 ...

    spring.doc

    3.5.4 装配set集合 22 3.5.5 装配map 22 3.5.6 装配Properties 23 3.6 注解注入 23 注解注入拓展: 23 3.6.1 @Autowired 26 3.6.2 @Qualifier 27 3.6.3 @Resource 27 3.6.4 @PostConstruct 28 3.6.5 @PreDestroy 28 ...

    掌握PHP垃圾回收机制详解

    php的垃圾回收机制可以简单总结为 引用计数 写时复制 COW机制, 本文主要和大家分享掌握php垃圾回收机制的知识,希望能帮助到大家。 引用计数基本知识 官网的解答如下 每个php变量存在一个叫”zval”的变量容器中一...

    Hibernate中文详细学习文档

    1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...

    hibernate 框架详解

    一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. 体系结构(Architecture) 3.1. 概况(Overview) 3.2. 实例状态 3.3. JMX整合 ...

    Hibernate参考文档

    1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...

    Hibernate+中文文档

    1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...

    HibernateAPI中文版.chm

    1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...

    Hibernate 中文 html 帮助文档

    1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...

Global site tag (gtag.js) - Google Analytics