java Set的无序性和不可重复性的理解

Set的无序性和不可重复性的理解

  • set:存储无序的,不可重复的数据

无序性(这里我们通过HashSet为例来说明Set的无序性):

  • 不等于随机性,我们存储数据时还是按照第一个,第二个,第三个等等的顺序进行存储的,只不过我们第一个存储的不一定是存储在第一个位置,它可能存储在底层数组中的任何一个位置上
    • 也就是数据的存储不是按照数组索引顺序进行存储的(不是按照内存单元的顺序进行存储的),而是根据存储数据的hash值(哈希码值)(就是存储数据调用hashCode()方法的返回值)决定的
  • 注意: 这里我们的Set的无序性我们是通过HashSet为例来进行讲解的(我们的HashSet在底层中就是通过数组进行存储的(严格来说是通过数组 + 链表来实现的))

正是由于Set的无序性,这个时候我们的Set中就没有声明新的方法

  • 我们前面讲过的List中存储的数据时有序的,因为有序,也就有了索引,这个时候我们根据索引在List中提出了8个方法
  • 但是这里我们的Set中存储数据是无序的,这个时候也就没有索引了,这个时候也就没有在Set中声明新的方法,所以也就是说我们的Set中的方法就是从我们的Collection接口中继承下来并的14种方法(最后到具体的实现类中再去重写这些具体的方法)

不可重复性:

我们的Set中存储的元素不能重复:

  • 那么怎样的两个元素算是重复的?
    • 这里就要涉及到我们的Set中添加元素的过程
      • 我们在Set中添加元素时先要通过添加元素调用其模板类(所在类)的hashCode()方法求得这个元素的hash值(哈希值),这个时候我们再通过这个添加元素的哈希值通过散列函数来求得我们的这个添加元素应该在底层数组中存储的位置,之后如果这个位置上没有元素,这个时候我们就说这个添加元素是没有与我们Set中原本存储的数据冲突,也就是添加成功了 —情况一 ,但是如果这个位置上有元素了,这个时候我们我们再比较原本这个位置上的元素和我们的添加元素的hash值是否相同,如果这个时候两个元素的Hash值不同,那么这个时候也是说明我们的添加元素和我们的原本的Set中的元素没有重复,这个时候是通过"7上8下的原则进行链式存储的".那么这个时候也就是添加成功了 —情况二 ,如果这个时候两个的Hash值也相同,这个时候我们再通过添加元素的equals()方法进行判断,如果这个位置上的其他元素都和添加元素比较后返回false,那么这个时候我们也是添加成功 —情况三 ,如果这个时候有返回true的,这个时候就是添加失败了
  • 其实到现在我们使用的几乎都是jdk8了,这个时候我们可以说就是只考虑"8下"了,也就是只用考虑jdk8
  • 这里的七上八下就是指我们在数组同一索引位置处链接元素时的链接规则
    • 在jdk7中是将我们的新添加元素链接在原本这些位置元素的上面
    • jdk8中是将我们的新添加元素链接在原本的这些元素的下面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值