我是靠谱客的博主 有魅力玉米,最近开发中收集的这篇文章主要介绍浅谈Set源码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 简介
    • 一、HashSet添加元素过程
    • 二、LinkedHashSet
    • 三、TreeSet

简介

Set接口:存储无序的,不可重复的数据。

1. 无序性:不等于随机性。存储的数据在底层中并非按照索引顺序添加,而是根据数据的哈希值决定
2. 不可重复性:保证添加的元素,先判断hashCode(),再判断equals(),返回都为true,则为重复数据

  • HashSet:Set接口主要实现类;线程不安全。
  • LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历。
  • TreeSet:可以按照添加对象的指定属性,进行排序

一、HashSet添加元素过程

如图所示:
在这里插入图片描述

  1. HashSet底层为数组,初始化为容量为16。
  2. 添加元素a1,首先调用a1所在类的hashCode()方法,计算a1元素的哈希值。
  3. 接着此哈希值通过某种算法(这里12长度数组可以理解为取12的模)计算出a1在数组中的位置。
  4. 如果此位置上没有其他元素,则a1元素添加成功。(a1、a2、a3以此方式添加随机位置成功)
  5. 如果此位置上有其他元素,如添加a4时,则比较a3和a4的hash值。(取模相同,哈希值不一定相同)
    ①如果hash值不相同,则肯定不是相同对象,添加成功。
    ②如果hash相同,则比较a4和a5的的equals()方法,返回false,添加成功。
  6. 5中添加成功的方式,如图会以单向链表的方式存储
    ①jdk 7:新添加的元素放到数组中,指向原来的元素。
    ②jdk 8:新添加的元素会添加到链表的末端。

hashCode方法:

  1. object的hashCode方法可以理解为对象地址通过一定计算得到的一个数值。
  2. 重新hashCode,每个属性的值的hash值*31相加的和。
  3. 向set中添加数据,其所在类一定要重写hashCode()和equals()。
  4. 重写的hashCode()和equals()尽可能保持一致性,相等对象必须具有相等的散列值。

二、LinkedHashSet

  1. 存储过程底层原理和hashset一样。但是在添加数据的同时,每个数据前后还维护了两个指针,记录前一个数据和后一个数据。
  2. 对于频繁的遍历操作,LinkedHashSet效率高于HashSet。
  3. 因此《集合有序性》不能描述为遍历顺序和添加顺序一致。

三、TreeSet

  1. 向TreeSet中添加的数据,要求是相同类的对象。
  2. 两种排序方式:自然排序(实现Comparable 接口) 和 定制排序 (Comparator)
    ①自然排序中,比较两个对象是否相同的标准:重写compareTo()返回0。不再是equals()。
    ②自然排序中,比较两个对象是否相同的标准:比较器compare()返回0。不再是equals()。
    在这里插入图片描述

最后

以上就是有魅力玉米为你收集整理的浅谈Set源码的全部内容,希望文章能够帮你解决浅谈Set源码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部