Java集合框架系列——HashSet

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

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

1.基本概念

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

2.继承关系

Java集合框架系列——HashSet_第1张图片

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 map; 
  • 没有重复元素
    哈希表判断元素是否相同:
    判断的是两个元素的哈希值是否相同(HashCode),如果相同,再判断两个对象的内容是否相同(equals)。
如果equals不相等,那么hashcode可能相等;  
如果equals相等,那么hashcode一定相等。  
如果hashcode相等,那么equals可能相等;  
如果hashcode不相等,那么equals一定不相等。
  • 允许使用 null 元素
    由于null==null为true,因而HashSet中只能存储一个null元素。
  • 不是线程安全的
    可以用Collections的synchronizedSet方法使HashSet具有线程安全的能力。
Set set = new HashSet(); // 非同步,非线程安全的Set
Set syncSet = Collections.synchronizedSet(set); 
// 返回了一个线程安全的Set

4.常用API

返回类型 函数名
boolean add(E object)
void clear()
Object clone()
boolean contains(Object object)
boolean isEmpty()
Iterator iterator()
boolean remove(Object object)
int size()

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());                              
    }                                                                
}                                                                    

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

你可能感兴趣的:(Java,java,Collection,set,HashSet,集合框架)