HashSet vs. TreeSet vs. LinkedHashSet
2014-04-12 20:17
399 查看
原文: HashSet
vs. TreeSet vs. LinkedHashSet
Set中不包含重复的元素。这是使用Set的最主要原因之一。有3种常用的Set,如标题,什么时候用哪一个是个问题。一般来说,如果要求速度快,那就用HashSet,如果要求有序,那就用TreeSet,如果要保留插入的顺序,那就用LinkedHashSet。
1,Set接口
Set接口继承自Collection接口,Set中不允许有元素重复,你尽管往Set中插入元素即可,重复的元素会自动被移除。
2,HashSet vs. TreeSet vs. LinkedHashSet
HashSet是由Hash表实现的,元素无序,add,remove,contain方法的时间复杂度为O(1)。
TreeSet是由Tree(red-black)实现的,元素有序,add,remove,contain方法的时间复杂度为O(log(n))。另外提供了许多和Ordered
Set有关的方法,像,first(), last(),headSet() , tailSet().
LinkedHashSet介于HashSet和TreeSet之间,用Linked
List和Hash表实现,保留了数据插入的顺序。一般方法的时间复杂度为O(1)。
3,TreeSet 示例
现定义一个类Dog
将Dog对象添加到TreeSet中
编译正常,但报运行时错误
因为TreeSet是有序的,所以添加到其中的对象需要实现Comparable的compareTo() 方法。
重新运行之前的代码,返回结果:
4,HashSet示例
注意上面的返回顺序并不一定。
5,LinkedHashSet示例
顺序是确定的,即插入顺序。
6,性能测试
测试add方法。
返回结果,可见HashSet是最快的,TreeSet是最慢的,因为它是有序的。
vs. TreeSet vs. LinkedHashSet
Set中不包含重复的元素。这是使用Set的最主要原因之一。有3种常用的Set,如标题,什么时候用哪一个是个问题。一般来说,如果要求速度快,那就用HashSet,如果要求有序,那就用TreeSet,如果要保留插入的顺序,那就用LinkedHashSet。
1,Set接口
Set接口继承自Collection接口,Set中不允许有元素重复,你尽管往Set中插入元素即可,重复的元素会自动被移除。
2,HashSet vs. TreeSet vs. LinkedHashSet
HashSet是由Hash表实现的,元素无序,add,remove,contain方法的时间复杂度为O(1)。
TreeSet是由Tree(red-black)实现的,元素有序,add,remove,contain方法的时间复杂度为O(log(n))。另外提供了许多和Ordered
Set有关的方法,像,first(), last(),headSet() , tailSet().
LinkedHashSet介于HashSet和TreeSet之间,用Linked
List和Hash表实现,保留了数据插入的顺序。一般方法的时间复杂度为O(1)。
3,TreeSet 示例
TreeSet<Integer> tree = new TreeSet<Integer>(); tree.add(12); tree.add(63); tree.add(34); tree.add(45); Iterator<Integer> iterator = tree.iterator(); System.out.print("Tree set data: "); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); }输出结果:
Tree set data: 12 34 45 63
现定义一个类Dog
class Dog { int size; public Dog(int s) { size = s; } public String toString() { return size + ""; } }
将Dog对象添加到TreeSet中
import java.util.Iterator; import java.util.TreeSet; public class TestTreeSet { public static void main(String[] args) { TreeSet<Dog> dset = new TreeSet<Dog>(); dset.add(new Dog(2)); dset.add(new Dog(1)); dset.add(new Dog(3)); Iterator<Dog> iterator = dset.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); } } }
编译正常,但报运行时错误
Exception in thread "main" java.lang.ClassCastException: collection.Dog cannot be cast to java.lang.Comparable at java.util.TreeMap.put(Unknown Source) at java.util.TreeSet.add(Unknown Source) at collection.TestTreeSet.main(TestTreeSet.java:22)
因为TreeSet是有序的,所以添加到其中的对象需要实现Comparable的compareTo() 方法。
class Dog implements Comparable<Dog>{ int size; public Dog(int s) { size = s; } public String toString() { return size + ""; } @Override public int compareTo(Dog o) { return size - o.size; } }
重新运行之前的代码,返回结果:
1 2 3
4,HashSet示例
HashSet<Dog> dset = new HashSet<Dog>(); dset.add(new Dog(2)); dset.add(new Dog(1)); dset.add(new Dog(3)); dset.add(new Dog(5)); dset.add(new Dog(4)); Iterator<Dog> iterator = dset.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); }返回结果
5 3 2 1 4
注意上面的返回顺序并不一定。
5,LinkedHashSet示例
LinkedHashSet<Dog> dset = new LinkedHashSet<Dog>(); dset.add(new Dog(2)); dset.add(new Dog(1)); dset.add(new Dog(3)); dset.add(new Dog(5)); dset.add(new Dog(4)); Iterator<Dog> iterator = dset.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); }
顺序是确定的,即插入顺序。
2 1 3 5 4
6,性能测试
测试add方法。
public static void main(String[] args) { Random r = new Random(); HashSet<Dog> hashSet = new HashSet<Dog>(); TreeSet<Dog> treeSet = new TreeSet<Dog>(); LinkedHashSet<Dog> linkedSet = new LinkedHashSet<Dog>(); // start time long startTime = System.nanoTime(); for (int i = 0; i < 1000; i++) { int x = r.nextInt(1000 - 10) + 10; hashSet.add(new Dog(x)); } // end time long endTime = System.nanoTime(); long duration = endTime - startTime; System.out.println("HashSet: " + duration); // start time startTime = System.nanoTime(); for (int i = 0; i < 1000; i++) { int x = r.nextInt(1000 - 10) + 10; treeSet.add(new Dog(x)); } // end time endTime = System.nanoTime(); duration = endTime - startTime; System.out.println("TreeSet: " + duration); // start time startTime = System.nanoTime(); for (int i = 0; i < 1000; i++) { int x = r.nextInt(1000 - 10) + 10; linkedSet.add(new Dog(x)); } // end time endTime = System.nanoTime(); duration = endTime - startTime; System.out.println("LinkedHashSet: " + duration); }
返回结果,可见HashSet是最快的,TreeSet是最慢的,因为它是有序的。
HashSet: 2244768 TreeSet: 3549314 LinkedHashSet: 2263320
相关文章推荐
- HashSet vs. TreeSet vs. LinkedHashSet
- HashSet vs. TreeSet vs. LinkedHashSet
- HashSet vs. TreeSet vs. LinkedHashSet
- HashSet vs. TreeSet vs. LinkedHashSet
- HashSet vs. TreeSet vs. LinkedHashSet
- HashSet vs. TreeSet vs. LinkedHashSet
- HashSet vs. TreeSet vs. LinkedHashSet
- Java容器源码分析-HashSet vs TreeSet vs LinkedHashSet
- HashSet vs TreeSet vs LinkedHashSet
- day17 集合框架 LinkedHashSet TreeSet Map 泛型
- HashSet/LinkedHashSet/TreeSet
- JAVA菜鸟入门(17) 有排序的TreeSet和无排序的HashSet, LinkedHashSet
- JDK源码学习笔记——HashSet LinkedHashSet TreeSet
- JDK源码学习(6)-java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet
- TreeSet+LinkedHashSet+Comparable+Hashcode+Equals
- [2017.11.12]Set&HashSet&LinkedHashSet&TreeSet&模拟用户
- Java散列集Set 树集TreeSet HashSet LinkedHashSet SortedSet NavigableSet
- HashSet /LinkedHashSet/TreeSet排序的不同
- 黑马程序员_JavaSE基础17 之 集合框架 Vector LinkedList ArrayList HashSet LinkedHasSet TreeSet
- 容器Collection的总结一 Vector ArrayList LinkedList HashSet TreeSet