Java集合框架系列——HashSet

直通车:Java集合框架系列目录

  1. 基本概念
  2. 继承关系
  3. 结构特点
  4. 常用API
  5. 遍历方式
  6. 代码示例

1.基本概念

HashSet:一种没有重复元素的无序集合。

2.继承关系

这里写图片描述

HashSet是一个继承于AbstractSet的散列集。
HashSet实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
HashSet实现java.io.Serializable接口,意即HashSet支持序列化,能通过序列化传输

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable { }

3.结构特点

  • 基于HashMap实现
    HashSet中含有一个HashMap类型的成员变量map,HashSet的操作函数实际上都是通过map实现的。
// HashSet类中使用HashMap来保存所有元素。  
    private transient HashMap<E,Object> map; 
  • 没有重复元素
    哈希表判断元素是否相同:
    判断的是两个元素的哈希值是否相同(HashCode),如果相同,再判断两个对象的内容是否相同(equals)。
如果equals不相等,那么hashcode可能相等;  
如果equals相等,那么hashcode一定相等。  
如果hashcode相等,那么equals可能相等;  
如果hashcode不相等,那么equals一定不相等。
  • 允许使用 null 元素
    由于null==null为true,因而HashSet中只能存储一个null元素。
  • 不是线程安全的
    可以用Collections的synchronizedSet方法使HashSet具有线程安全的能力。
Set<T> set = new HashSet<T>(); // 非同步,非线程安全的Set
Set<T> syncSet = Collections.synchronizedSet(set); 
// 返回了一个线程安全的Set

4.常用API

返回类型函数名
booleanadd(E object)
voidclear()
Objectclone()
booleancontains(Object object)
booleanisEmpty()
Iteratoriterator()
booleanremove(Object object)
intsize()

5.遍历方式

1.通过Iterator遍历HashSet
第一步:根据iterator()获取HashSet的迭代器。
第二步:遍历迭代器获取各个元素。

// 假设set是HashSet对象
for(Iterator iterator = set.iterator();
       iterator.hasNext(); ) { 
    iterator.next();
}   

2.通过for-each遍历HashSet
第一步:根据toArray()获取HashSet的元素集合对应的数组。
第二步:遍历数组,获取各个元素。

// 假设set是HashSet对象,并且set中元素是String类型
String[] arr = (String[])set.toArray(new String[0]);
for (String str:arr)
    System.out.printf("for each : %s\n", str);

6.代码示例

import java.util.Random;
import java.util.Iterator;
import java.util.HashSet;

/*
 * @desc 介绍HashSet遍历方法
 *
 * @author skywang
 */
public class HashSetIteratorTest {

    public static void main(String[] args) {
        // 新建HashSet
        HashSet set = new HashSet();

        // 添加元素 到HashSet中
        for (int i=0; i<5; i++)
            set.add(""+i);

        // 通过Iterator遍历HashSet
        iteratorHashSet(set) ;

        // 通过for-each遍历HashSet
        foreachHashSet(set);
    }

    /*
     * 通过Iterator遍历HashSet。推荐方式
     */
    private static void iteratorHashSet(HashSet set) {
        for(Iterator iterator = set.iterator();
               iterator.hasNext(); ) {
            System.out.printf("iterator : %s\n", iterator.next());
        }
    }

    /*
     * 通过for-each遍历HashSet。不推荐!此方法需要先将Set转换为数组
     */
    private static void foreachHashSet(HashSet set) {
        String[] arr = (String[])set.toArray(new String[0]);
        for (String str:arr)
            System.out.printf("for each : %s\n", str);
    }
}
import java.util.HashSet;                                            
import java.util.Set;                                                

public class SetTest {                                                  
    public static void main(String[] args) {                         
        Set<Integer> set = new HashSet<>();                          
        System.out.println(set.add(3));                              
        set.add(4);                                                  
        set.add(2);                                                  
        set.add(null);                                               
        set.add(null);set.add(null);                                 
        System.out.println(set.size());                              
        System.out.println(set.contains(4));                         
        set.clear();                                                 
        System.out.println(set.size());                              
    }                                                                
}                                                                    

如有谬误或不完善之处,恳请斧正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值