天天看点

Java集合框架系列——HashSet1.基本概念2.继承关系3.结构特点4.常用API5.遍历方式6.代码示例

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

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

1.基本概念

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

2.继承关系

Java集合框架系列——HashSet1.基本概念2.继承关系3.结构特点4.常用API5.遍历方式6.代码示例

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

返回类型 函数名
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[]);
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=; i<; 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[]);
        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());                              
        set.add();                                                  
        set.add();                                                  
        set.add(null);                                               
        set.add(null);set.add(null);                                 
        System.out.println(set.size());                              
        System.out.println(set.contains());                         
        set.clear();                                                 
        System.out.println(set.size());                              
    }                                                                
}                                                                    
           

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