Java集合学习3:Set集合-HashSet

简介: 无序、无下标、不可以重复元素方法:全部继承Collection的方法

Set


无序、无下标、不可以重复元素

方法:全部继承Collection的方法


Set接口的使用


30ff774c55669ede24c0ede0306f76a8_eaef497360bc4b5aa820ec58e8532259.png


Set迭代


2c3843757bb34fb0a9385e09e2332aff_0b21a2c242744e6ba3f8024b93a5324f.png



HashSet


使用了哈希表。

使用 HashCode计算元素 的存放位置。

当 存入元素的哈希码相同时 ,会调用equals进行确认 ,如 结果为true,那么拒绝后者存入。

存储结构:哈希表(数组+ 链表 +红黑树)

可以理解成火车站窗口买票排队,

7ca607dfc3654216f3c02ae1b61acb81_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_7,color_FFFFFF,t_70,g_se,x_16.png

每个人根据hashcode来计算,计算去哪个窗口,如果没有元素直接放入,如果有元素了,那么 比较equals,一样就放,不一样就弄 一个链表。


hashset使用

HashSet <String> hashSet = new HashSet<这里的string可以写也可以不写>();

b03315338758d48e5dc59fcf4414ec85_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png


hashset的遍历。

f71950bcf9b2997dda396957cae1ca4a_d25560d517f14e0d8a9209850d5c8578.png

使用迭代器:

Iterator<String> it = hashSet.iterator();
while(it.hashNext())
{
  xxx
}

f179b48cbda8ea0b14bec216e1a551f3_17daa86e6aa947aeb0535f2a036e6a8e.png

hashset使用2

2e1eef44c5a7d4eb1e42942e51f7a15d_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_11,color_FFFFFF,t_70,g_se,x_16.png

注意最后一个p3是不能加进去的。

persons.add(new Persons(“梁朝伟”,25)能不能成功能。

答案是能。

由于是new的方式 ,相当于这个是 没有名字的一个新的对象,所以 可以添加进去。

fb83e624d77d37b71471bbd3f4f45270_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_7,color_FFFFFF,t_70,g_se,x_16.png


hashset的存储方式

1、根据hashcode计算保存的位置 ,如果位置为空,则直接保存,如果不为空,那么执行第二步

2、再执行equals方法,如果为true,则认为是 重复元素,否则false形成链表。


如果要使刚刚的new student是同一个对象 ,那么重写hashcode方法就可以了。

4e458de9306fc54fd20756980095716f_655e8c3f5b594d17b6fdaf14b64ef741.png

这个时候如果 年龄和名字一样,那么就肯定是一样的了,这个hashcode就一样了。

这个时候发现加进来了,有两个梁朝伟,形成了链表。

hashcode意味加进来了,但是equals不一样,所以 形成了链表。

这个 时候 重写equals方法就可以使他们不加进来。


首先判断是不是同一个,如果是同一个就没必要比 了,returnture。

然后比较obj是不是为空,为空返回false即可。

然后判断obj是不是instance of person的类型,就进行一个强转换进行接收然后进行比较 ,如果 名字那些都一样就返回一样。

2e8e8e42b20dcd95a5d2bbe569c4e024_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_16,color_FFFFFF,t_70,g_se,x_16.png

删除也是这样 的,如果remove(new。。。)也是可以删除的 。因为 重写了方法。

5e52fe194bf471a53dce7b868fc79f2b_063be63c343d4dcba9359ce8e884ec9e.png248705abb410e7c7feae4d18094be05c_d2ca643c8f044ae98fc5ee64bc081d44.png

94b86173c9cdd06acc69b9f24a495d4a_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_14,color_FFFFFF,t_70,g_se,x_16.png


这个是可以 编辑器自带的 提供 的 生成重写代码,思路基本一致 的。

为什么使用31呢,是因为31是一个prime质数 素数。

这样可以尽量减少散列冲突。即hashcode计算出来的位置尽量不一样

除此之外还可以提升效率,因为31*i=i左移5位再-i。(i<<5-i)这样效率更高一些。

b2b18c6c0e05b53f5a4e716aa320908c_d79ea5c42e674d6c84b252e85031415f.png

相关文章
|
8天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
29 5
|
21天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
31 4
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
30 2
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
16天前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
52 18
你对Collection中Set、List、Map理解?
|
9天前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
46 20
|
26天前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
30 3
【C++】map、set基本用法
|
26天前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
21 5
|
2月前
|
存储 JavaScript 前端开发
Set、Map、WeakSet 和 WeakMap 的区别
在 JavaScript 中,Set 和 Map 用于存储唯一值和键值对,支持多种操作方法,如添加、删除和检查元素。WeakSet 和 WeakMap 则存储弱引用的对象,有助于防止内存泄漏,适合特定场景使用。
下一篇
DataWorks