Java 集合框架--HashSet详细介绍和使用总结

1.介绍

HashSet 是一个没有重复元素的集合
它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素
HashSet是非同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:

Set s = Collections.synchronizedSet(new HashSet(...));
1.1 构造函数
HashSet() 
          构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
HashSet(Collection<? extends E> c) 
          构造一个包含指定 collection 中的元素的新 set。
HashSet(int initialCapacity) 
          构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
HashSet(int initialCapacity, float loadFactor) 
          构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。
1.2 常用方法

boolean add(E e) 
          如果此 set 中尚未包含指定元素,则添加指定元素。
 void clear() 
          从此 set 中移除所有元素。
 Object clone() 
          返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。
 boolean contains(Object o) 
          如果此 set 包含指定元素,则返回 true
 boolean isEmpty() 
          如果此 set 不包含任何元素,则返回 true
 Iterator<E> iterator() 
          返回对此 set 中元素进行迭代的迭代器。
 boolean remove(Object o) 
          如果指定元素存在于此 set 中,则将其移除。
 int size() 
          返回此 set 中的元素的数量(set 的容量)。
1.3 遍历方式
    // 通过Iterator遍历HashSet 。推荐方式
    public static void iteraHashSet(HashSet set) {
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.printf("iterator : %s\n", iterator.next());
        }
    }
    // 通过for-each遍历HashSet.不推荐!此方法需要先将Set转换为数组
    public 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);
        }
    }
public class HashSetE {

    public static void main(String[] args) {
        testHashSetApis();
    }

    public static void testHashSetApis() {
        //新建HashSet
        HashSet<String> set = new HashSet();
        //添加元素到HashSet
        for (int i = 0; i < 5; i++) {
            set.add("" + i);
        }
        //iteraHashSet(set);
        //foreachHashSet(set);
        //打印HashSet的实际大小
        System.out.printf("size:%d\n",set.size());
        //判断HashSet 是否包含某个值
        System.out.printf("HashSet contains a :%s\n", set.contains("a"));
        //删除对象
        set.remove("1");
        //新建一个包含2,3,4的HashSet
        HashSet otherset=new HashSet();
        otherset.add("2");
        otherset.add("3");

        //克隆一个removeset,内容和set 一模一样
        HashSet removeset=(HashSet) set.clone();
        //删除“removeset中,属于othersSet的元素”
        removeset.removeAll(otherset);
        //打印removeset
        System.out.printf("removeset : %s\n", removeset);

        HashSet retainset=(HashSet)set.clone();
        retainset.retainAll(otherset);
        System.out.printf("retainset : %s\n", retainset);

        //清空HashSet
        set.clear();
        //输出Hashset 是否为空
        System.out.printf("%s\n",set.isEmpty()?"isEmpty":"not isEmpty");
    }

    // 通过Iterator遍历HashSet 。推荐方式
    public static void iteraHashSet(HashSet set) {
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.printf("iterator : %s\n", iterator.next());
        }
    }
    // 通过for-each遍历HashSet.不推荐!此方法需要先将Set转换为数组
    public 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);
        }
    }
}


猜你喜欢

转载自blog.csdn.net/yujq1993/article/details/79399294