HashSet是Set接口的实现,所以不包含相同元素。HashSet是基于Hash算法的集合,具有很好的查找和存取性能。HashSet不能保证输出的顺序和插入的顺序一样。
import java.util.HashSet; import java.util.Iterator; public class hashset { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("abc"); set.add("acd"); set.add("bcd"); boolean b = set.add("abc"); System.out.println("abc元素是否再次添加成功:"+b); Iterator<String> it = set.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); } } }
上面程序的运行结果:
abc元素是否再次添加成功:false bcd abc acd
通过程序的运行结果可以看出当再次插入“abc”时是没有插入成功的,说明HashSet集合是不允许元素重复的,同时他们的输出顺序也不一定是加入HashSet集合的顺序。
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。如果两个元素的equals()方法的返回值等于true,但他们的hashCode()方法的返回值不一样,它们都将存在HashSet不同位置中。如果两个元素返回的equals()方法的值和hashCode()方法的值都相等,则说明这两个元素相等,新增加的元素不会被加入。
import java.util.HashSet; class A{ private String name; public A(String name){ this.name = name; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof A) { A stu = (A) obj; return this.name.equals(stu.name); } return false; } @Override public String toString() { return name; } } class B{ private String name; public B(String name){ this.name = name; } @Override public int hashCode() { return name.hashCode(); } @Override public String toString() { return name; } } class C{ private String name; public C(String name){ this.name = name; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof C) { C stu = (C) obj; return this.name.equals(stu.name); } return false; } @Override public int hashCode() { return name.hashCode(); } @Override public String toString() { return name; } } public class hashset { public static void main(String[] args) { HashSet<A> setA = new HashSet<A>(); setA.add(new A("张三")); setA.add(new A("张三")); System.out.println(setA); HashSet<B> setB = new HashSet<B>(); setB.add(new B("李四")); setB.add(new B("李四")); System.out.println(setB); HashSet<C> setC = new HashSet<C>(); setC.add(new C("王五")); setC.add(new C("王五")); System.out.println(setC); } }
上面程序的运行结果:
[张三, 张三] [李四, 李四] [王五]
上面程序中分别将两个相同A、B、C对象加入到对应的A、B、C类型的HashSet集合中。其中A类只重写了equals()方法和toString()方法,B类只重写了hashCode()方法和toString()方法,C类重写了equals()方法、hashCode()方法和toString()方法。
从结果可以看出,即使两个A对象通过equals()方法比较的值相等,但hashCode值不同,HashSet把它们当做了两个对象加入其中。两个B对象的hashCode值相同,但它们的equals()方法返回值为false,所以HashSet把它们当做了两个对象加入其中。因为两个方法都重写了,两个C对象的equals()方法比较的值相等,hashCode值也相同,所以HashSet把它们当成一个对象加入其中。
总结:当把一个对象加入到HashSet中时,不仅要重写该类的equals()方法,同时也要重写该类的hashCode()方法,这样才能保证HashSet中的对象没有重复。
相关推荐
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:
System.out.println("HashSet中元素的个数为:" + hs.size()); ``` 8. **清空集合** 使用`clear()`方法可以清空`HashSet`中的所有元素。 ```java hs.clear(); ``` #### 四、注意事项 - 在使用`HashSet`时...
2. 非有序:HashSet中的元素没有固定的顺序,每次遍历可能得到不同的结果。 3. 高效查找:由于HashSet基于哈希表,查找、添加和删除操作通常具有O(1)的平均时间复杂度。 结合这些特性,HashSet适合在不需要保持元素...
我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量,并最终使用迭代器遍历了HashSet中的所有元素。 在实际应用中,HashSet因其存储元素的唯一性和对元素添加、删除、查询的高效性而...
java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。
HashSet利用HashMap的这一特性,以键值对的形式存储元素,其中键(Key)即为HashSet中的元素,而值(Value)通常是一个固定的对象,如本文中提到的PRESENT对象,它仅仅作为一个占位符。 HashSet的初始化有多种方式...
在Java编程语言中,ArrayList和HashSet是两种常用的集合类,它们各自有其特性和应用场景。在实际开发中,理解它们的差异以及如何有效地利用它们是非常重要的。本篇将深入探讨ArrayList与HashSet的区别,并分析...
// java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
Java中HashSet和HashMap是两个常用的集合类,它们都属于Java集合框架(Java Collection Framework),但是它们有着不同的实现和应用场景。 什么是HashSet? HashSet实现了Set接口,它不允许集合中有重复的值。当...
HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 TreeSet 的区别,帮助大家更好地理解和使用这些集合类。 HashSet HashSet 是一个...
HashSet是Java编程语言中的一种集合类,它是一个不包含重复元素的集合,其内部实现基于HashMap。HashSet不保证元素的顺序,允许存储null元素,并且是非同步的,这意味着在多线程环境下,如果需要保证线程安全,需要...
掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用
Java工具类集合是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常被组织在各种包下,如`java.util`、`java.lang`、`java.io`等。下面将详细介绍...
HashSet中含有一个"HashMap类型的成员变量"map,HashSet的操作函数,实际上都是通过map实现的。 在HashSet的源码分析中,可以看到HashSet是通过map(HashMap对象)保存内容的。HashSet中的map变量是transient的,也...
Java集合类是Java语言中的一种重要数据结构,用于存储和管理数据。Java集合类可以分为两种:Collection接口和Map接口。Collection接口有两个子接口:List接口和Set接口。List接口是有序的,可以重复元素,常用的实现...
当我们在HashSet中添加一个元素时,Java会先计算该元素的哈希码,然后根据哈希码决定该元素在底层HashMap中的位置。如果两个元素的哈希码相同,它们会被放在同一个桶(bucket)中。为了避免冲突,Java还使用了equals...
在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap...掌握HashSet的实现原理对于Java开发者在实际编程中合理地选择和使用集合类具有重要意义。
HashSet的主要特点是元素不能重复,即同一个元素不能在HashSet中出现多次。例如,在示例1中,我们添加了两个相同的元素“gareen”,但是HashSet中只保留了一个。这种特性使得HashSet非常适合用于去重、统计和数据...
1. **集合框架**:Java集合框架是Java中处理对象集合的核心API,包括List、Set、Map等接口以及ArrayList、HashSet、HashMap等实现类。高效的数据结构如TreeSet和LinkedHashMap在排序和保持插入顺序方面具有重要作用...