`
最棒的madao
  • 浏览: 2387 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

Java中HashSet类

阅读更多

      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工作原理_动力节点Java学院整理

    对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:

    HashSet类的用法.pdf

    System.out.println("HashSet中元素的个数为:" + hs.size()); ``` 8. **清空集合** 使用`clear()`方法可以清空`HashSet`中的所有元素。 ```java hs.clear(); ``` #### 四、注意事项 - 在使用`HashSet`时...

    java 利用HashSet删除学生

    2. 非有序:HashSet中的元素没有固定的顺序,每次遍历可能得到不同的结果。 3. 高效查找:由于HashSet基于哈希表,查找、添加和删除操作通常具有O(1)的平均时间复杂度。 结合这些特性,HashSet适合在不需要保持元素...

    hashset类的使用

    我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量,并最终使用迭代器遍历了HashSet中的所有元素。 在实际应用中,HashSet因其存储元素的唯一性和对元素添加、删除、查询的高效性而...

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    Java中HashSet的解读_.docx

    HashSet利用HashMap的这一特性,以键值对的形式存储元素,其中键(Key)即为HashSet中的元素,而值(Value)通常是一个固定的对象,如本文中提到的PRESENT对象,它仅仅作为一个占位符。 HashSet的初始化有多种方式...

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    在Java编程语言中,ArrayList和HashSet是两种常用的集合类,它们各自有其特性和应用场景。在实际开发中,理解它们的差异以及如何有效地利用它们是非常重要的。本篇将深入探讨ArrayList与HashSet的区别,并分析...

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    Java中HashSet和HashMap的区别_动力节点Java学院整理

    Java中HashSet和HashMap是两个常用的集合类,它们都属于Java集合框架(Java Collection Framework),但是它们有着不同的实现和应用场景。 什么是HashSet? HashSet实现了Set接口,它不允许集合中有重复的值。当...

    详解Java中HashSet和TreeSet的区别

    HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 TreeSet 的区别,帮助大家更好地理解和使用这些集合类。 HashSet HashSet 是一个...

    HashSet详解和使用示例_动力节点Java学院整理

    HashSet是Java编程语言中的一种集合类,它是一个不包含重复元素的集合,其内部实现基于HashMap。HashSet不保证元素的顺序,允许存储null元素,并且是非同步的,这意味着在多线程环境下,如果需要保证线程安全,需要...

    Java 集合类(HashSet、ArrayList、LinkedList、HashMap).pptx

    掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用

    java工具类集合

    Java工具类集合是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常被组织在各种包下,如`java.util`、`java.lang`、`java.io`等。下面将详细介绍...

    Java中的HashSet详解和使用示例_动力节点Java学院整理

    HashSet中含有一个"HashMap类型的成员变量"map,HashSet的操作函数,实际上都是通过map实现的。 在HashSet的源码分析中,可以看到HashSet是通过map(HashMap对象)保存内容的。HashSet中的map变量是transient的,也...

    java常用集合类总结

    Java集合类是Java语言中的一种重要数据结构,用于存储和管理数据。Java集合类可以分为两种:Collection接口和Map接口。Collection接口有两个子接口:List接口和Set接口。List接口是有序的,可以重复元素,常用的实现...

    集合类HashSet

    当我们在HashSet中添加一个元素时,Java会先计算该元素的哈希码,然后根据哈希码决定该元素在底层HashMap中的位置。如果两个元素的哈希码相同,它们会被放在同一个桶(bucket)中。为了避免冲突,Java还使用了equals...

    HashSet的实现原理

    在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap...掌握HashSet的实现原理对于Java开发者在实际编程中合理地选择和使用集合类具有重要意义。

    通过实例学习Java集合框架HashSet

    HashSet的主要特点是元素不能重复,即同一个元素不能在HashSet中出现多次。例如,在示例1中,我们添加了两个相同的元素“gareen”,但是HashSet中只保留了一个。这种特性使得HashSet非常适合用于去重、统计和数据...

    牛逼的java常用工具类

    1. **集合框架**:Java集合框架是Java中处理对象集合的核心API,包括List、Set、Map等接口以及ArrayList、HashSet、HashMap等实现类。高效的数据结构如TreeSet和LinkedHashMap在排序和保持插入顺序方面具有重要作用...

Global site tag (gtag.js) - Google Analytics