普歌+浅谈Java中Collection集合(2)

Set接口

set接口是Collection接口中的另一个分支。也是单列集合。

Set集合的特点:

  • 不允许存储重复元素
  • 没有索引,没有带索引的方法。
  • 不能使用普通for循环进行遍历

Set继承了很多的接口。后文会提到!

哈希值

我们在深入学习Set集合中具体的HashSet集合和LinkedHashSet集合需要先学习一个哈希值的概念。

哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是逻辑上的地址值。不是实际存储数据的物理地址值)。


HashSet集合

HashSet集合是Set接口下的一个集合,属于单列集合。

HashSet集合的特点

  • 不允许存储重复元素
  • 没有索引,没有带索引的方法,不能使用普通for循环进行遍历。
  • 是一个无序的集合。
  • 允许存储Null值。
  • HashSet集合底层是运用HashMap实现,从底层HashSet类中的构造方法中可以看出。
  • HashSet集合底层的存储结构:

HashSet集合底层存储结构是哈希表,不同版本的哈希表构造不同。(算是对哈希表功能的完善)

  • jdk1.8版本之前:哈希表 = 数组 + 链表
  • jdk1.8版本之后:哈希表 = 数组 + 链表 / 红黑树(大大地提高了查询的效率)
  • 哈希表构造变化的原因:
  • 红黑树:1972年研究。
  • jdk1.8版本:2013年推出。
    jdk1.8版本之前对于数据操作量不是很大,所以仅仅数组+链表的结构可以满足需要。但是随着发展,发现数据量的增大,存储和取出的元素也随之增加,依靠之前的数组+链表不足以去适应当下社会的快节奏和处理庞大的数据量。于是,进行了改变,在jdk1.8版本后,哈希表由数组+链表变成了数组+链表/红黑树。当集合存储的数据哈希值相同时,对象不同的元素不超过两个时,还是使用数组+链表的结构,一旦超过,会转换为数组+红黑树的结构。来加快集合的查询和元素操作的效率。

HashSet不允许存储重复元素的原理:

涉及到两个方法:都是来自Object超类中的方法,HashCode和equals方法。

调用add方法添加元素时,会调用HashCode方法得出元素的哈希值,之后与集合中的哈希值进行比较

  • 如果没有:把元素存储到集合中;
  • 如果有,再此调用equals方法进行判断两个对象值是否相等。相等:存储失败;不相等:存储成功。

【注意】:Set集合不会存储相同的元素,因为Java的哪些引用类已经重写了hashCode和equals方法。当我们使用Set集合存储自定类的元素时,需重写hashCode和equals方法来保证Set集合不会存储相同的元素。


HashSet存储是无序的原理:

在存储的时候根据HashCode得到的哈希值进行存储,哈希值是一个随机的十进制整数值,所以存储的时候是无序的。进行取出元素的时候,也是根据哈希值进行查找,进行取出。所以也是无序的。


以上的观点是自己看法,谢谢查阅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值