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