【Java集合之二】Set集合
程序员文章站
2024-01-19 09:26:16
...
本文围绕以下六个部分展开:
一、Set集合
二、HashSet类
三、LinkedHashSet类
四、TreeSet类
五、EnumSet类
六、各个Set实现类的性能分析
一、Set集合
1. Set与Collection
Set集合与Collection除了不允许包含重复元素外,其他都完全一样。它没有提供任何额外的方法。
2. Set判断两个对象相同
Set用equals方法(而不是==)来判断两个对象相同。
只要两个对象用equals方法比较返回true,Set就不会接受这两个对象;只要用equals方法返回false,Set就会接受这两个对象(甚至这两个对象是同一个对象,Set也可把它们当成两个对象处理)。
二、HashSet类
1. 概念
它是Set接口的典型实现,大多数时候使用Set集合时就说使用这个实现类。
HashSet按Hash算法来存储集合中的元素,因此具有良好的存取和查找性能。
2. 特点
(1)不能保证元素的排列顺序,顺序有可能发生变化。
(2)HashSet不是同步的,如果多个线程同时访问一个HashSet,假设有两个或者两个以上线程同时修改了HashSet集合时,则必须通过代码来保证其同步。
(3)集合元素值可以是null。
3. HashSet集合判断两个元素相等的标准
两个对象通过equals方法比较相等,而且两个对象的hashCode()方法返回值也相等。
4. 重写hashCode()方法的基本规则
(1)在程序运行过程中,同一个对象多次调用hashCode()方法应该返回相同的值。
(2)当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法应返回相等的值。
(3)对象中用作equals()方法比较标准的Field,都应该用来计算hashCode值。
三、LinkedHashSet类
1. LinkedHashSet是HashSet的子类,因此:1)它依然不允许集合元素重复;2)它也是根据元素的hashCode值来决定元素的存储位置。
2. LinkedHashSet同时使用链表维护元素的次序,因此,当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
它需要维护元素的插入顺序,因此性能略低于HashSet。但在遍历Set里的全部元素时将有很好的性能。
四、TreeSet类
1. 概念
TreeSet是SortedSet接口的实现类。它可以确保集合元素处于排序状态。
2. 方法
与HashSet集合相比,TreeSet由于集合元素有序,因此增加了访问第一个、前一个、后一个、最后一个元素的方法,并提供了三个截取子TreeSet的方法。
3. TreeSet采用[b]红黑树的数据结构来存储集合元素。[/b]
4. 排序方法:
(1)自然排序。
(2)定制排序。
五、EnumSet类
它是专为枚举类设计的集合类。
六、各个Set实现类的性能分析
1. HashSet与TreeSet
HashSet性能总是比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。
2. HashSet与LinkedHashSet
对于普通的插入、删除操作,HashSet比LinkedHashSet要快(因为LinkedHashSet维护链表会带来额外开销)。但遍历元素时,LinkedHashSet更好。
3. EnumSet
它是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。
4. HashSet、TreeSet与EnumSet都是线程不安全的。
如果有多个线程同时访问一个Set集合,并且有超过一个线程修改了该Set集合,则必须手动保证该Set集合的同步性。
通常可以通过Collections工具类的synchronizedSortedSet方法来“包装”该Set集合。此操作最好在创建时进行,以防止对Set集合的意外非同步访问。
整理时重点参考:《疯狂Java讲义》(第2版) 李刚 编著
一、Set集合
二、HashSet类
三、LinkedHashSet类
四、TreeSet类
五、EnumSet类
六、各个Set实现类的性能分析
一、Set集合
1. Set与Collection
Set集合与Collection除了不允许包含重复元素外,其他都完全一样。它没有提供任何额外的方法。
2. Set判断两个对象相同
Set用equals方法(而不是==)来判断两个对象相同。
只要两个对象用equals方法比较返回true,Set就不会接受这两个对象;只要用equals方法返回false,Set就会接受这两个对象(甚至这两个对象是同一个对象,Set也可把它们当成两个对象处理)。
二、HashSet类
1. 概念
它是Set接口的典型实现,大多数时候使用Set集合时就说使用这个实现类。
HashSet按Hash算法来存储集合中的元素,因此具有良好的存取和查找性能。
2. 特点
(1)不能保证元素的排列顺序,顺序有可能发生变化。
(2)HashSet不是同步的,如果多个线程同时访问一个HashSet,假设有两个或者两个以上线程同时修改了HashSet集合时,则必须通过代码来保证其同步。
(3)集合元素值可以是null。
3. HashSet集合判断两个元素相等的标准
两个对象通过equals方法比较相等,而且两个对象的hashCode()方法返回值也相等。
4. 重写hashCode()方法的基本规则
(1)在程序运行过程中,同一个对象多次调用hashCode()方法应该返回相同的值。
(2)当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法应返回相等的值。
(3)对象中用作equals()方法比较标准的Field,都应该用来计算hashCode值。
三、LinkedHashSet类
1. LinkedHashSet是HashSet的子类,因此:1)它依然不允许集合元素重复;2)它也是根据元素的hashCode值来决定元素的存储位置。
2. LinkedHashSet同时使用链表维护元素的次序,因此,当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
它需要维护元素的插入顺序,因此性能略低于HashSet。但在遍历Set里的全部元素时将有很好的性能。
四、TreeSet类
1. 概念
TreeSet是SortedSet接口的实现类。它可以确保集合元素处于排序状态。
2. 方法
与HashSet集合相比,TreeSet由于集合元素有序,因此增加了访问第一个、前一个、后一个、最后一个元素的方法,并提供了三个截取子TreeSet的方法。
3. TreeSet采用[b]红黑树的数据结构来存储集合元素。[/b]
4. 排序方法:
(1)自然排序。
(2)定制排序。
五、EnumSet类
它是专为枚举类设计的集合类。
六、各个Set实现类的性能分析
1. HashSet与TreeSet
HashSet性能总是比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。
2. HashSet与LinkedHashSet
对于普通的插入、删除操作,HashSet比LinkedHashSet要快(因为LinkedHashSet维护链表会带来额外开销)。但遍历元素时,LinkedHashSet更好。
3. EnumSet
它是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。
4. HashSet、TreeSet与EnumSet都是线程不安全的。
如果有多个线程同时访问一个Set集合,并且有超过一个线程修改了该Set集合,则必须手动保证该Set集合的同步性。
通常可以通过Collections工具类的synchronizedSortedSet方法来“包装”该Set集合。此操作最好在创建时进行,以防止对Set集合的意外非同步访问。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
整理时重点参考:《疯狂Java讲义》(第2版) 李刚 编著
上一篇: 换位思考的价值
下一篇: 动态设置flash背景图片