`
angelbill3
  • 浏览: 256608 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

【总结】Java基础之Set:HashSet vs. LinkedHashSet vs. TreeSet

 
阅读更多
总结平时常用的Collection子接口:Set接口以及其实现类。

Set接口,它和List很像,主要区别是其所有的元素都是不可复重的。List是有序的集合,而Set的排序得看其具体的实现,比如HashSet是无序的,而LinkedHashSet和TreeSet就是有序的。
另外,Set如果要存null元素,那也只能存一个。(去重性)

Set和List的区别表:
SetList
元素重复不可以重复可以重复
排序 不一定有序:得看具体的实现有序
按索引取元素,即get(int index)不可以可以

注:Set是不能按索引取元素的,原因就是因为Set是无序的。

类图如下:


Set的底层实现比较简单,是基于Map实现的,相当于是Map的Key,以下是实现对应表:
SetMap
HashSetHashMap
LinkedHashSetLinkedHashMap
TreeSetTreeMap


Set默认都是线程不安全的,想要返回一个线程安全的对象,使用以下方法:
Set s = Collections.synchronizedSet(new HashSet(...));
Set s = Collections.synchronizedSet(new LinkedHashSet(...));
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));


1、HashSet
HashSet是常用的Set接口的实现之一。
对于HashSet而言,它是基于HashMap实现的,相当于是HashMap的key。

值得注意的是,对于方法boolean contains(Object o),HashSe的时间复杂度是O(1),而ArrayList的contains方法的时间复杂度是O(n)。
所以在List集合的选用上,如果不在意重复的元素以及contain方法的效率,那就用ArrayList,返之就用HashSet。

以下是个人实验:
public void containsPerformanceTest() {
	Set<String> set = new HashSet<String>();
	List<String> list = new ArrayList<String>();
		
	for (int i = 0; i < 1000000; i ++) {
		set.add(i + "");
		list.add(i + "");
	}
		
	long st = System.currentTimeMillis();
	if (set.contains("999799")) {
		System.out.println("set contains method cost: " + (System.currentTimeMillis() - st) + " ms");
		// set contains method cost: 0 ms
	}
		
	long st1 = System.currentTimeMillis();
	if (list.contains("999799")) {
		System.out.println("list contains method cost: " + (System.currentTimeMillis() - st1) + " ms");
		// list contains method cost: 18 ms
	}
}


2、LinkedHashSet
和HashSet不同的是,LinkedHashSet是双向链表的list。其排序是按加入的元素排的(迭代器顺序)。
LinkedHashSet基于LinkedHashMap实现的,相当于是LinkedHashMap的key。和LinkedHashMap一样,是JDK1.4开始的。

3、TreeSet
TreeSet是SortedSet的一个实现,是个有序的Set。它的其中一个构造函数,可以传入Comparator类,返回一个按自定义排序器排序的Set。
TreeSet(Comparator<? super E> comparator) 


-------------------------------------------
参考:
http://docs.oracle.com/javase/6/docs/api/java/util/Set.html
http://stackoverflow.com/questions/769731/why-doesnt-java-util-set-have-getint-index


分享到:
评论

相关推荐

    HashSet,TreeSet和LinkedHashSet的区别1

    本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...

    Java 72 道面试题及答案.docx

    1. Set(集):无序、不可重复、唯一,实现类有HashSet、TreeSet、LinkedHashSet等。 2. List(列表):有序、可重复、多个null元素,实现类有ArrayList、LinkedList、Vector等。 3. Map(映射):键值对集合,键...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...

    Java集合框架Set接口.pdf

    Java集合框架中的Set接口是Java编程中不可或缺的一部分,主要用于存储不允许重复的元素。Set接口继承了Collection接口,因此它具备了Collection接口的所有基本操作。同时,Set接口还提供了特有的方法,如添加元素、...

    ThinkinginJava之Set接口、HashSet源码学习.pdf

    Set接口在Java编程语言中是集合框架的一部分,它代表了一个不允许包含重复元素的集合。Set接口继承了Collection接口,提供了与Collection相同的基本方法,如添加元素(add)、判断是否为空(isEmpty)、删除元素(remove)...

    Java基础核心总结.pdf

    4. Java集合框架:包括ArrayList、LinkedList、Vector、HashSet、TreeSet、LinkedHashSet、PriorityQueue等集合类。 Java集合框架提供了一些常用的集合类,可以用来存储和管理数据。这些集合类可以分为两种:List和...

    java集合总结副本共19页.pdf.zip

    这个“java集合总结副本共19页.pdf.zip”压缩包很可能是对Java集合框架的详细讲解,涵盖了重要的知识点,包括ArrayList、LinkedList、HashSet、HashMap、TreeSet、TreeMap等主要集合类,以及它们的特点、性能和应用...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    本文将深入探讨Java中四个主要的Set实现类:HashSet、LinkedHashSet、TreeSet以及EnumSet。 首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`...

    Java软件开发实战 Java基础与案例开发详解 11-3 Set接口实现类 共19页.pdf

    ### Java软件开发实战:Java基础与案例开发详解 #### 11-3 Set接口实现类 在Java集合框架中,`Set`接口是`Collection`接口的子接口,它不允许包含重复元素。本文将详细介绍`Set`接口及其三种主要实现类:`HashSet`...

    对Java中Set的深入研究.pdf

    Set接口继承自Collection接口,并提供了多种实现类,如HashSet、LinkedHashSet、TreeSet和CopyOnWriteArraySet等。这些实现类各自有不同的特性和使用场景。 1. 实现类详解: - `CopyOnWriteArraySet`:这个类基于`...

    Java 72道面试题和答案.docx

    - Set接口的实现类:HashSet、TreeSet、LinkedHashSet等。 - List接口的实现类:ArrayList、LinkedList、Stack和Vector等。 6. **List、Set、Map三者的区别**: - List:有序容器,元素可重复,支持索引操作,...

    Java基础学习25.pdf

    3. **HashSet实现**:HashSet是Set接口的实现之一,底层实现是HashMap。HashSet的元素作为HashMap的键存在,而HashMap的值则统一使用一个固定的对象PRESENT。由于HashMap不允许键重复,所以HashSet也不允许重复元素...

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...

    Java源码分析:集合-容器.pdf

    首先,Set集合是一个不允许重复元素的集合,它有多种实现方式,其中包括HashSet、TreeSet和LinkedHashSet。HashSet是基于HashMap实现的,其元素存储在HashMap的key上,而value使用一个静态的默认对象。为了保证元素...

    java 运用集的相关类(Set)

    Java提供了多种Set接口的实现,如HashSet、TreeSet和LinkedHashSet。 1. HashSet:这是最常用的Set实现,它不保证元素的顺序,允许使用null值,但不允许元素重复。HashSet内部使用哈希表来存储元素,因此添加、删除...

Global site tag (gtag.js) - Google Analytics