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中的对象没有重复。
相关推荐
Java中HashSet的解读_.docx
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:
java 利用HashSet删除学生 java 利用HashSet删除学生
java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。
这个是关于java语言的hashset集合类的一些基本用法和详解了个方法的使用
// java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
Java基础加强_ArrayList_HashSet的比较及Hashcode分析
主要介绍了详解Java中HashSet和TreeSet的区别的相关资料,需要的朋友可以参考下
主要介绍了Java中HashSet和HashMap的区别_动力节点Java学院整理,需要的朋友可以参考下
一. HashSet源代码 HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较... // 使用 HashMap 的 key 保存 HashSet 中所有元素
c++一个用vector实现java的HashSet集合类,可以将任何类,数字,字符串,vector等等存放到里面
HashSet类的用法.pdf Hashtable类的用法.pdf Java语言基础.pdf Math类的常用方法.pdf String与StringBuffer.pdf Vector类的用法.pdf 迭代器Iterator的用法.pdf 反射机制.pdf 访问路经问题.pdf 基于MVC和RMI的分布....
掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用
包含各种数据库的驱动包,spring, struts2,hibernet,ibatis,ehcahe,file_upload, email,dbcp等jar包。
Class005_HashSet.java
HashSet 是一个没有重复元素的集合。接下来通过实例代码给大家介绍java中的hashset相关知识,感兴趣的朋友一起看看吧
HashSet 是一个没有重复元素的集合。 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素。 HashSet是非同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它...
Java HashSet Java 集合框架 HashSet 基于 HashMap 来实现的,是一个不...HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。 基本类型对应的包装类表如下: 基本类型 引用类型 boolea
随机数,HsahSet,排序,输出.随机数,HsahSet,排序,输出.