Java集合框架学习(二) HashSet详解

HashSet介绍


    这个类实现了Set接口,背后是一个hash table(实际上是个HashMap 实例) 。它不保证元素的迭代顺序。尤其是,随着时间推

移它不保证某一元素的位置不变。这个类是非线程安全的,不过可以通过以下方式显式实现:

Set s = Collections.synchronizedSet(new HashSet(...));
 

HashSet特点


1)HashSet 不维护任何顺序, 元素将以随机顺序返回。

2)HashSet 不允许有重复元素, 如果你试图添加重复元素, 旧有的元素值将被覆盖

3)HashSet 允许有null值,然而如果你插入多个null它将只返回一个。

4)HashSet 是非线程安全的。

5)这个类返回的迭代器是快速失败的,也就是说如果你在创建迭代器之后又去修改HashSet,迭代器将抛出ConcurrentModificationException异常,除非你调用的是迭代器的remove方法。


HashSet日常操作


1.基本例子

package com.dylan.collection;

import java.util.HashSet;

/**
 * @author xusucheng
 * @create 2018-01-27
 **/
public class HashSetExample {
    public static void main(String args[]) {
        // HashSet declaration
        HashSet<String> hset =
                new HashSet<String>();

        // Adding elements to the HashSet
        hset.add("Apple");
        hset.add("Mango");
        hset.add("Grapes");
        hset.add("Orange");
        hset.add("Fig");
        //Addition of duplicate elements
        hset.add("Apple");
        hset.add("Mango");
        //Addition of null values
        hset.add(null);
        hset.add(null);

        //Displaying HashSet elements
        System.out.println(hset);
    }
}

输出:

[null, Apple, Grapes, Fig, Mango, Orange]


2.删除所有元素


package com.dylan.collection;

import java.util.HashSet;

/**
 * @author xusucheng
 * @create 2018-01-27
 **/
public class EmptyHashSetExample {
    public static void main(String[] args) {
        // Create a HashSet
        HashSet<String> hset = new HashSet<String>();

        //add elements to HashSet
        hset.add("Element1");
        hset.add("Element2");
        hset.add("Element3");
        hset.add("Element4");
        hset.add("Element5");

        // Display HashSet elements
        System.out.println("Before: HashSet contains: "+ hset);

     /* public void clear(): It removes all the elements
      * from HashSet. The set becomes empty after this
      * method gets called.
      */
        hset.clear();

        // Display HashSet content again
        System.out.println("After: HashSet contains: "+ hset);
    }
}
输出:

Before: HashSet contains: [Element5, Element4, Element3, Element2, Element1]
After: HashSet contains: []


3.如何迭代


3.1 使用Iterator
3.2 使用for循环

package com.dylan.collection;

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

/**
 * @author xusucheng
 * @create 2018-01-27
 **/
public class IterateHashSet {
    public static void main(String[] args) {
        // Create a HashSet
        HashSet<String> hset = new HashSet<String>();

        //add elements to HashSet
        hset.add("Chaitanya");
        hset.add("Rahul");
        hset.add("Tim");
        hset.add("Rick");
        hset.add("Harry");
        //1.use Iterator
        System.out.println("----use Iterator:");
        Iterator<String> it = hset.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        //2.use loop
        System.out.println("----use loop:");
        for (String temp : hset) {
            System.out.println(temp);
        }
    }
}
输出:

----use Iterator:
Chaitanya
Rahul
Harry
Tim
Rick
----use loop:
Chaitanya
Rahul
Harry
Tim
Rick


4.转换为数组


package com.dylan.collection;

import java.util.HashSet;

/**
 * @author xusucheng
 * @create 2018-01-27
 **/
public class ConvertHashSettoArray {
    public static void main(String[] args) {
        // Create a HashSet
        HashSet<String> hset = new HashSet<String>();

        //add elements to HashSet
        hset.add("Element1");
        hset.add("Element2");
        hset.add("Element3");
        hset.add("Element4");

        // Displaying HashSet elements
        System.out.println("HashSet contains: "+ hset);

        // Creating an Array
        String[] array = new String[hset.size()];
        hset.toArray(array);

        // Displaying Array elements
        System.out.println("Array elements: ");
        for(String temp : array){
            System.out.println(temp);
        }
    }
}

输出:

HashSet contains: [Element4, Element3, Element2, Element1]
Array elements:
Element4
Element3
Element2
Element1


5.转换为TreeSet


package com.dylan.collection;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author xusucheng
 * @create 2018-01-27
 **/
public class ConvertHashSettoTreeSet {
    public static void main(String[] args) {
        // Create a HashSet
        HashSet<String> hset = new HashSet<String>();

        //add elements to HashSet
        hset.add("Element1");
        hset.add("Element2");
        hset.add("Element3");
        hset.add("Element4");

        // Displaying HashSet elements
        System.out.println("HashSet contains: "+ hset);

        // Creating a TreeSet of HashSet elements
        Set<String> tset = new TreeSet<String>(hset);

        // Displaying TreeSet elements
        System.out.println("TreeSet contains: ");
        for(String temp : tset){
            System.out.println(temp);
        }
    }
}

输出:

HashSet contains: [Element4, Element3, Element2, Element1]
TreeSet contains:
Element1
Element2
Element3
Element4


6.转换为List/ArrayList

package com.dylan.collection;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * @author xusucheng
 * @create 2018-01-27
 **/
public class ConvertHashSetToArrayList {
    public static void main(String[] args) {
        // Create a HashSet
        HashSet<String> hset = new HashSet<String>();

        //add elements to HashSet
        hset.add("Steve");
        hset.add("Matt");
        hset.add("Govinda");
        hset.add("John");
        hset.add("Tommy");

        // Displaying HashSet elements
        System.out.println("HashSet contains: "+ hset);

        // Creating a List of HashSet elements
        List<String> list = new ArrayList<String>(hset);

        // Displaying ArrayList elements
        System.out.println("ArrayList contains: "+ list);
    }
}


输出:

HashSet contains: [Matt, Steve, Govinda, John, Tommy]
ArrayList contains: [Matt, Steve, Govinda, John, Tommy]



HashSet 对比 HashMap


1.相同点


1)两者都是非线程安全的。

2)都不保证元素的顺序

3)如果你看了HashSet源码就知道它的背后是HashMap在支持其各种操作。

4)两者在添加,删除元素等操作时的性能一致。


2.不同点


HashSetHashMap
实现的是Set接口实现的是Map接口
存储的是对象(元素或值),例如我有一个存储String元素的HashSet,
我可以这样描述:[null, Apple, Grapes, Fig, Mango, Orange]
存储的是Key&Value(键值对)
不允许有重复值不允许有重复Key,但可以有多个重复value
只允许有一个null元素允许有一个null key, null的value可以有多个


posted @ 2018-01-27 11:41  一锤子技术员  阅读(6)  评论(0编辑  收藏  举报  来源