Set集合 柔光的暖阳◎ 2022-05-28 23:40 197阅读 0赞 ## 简介 ## > 无序,不可重复的集合 ## HashSet ## ①、HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL; ②、对于 HashSet: 如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。 1、当向HashSet集合中存入一个元素时,HashSet会先调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置 1.1、如果 hashCode 值不同,直接把该元素存储到 hashCode() 指定的位置 1.2、如果 hashCode 值相同,那么会继续判断该元素和集合对象的 equals() 作比较 1.2.1、hashCode 相同,equals 为 true,则视为同一个对象,不保存在 hashSet()中 1.2.2、hashCode 相同,equals 为 false,则存储在之前对象同槽位的链表上,这非常麻烦,我们应该约束这种情况,即保证:如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。 源码实现: //创建hashSet,调用无参构造器 Set<String> hashSet = new HashSet<String>(); //添加元素方法 hashSet.add("123"); 通过上面创建和添加元素,看源码中怎么实现: // 无参构造器 public HashSet() { map = new HashMap<>(); } // 添加元素方法 public boolean add(E e) { return map.put(e, PRESENT)==null; } // 上面一行中的PRESENT---> 空对象 private static final Object PRESENT = new Object(); 通过源码可以看出,HashSet底层是通过维护一个HashMap来实现的, 存储的值相当于Map中的key,value默认为空对象。 ## linkedHashSet ## > 不可以重复,有序 > 因为底层采用 链表 和 哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性 LinkedHashSet 继承 HashSet,底层也是通过维护一个 LinkedHashMap来实现功能的 //构造器 public LinkedHashSet() { // 调用父类构造器 super(16, .75f, true); } // 被调用的父类构造器 HashSet(int initialCapacity, float loadFactor, boolean dummy) { // 通过维护一个LinkedHashMap来实现LinkedHashSet 的功能 map = new LinkedHashMap<>(initialCapacity, loadFactor); } ## TreeSet ## > 有序;不可重复,底层使用 红黑树算法,擅长于范围查询。 规则: 1. 如果使用 TreeSet() 无参数的构造器创建一个 TreeSet 对象, 则要求放入其中的元素的类必须实现 Comparable 接口所以, 在其中不能放入 null 元素 2. 必须放入同样类的对象.(默认会进行排序) 否则可能会发生类型转换异常.我们可以使用泛型来进行限制 源码实现同上: public TreeSet() { //通过维护一个TreeMap 来实现功能 this(new TreeMap<E,Object>()); } // 添加元素方法 public boolean add(E e) { return m.put(e, PRESENT)==null; } // 空对象,用来填充map中的value值 private static final Object PRESENT = new Object(); 总结: 以上三个 Set 接口的实现类比较: 共同点: 1. 都不允许元素重复 2. 都不是线程安全的类 不同点: 1. HashSet:不保证元素的添加顺序,底层采用 哈希表算法,查询效率高。判断两个元素是否相等,equals() 方法返回 true,hashCode() 值相等。即要求存入 HashSet 中的元素要覆盖 equals() 方法和 hashCode()方法 2. LinkedHashSet:HashSet 的子类,底层采用了 哈希表算法以及 链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于 HashSet 3. TreeSet:不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用 红-黑 树算法(树结构比较适合范围查询) 这里对Set集合不做过多介绍,因为都是通过Map来实现的,如果想对Set多一些了解,可以多看看Map集合中Key的规则限制 集合概述:[http://blog.csdn.net/qq\_19467623/article/details/78904666][http_blog.csdn.net_qq_19467623_article_details_78904666] List集合介绍:[http://blog.csdn.net/qq\_19467623/article/details/79530686][http_blog.csdn.net_qq_19467623_article_details_79530686] Map集合介绍: 集合同步以及排序等: [http_blog.csdn.net_qq_19467623_article_details_78904666]: http://blog.csdn.net/qq_19467623/article/details/78904666 [http_blog.csdn.net_qq_19467623_article_details_79530686]: http://blog.csdn.net/qq_19467623/article/details/79530686
相关 集合set 35个问题测试你对Python集合的认识 如何通过掌握集合的基本原理来压制算法问题 图片来自Pexels的Andrea Piacquadio 在我追求掌握面试算法的过程中,我 ╰半夏微凉°/ 2024年04月06日 13:19/ 0 赞/ 77 阅读
相关 set集合 目录 1,set集合的特点: 1.1,set集合添加的数据不可重复 1.2 hashset无序 Treeset有序 1.2.1set集合的遍历方法 1.2.2Tree 我就是我/ 2024年03月16日 18:50/ 0 赞/ 52 阅读
相关 集合——Set Set接口 1.set接口的主要实现类有HashSet和 TreeSet 2.HashSet是基于哈希表实现的,数据是无序的, HashSet元素可以是null,但只 逃离我推掉我的手/ 2023年01月21日 05:30/ 0 赞/ 133 阅读
相关 Set集合 Scala `Set`是相同类型成对的不同元素的集合。换句话说,一个集合是不包含重复元素的集合。 集合有两种:不可变(`immutable`)和可变(`mutable`)。可变 短命女/ 2022年06月07日 11:16/ 0 赞/ 213 阅读
相关 Set集合 简介 > 无序,不可重复的集合 HashSet ①、HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL; ②、对于 Has 柔光的暖阳◎/ 2022年05月28日 23:40/ 0 赞/ 198 阅读
相关 集合 set 集合 set :去重复,做操作 .add 是增加一个整体,如add('op')是加'op'.update 是增加一个一个的字符是加 o和p in ,no 超、凢脫俗/ 2022年02月23日 10:45/ 0 赞/ 275 阅读
相关 set集合 概述 Set接口继承Collection Set接口常用实现类 1. HashSet 实现了 Set 接口 “它不保证 set 的迭代顺序;特别是它不保证 Bertha 。/ 2022年01月22日 08:39/ 0 赞/ 284 阅读
相关 集合 SET 集合 SET 定义: 只有键没有值的字典,保留无序的元素,没有索引。集合的元素不可变。 创建: 1.set\_1 = set(seq) 2.set\_2 太过爱你忘了你带给我的痛/ 2021年12月05日 05:13/ 0 赞/ 365 阅读
相关 Set(集合) ''' 集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复。 {} ''' set1 = set({1, ゝ一世哀愁。/ 2021年11月17日 22:38/ 0 赞/ 358 阅读
相关 集合Set 集合的一个关键的特点就是不能存放重复的元素,二分搜索树是一个非常好的实现集合的底层数据结构 1、二分搜索树实现集合: ![在这里插入图片描述][watermark_ty 川长思鸟来/ 2021年09月23日 22:14/ 0 赞/ 396 阅读
还没有评论,来说两句吧...