35 、HashSet详解

HashSet特点

1、不能保证元素的排列顺序

2、没有重复元素

3、HashSet不是同步的,多个线程同时访问一个HashSet,需要通过代码来保持同步

4、集合元素可以是null

  当向HashSet中添加元素时,通过对象的HashCode方法来决定元素的存储位置。当两个元素equals相同,HashCode不相同时,HashSet也会看作两个不同元素;当两个元素HashCode相同,equals不同时,HashSet试图把它们保存着同一个位置,但又不行,所以实际上回在这个位置使用链式结构来保存多个对象,这样导致性能下降。

案例:

 1 class A{
 2     public boolean equals(Object obj) {
 3         return true;
 4     }
 5 }
 6
 7 class B{
 8     public int hashCode() {
 9         return 1;
10     }
11 }
12 class C{
13     public boolean equals(Object obj) {
14         return true;
15     }
16     public int hashCode() {
17         return 2;
18     }
19 }
20 public class Test{
21
22     public static void main(String[] args) {
23         Set set=new HashSet();
24         set.add(new A());
25         set.add(new A());
26         set.add(new B());
27         set.add(new B());
28         set.add(new C());
29         set.add(new C());
30         System.out.println(set);
31     }
32 }

输出结果:[[email protected], [email protected], [email protected], [email protected], [email protected]]

【注意】:如果要把某个类的对象保存到HashSet集合中,重写这个类的equals方法和hashCode方法时,应该尽量保证两桶对象通过equals方法比较返回为true时,它们的hashCode方法返回值也相等

LinkedHashSet类

  HashSet还有一个子类,LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序来保存的。也就是说,当遍历LinkedHashSet集合里的元素时,会按照元素插入顺序来访问元素。

  正因为LinkedHashSet需要维护元素的插入顺序,所以性能略低于HashSet,但是在迭代方位Set里的全部元素时将会有很好的性能

时间: 2024-12-29 12:36:08

35 、HashSet详解的相关文章

java中HashSet详解

HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码: Java代码   public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { // 使用 HashM

java中HashSet详解(转)

HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码: Java代码   public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { // 使用 HashM

java集合HashMap、HashTable、HashSet详解

一.Set和Map关系 Set代表集合元素无序,集合元素不可重复的集合,Map代表一种由多个key-value组成的集合,map集合是set集合的扩展只是名称不同,对应如下 二.HashMap的工作原理 HashMap基于hashing原理,通过put()和get()方法储存和获取对象. put()方法: 它调用键对象的hashCode()方法来计算hashcode值,系统根据hashcode值决定该元素在bucket位置.如果两个对象key的hashcode返回值相同,那他们的存储位置相同,如

java集合(三)Set集合之HashSet详解

①:实现了Serializable接口,表明它支持序列化.②:实现了Cloneable接口,表明它支持克隆,可以调用超类的clone()方法进行浅拷贝.③继承了AbstractSet抽象类,和ArrayList和LinkedList一样,在他们的抽象父类中,都提供了equals()方法和hashCode()方法.它们自身并不实现这两个方法,(但是ArrayList和LinkedList的equals()实现不同.你可以看我的关于ArrayList这一块的源码解析)这就意味着诸如和HashSet一

HTML5移动开发之路(35)——jQuery中的过滤器详解

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(35)--jQuery中的过滤器详解 1.基本过滤选择器 :first:last:not(selector) :selector匹配的节点之外的节点:even :偶数:odd :奇数:eq(index):gt(index) :比他大的 :lt(index) :比他小的 [html] view plain copy print? <html> <head> <script src=&quo

Java集合详解7:HashSet,TreeSet与LinkedHashSet

Java集合详解7:HashSet,TreeSet与LinkedHashSet 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/12/colle

Java 集合类详解

1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等. 发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.它的一个

hiberate 映射关系 详解

在我们平时所学的关系型数据库中,我们会大量处理表与表之间的关系,如果表比较多的话处理起来就比较繁琐了,但是hibernate给我们提供了很大的便利,这些便利让我们处理起来方便. 如果我们把表的每条记录当成一个对象的话,那我们我们的映射关系可以分为四种 1)一对一 2)一对多 3)多对一 4)多对多 现在我们假设有四个表,员工表,部门表,办工作表,职位表. 有如下映射关系 1)多个员工对应一个部门 2)一个部门对应多个员工 3)一个员工对应多个职位(这里我们假设一个人有多大能力,就要承担多大责任,

Java 8新特性探究(八)精简的JRE详解

http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 Java 8新特性探究(八)精简的JRE详解 2015/02/05 | 分类: 基础技术 | 0 条评论 | 标签: JRE 分享到:2 原文出处: 成熟的毛毛虫的博客 Oracle公司如期发布了Java 8正式版!没有让广大javaer失望.对于