Java---HashSet

Concept

HashSet是Set接口的实现类,以哈希表的结构为支持。

HashSet并不能保证集合中的顺序,也就是存取顺序可能不一样。

HashSet也允许有null的出现。

HashSet是基于HashMap实现的,底层用HashMap来保存元素。

HashSet的迭代时间与HashSet中元素和容量之和成正比关系,所以如果迭代性能在这里很重要,就不要把初始容量设置得过高。

HashSet并不是同步的。如果有多个线程同时存取HashSet且至少有一个线程来修改set,它必须实现外部同步。这通常是通过同步一些可以自动包装set的对象来完成这项操作,如果没有这类对象,那我们就使用Collections.synchronizedSet的方法来包装。

如果set在迭代器创建后,除了迭代器自己调用了remove方法,一旦发生set数据修改就会抛出ConcurrentModicationException异常。这就保证了set在面对并发修改时会快速且干脆地报错。但是我们写程序不能依赖于这项机制,它只能被应用于发现bug。

创建HashSet

HashSet<E> set = new HashSet<>();
Method
TypeMethodSignificance
booleanadd(E e)返回是否成功往set中添加元素
voidclear()清除set中所有元素
Objectclone()返回一个HashSet的浅拷贝对象,元素本身没有被clone
booleancontains(Object o)set中是否有指定元素
booleanisEmpty()set是否为空
Iterator<E>iterator()返回一个调用set中元素的迭代器
booleanremove(Object o)是否成功清除set中指定元素
intsize()返回set中元素个数
Example
public class test{
    public static void main(String args[]) {
        HashSet<String> set1 = new HashSet<>();
        HashSet<String> set2;
        // 建立两个HashSet 元素类型为String
        set1.add("Study");
        set1.add("Everyday");
        set1.add("University");
        System.out.println("set1的HashSet:" + set1);
        // 用add往set1中加三个对象
        set2 = (HashSet)set1.clone();
        set2.remove("Study");
        System.out.println("拷贝后的HashSet:" + set2);
        System.out.println("原来的HashSet:" + set1);
        // 运用set1的clone方法拷贝给set2 因为是软拷贝 set1没有变化
        set2.clear();
        System.out.println(set2.isEmpty());
        // 清除数据后 看set2是否为空
        System.out.println(set1.contains("Study"));
        System.out.println(set1.size());
        // 判断set1中是否有指定元素 并且计算set1中的元素个数 
        Iterator iter = set1.iterator();
        while(iter.hasNext()){
            String s = (String)iter.next();
            System.out.println(s);
        }
        // 用迭代器输出set1中的每一个string对象
    }
}

运行结果

set1的HashSet:[Study, University, Everyday]
拷贝后的HashSet:[Everyday, University]
原来的HashSet:[Study, University, Everyday]
true
true
3
Study
University
Everyday

这里的输出顺序与之前的存入顺序不一样,也可以说明我们通过输入并不能保证元素在集合中的顺序。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值