Java集合中的HashSet
导读
通过阅读本文,可以了解如下信息:
- 如何定义HashSet
- 如何在HashSet中添加元素
- 如何判断一个值是否在HashSet中
- 如何删除HashSet中的值
- 如何迭代HashSet
HashSet的特点
首先来看下HashSet类的定义
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
...
}
HashSet继承了AbstractSet类,并且实现了Set接口,获得集合的一般操作。
实现了Cloneable接口,表明可以可以实现克隆功能
实现了Serializable接口,表明可以被序列化
HashSet通过Hash算法来存储其中的元素,具有如下的特点:
- 不能保证元素的排列顺序,顺序有可能发生变化
- HashSet不是同步的,如果多个线程同时访问一个HashSet,如果有2条或者2条以上的线程同时修改了HashSet集合时,最终结果是不确定的,必须通过代码来保证其同步。
- HashSet中允许有null值
HashSet集合中存储的是对象,所以在创建的时候要用对应类型的引用,基本类型的对应引用如下:
基本类型 | 对应的引用类型 |
---|---|
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
创建HashSet集合的格式
HashSet<T> name=new HashSet<T>();
在创建HashSet的时候需要引入java.util.HashSet
实例
import java.util.HashSet;
public class Demo{
public static void main(String[] args){
//布尔类型的实例
HashSet<Boolean> booleanType=new HashSet<Boolean>();
booleanType.add(false);
booleanType.add(true);
System.out.println(booleanType);
//byte类型的实例
HashSet<Byte> byteType=new HashSet<Byte>();
byte b1=2;
byte b2=3;
byteType.add(b1);
byteType.add(b2);
System.out.println(byteType);
//short类型的实例
HashSet<Short> shortType=new HashSet<Short>();
short s1=4;
short s2=5;
shortType.add(s1);
shortType.add(s2);
System.out.println(shortType);
//int类型的实例
HashSet<Integer> intType=new HashSet<Integer>();
intType.add(6);
intType.add(7);
System.out.println(intType);
//long类型的实例
HashSet<Long> longType=new HashSet<Long>();
long l1=8;
long l2=9;
longType.add(l1);
longType.add(l2);
System.out.println(longType);
//float类型的实例
HashSet<Float> floatType=new HashSet<Float>();
float f1=1.0f;
float f2=2.0f;
floatType.add(f1);
floatType.add(f2);
System.out.println(floatType);
//double类型的实例
HashSet<Double> doubleType=new HashSet<Double>();
double d1=3.0;
double d2=4.0;
doubleType.add(d1);
doubleType.add(d2);
System.out.println(doubleType);
//字符类型的实例
HashSet<Character> charType=new HashSet<Character>();
char c1='D';
char c2='J';
charType.add(c1);
charType.add(c2);
System.out.println(charType);
//字符串类型的实例
HashSet<String> stringType=new HashSet<String>();
stringType.add("baidu");
stringType.add("CSDN");
System.out.println(stringType);
}
}
运行结果
[false, true]
[2, 3]
[4, 5]
[6, 7]
[8, 9]
[1.0, 2.0]
[4.0, 3.0]
[D, J]
[CSDN, baidu]
HashSet集合中不允许有相同的值
实例
import java.util.HashSet;
public class Demo{
public static void main(String[] args){
HashSet<Integer> intType=new HashSet<Integer>();
intType.add(1);
intType.add(1);
intType.add(2);
System.out.println(intType);
}
}
运行结果
[1, 2]
如果添加相同的数会对其进行覆盖,这里的add()方法中用的是HashMap中的put()方法,如果有兴趣的可以查看源码。HasMap中的put()方法大致的逻辑是:先查看Hash值是否相等,如果相等则通过==和equals()判断key的值,如果相等则覆盖,不相同就添加新元素。
判断元素是否存在
实例
import java.util.HashSet;
public class Demo{
public static void main(String[] args){
HashSet<Integer> intType=new HashSet<Integer>();
intType.add(1);
intType.add(2);
intType.add(3);
System.out.println(intType.contains(1));
}
}
运行结果
true
这里用的是contains方法来进行判断,返回的是布尔值。
如何删除元素
实例
import java.util.HashSet;
public class Demo{
public static void main(String[] args){
HashSet<Integer> intType=new HashSet<Integer>();
intType.add(1);
intType.add(2);
intType.add(3);
intType.remove(2);
System.out.println(intType);
}
}
运行结果
[1, 3]
这里用的是remove方法,如果想删除所有元素可以使用clear()。
计算大小
实例
import java.util.HashSet;
public class Demo{
public static void main(String[] args){
HashSet<Integer> intType=new HashSet<Integer>();
intType.add(1);
intType.add(2);
intType.add(3);
System.out.println(intType.size());
}
}
运行结果
3
如何迭代HashSet
实例
import java.util.HashSet;
import java.util.Iterator;
public class Demo{
public static void main(String[] args){
HashSet<Integer> intType=new HashSet<Integer>();
intType.add(1);
intType.add(2);
intType.add(3);
//通过Iterator迭代
Iterator ite=intType.iterator();
while(ite.hasNext()){
System.out.print(ite.next()+" ");
}
System.out.println();
//通过for循环迭代
for(Integer a:intType){
System.out.print(a+" ");
}
System.out.println();
}
}
运行结果
1 2 3
1 2 3
主要有两种方法一种是使用Iterator迭代器,还有就是for循环。
其中Iterator迭代器中的HasNext()表示是否有下一个值,返回的是布尔值,next()代表下一个值。下图是Iterator接口的内部结构。