`
Kevin12
  • 浏览: 235989 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java中的HashSet

阅读更多
HashSet集合 :不允许有重复的元素并且HashSet中元素的顺序是随机的,包括添加(add())和输出都是无序的。

java.lang.Object
   |_ java.util.AbstractCollection<E>
        |_ java.util.AbstractSet<E>
              |_ java.util.HashSet<E>
例如:
public static void main(String[] args) {
	Set<String> set = new HashSet<String>();
	set.add("aaa");
	set.add("bbb");
	set.add("ccc");
	set.add("ddd");
	set.add("aaa");
	set.add("ccc");
	for(String string:set){
		System.out.println("value="+string);
	}
}

输出结果:
value=aaa
value=ddd
value=ccc
value=bbb

HashSet集合的一些常用操作:
add(Object)          :添加元素(Object);
addAll(Collection)   :向HashSet中添加一个集合(Collection);
remove(Object)       :删除一个指定的元素(Object);
removeAll(Collection):删除一个指定的集合(Collection);
size()               :HashSet的容量,即HashSet内元素的个数;
isEmpty()            :判断HashSet是否为空,即[]或size()=0,返回true或false;
contains(Object)     :判断某个元素(Object)是否在HashSet中,返回true或false;
containsAll(Collection):判断HashSet是否包含某个集合(Collection);
clear()              :清空HashSet,使得size()=0;
toArray()            :将HashSet转换成一个Object[];
iterator()           :构造一个HashSet迭代器,用于输出HashSet中的元素;

遍历HashSet中的元素有两种方法,其一上面的代码已经介绍;
其二就是迭代法:
Iterator it = set.iterator();
while (it.hasNext()) {
	System.out.println("value="+(String) it.next());
}


下面Object有点特殊情况,值得注意:
由于Object拥有hashCode()和equals()两个方法,它认为具有相同的hashcode的对象才是同一个对象,即对同一个对象的引用。
创建一个Student类:
public class Student {
	private String name;
	private Integer age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
}

在main方法中测试:
Set<Student> stuSet = new HashSet<Student>();
Student s1 = new Student();
s1.setName("zhangsan");
s1.setAge(10);
Student s2 = new Student();
s2.setName("zhangsan");
s2.setAge(10);
stuSet.add(s1);
stuSet.add(s2);
System.out.println("Student数量:"+stuSet.size());

输出结果是:
Student数量:2

重写Student类的hashCode和equals方法,在Student中添加下面的代码:
	//重写equals方法
	public boolean equals(Object o) {
		if (this == o) {
			return true;
		}
		if (!(o instanceof Student)) {
			return false;
		}
		final Student other = (Student) o;
		if (this.name.equals(other.getName())
				&& this.age.equals(other.getAge())) {
			return true;
		} else {
			return false;
		}
	}
	//重写hashCode()方法
	public int hashCode() {
		int result = (name == null ? 0 : name.hashCode()) + (age == null ? 0 : age.hashCode());
		return result;
	}

输出的结果:
Student数量:1
分析原因:name和age都是Student的成员变量是实例属性,根据内存的运行机制,new出来的两个对象都放到堆内存中,它们的name都是“zhangsan”,age都是10,而new出来的变量s1和s2都放在栈内存中并指向对应的对象,但是两个对象的hashCode和equals是不同的,所以放到HashSet中就是两个了。如果在Student中重写了hashCode和equals两个方法后,它们的hashCode和equals都相同了,那么将s1添加到HashSet中后,再添加s2时就重复不再添加了。此时,在内存中还是两个对象,但是在HashSet中就存了一个。
以上是个人理解,欢迎指正!!!
分享到:
评论

相关推荐

    Java中HashSet的解读_.docx

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

    HashSet工作原理_动力节点Java学院整理

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

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

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

    详解Java中HashSet和TreeSet的区别

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

    java 利用HashSet删除学生

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

    java HashSet 集合排序

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

    Java中HashSet的解读

    一. HashSet源代码  HashSet 的实现  对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较...  // 使用 HashMap 的 key 保存 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 的一些主要特点: 无序...

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

    1. **无序性**:HashSet中的元素没有特定的排列顺序,插入和遍历的顺序可能不同。 2. **唯一性**:由于底层基于HashMap,HashSet不允许添加重复元素,如果尝试添加已存在的元素,将会被忽略。 3. **null元素**:...

    hashset类的使用

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

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

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

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

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

    HashSet的实现原理

    在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,...

    HashSet类的用法.pdf

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

    java基础练习题 (目前到集合内含三个小综合案例)

    Java集合框架包括接口(如List、Set、Queue)和实现类(如ArrayList、LinkedList、HashSet、HashMap等)。理解各种集合的区别,以及它们的实现方式和应用场景,是提升编程效率的关键。例如,List接口中的ArrayList和...

    Java编程中的HashSet和BitSet详解

    Java编程中的HashSet和BitSet详解 HashSet和BitSet是Java编程中两个常用的集合类,它们都可以用来存储大量的数据,但它们之间有着明显的差异。那么,为什么Apache Commons作者选择使用BitSet代替HashSet呢?在本文...

    java中文解释的API

    其次,Java集合框架是Java API中的重要组成部分,包括`java.util`包中的`List`、`Set`、`Map`接口和它们的实现类。这些接口和类提供了存储和操作对象的高效数据结构,如`ArrayList`提供了动态数组的功能,`HashSet`...

    HashSet去重

    在Java编程语言中,`HashSet`是一种常用的集合类,属于`java.util`包的一部分。它不允许集合中有重复的元素,并且不保证集合中元素的顺序。`HashSet`之所以能够实现去重功能,主要依赖于其内部实现的哈希算法以及`...

Global site tag (gtag.js) - Google Analytics