Java中HashSet、TreeSet和LinkedHashSet的比较

正文索引 [隐藏]

写在前面:

嘤…嘤嘤,本菜鸡只会用C++的STL,通过前面的博文也可以看出来。我jio得非常有必要学习一下JAVA中的STL。好了,不瞎哔哔了。

说正经的:

我是站在C++的基础上来理解JAVA的Set用法的,JAVA中常用的Set方法:

函数和用法
add( )         向集合中添加元素
clear( )        去掉集合中所有的元素
contains( )    判断集合中是否包含某一个元素
isEmpty( )    判断集合是否为空
iterator( )    主要用于递归集合,返回一个Iterator()对象
remove( )    从集合中去掉特定的对象
size( )        返回集合的大小

Java中的set有三种:HashSet,TreeSet和LinkedHashSet。

①HashSet的输出顺序是不确定的,但是它的速度最快;

②TreeSet输出顺序是升序排列的,相当于C++中的set,个人比较喜欢这种;

③LinkedHashSet输出顺序是确定的,就是插入时的顺序。

Talk is cheap,show me the code!下面通过一段代码来比较三者的性能:

import java.util.*;
 
public class SetExample {
    public static void Cmp(Set s) {
        int[] a = {1,6,58,99,23,88};
        long startTime = System.nanoTime();
        //添加元素
        for(int i = 0; i < a.length; i++) {
            s.add(a[i]);
            s.add(a[i]);
            s.add(a[i]);
        }
        //输出元素
        Iterator it = s.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
        long endTime = System.nanoTime();
        long duration = endTime - startTime;  //持续时间
        System.out.println("耗时(单位:纳秒):"+duration);
    }
    
    public static void main(String[] args) {
        //声明三种Set
        Set<Integer> set1 = new HashSet();
        Set<Integer> set2 = new TreeSet();
        Set<Integer> set3 = new LinkedHashSet();
        //比较三种Set的性能
        //HashSet输出顺序是不确定的,但是速度最快
        System.out.print("HashSet的输出顺序:");
        Cmp(set1);  
        //TreeSet输出顺序是升序排列的,相当于C++中的set
        System.out.print("TreeSet的输出顺序:");
        Cmp(set2);
        //LinkedHashSet输出顺序是确定的,就是插入时的顺序
        System.out.print("LinkedHashSet的输出顺序:");
        Cmp(set3);
    }
}

比较结果:

HashSet的输出顺序:1 99 6 23 88 58 耗时(单位:纳秒):263293
TreeSet的输出顺序:1 6 23 58 88 99 耗时(单位:纳秒):554667
LinkedHashSet的输出顺序:1 6 58 99 23 88 耗时(单位:纳秒):615202