集合04_Set
Posted pycrab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合04_Set相关的知识,希望对你有一定的参考价值。
Set集合总览
集合元素无序、不重复,三个实现类都是线程不安全的,最好在创建时通过Collections工具类的synchronizedSortedSet方法来包装Set集合,防止对set集合的意外非同步访问。
HashSet类
- 底层数据结构是哈希表(是一个元素为链表的数组) 和红黑树,按Hash算法存储元素,具有很好的存取和查找性能
- 判断相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法的返回值也相等
- 如果需要重写equals方法,则也需要重写hashCode方法,保证对象相等(HashMap也是)
- 核心要点如下:
- 集合元素可以为null
- 不保证迭代顺序
- 初始容量影响迭代性能
- 底层封装了HashMap,操作HashSet实际是操作HashMap
- 使用HashMap的put方法,同时使用了==和equals方法判断键是否相等,仅修改了无用的value值,因此对相同元素根本没插入
LinkedHashSet类
- 底层数据结构是哈希表和双向链表
- 根据元素的hashCode值决定存储位置,使用链表维护次序,以插入顺序保存,在迭代访问全部元素时有很好的性能
- 核心要点如下:
- 集合元素可以为null
- 保证迭代顺序
- 迭代双向链表,初始容量不影响性能
- 需要维护双向链表,性能略差于HashSet
- 底层封装了HashMap和双向链表
EnumSet类
- 元素为同类型的枚举值,有序,在内部以单位向量的形式存储,占内存小,运行效率好,尤其是进行批量操作时。
- 不允许加入null值,应该通过提供的类方法创建对象。
TreeSet类
- 底层数据结构是红黑树(是一个自平衡的二叉树),集合元素按大小排序
- 判断相等的标准是通过compareTo方法比较返回0
- 核心要点如下:
- 集合元素不允许为null
- 由于每添加一个元素都要调用该对象的compareTo(Object obj)方法与集合中其他元素比较,所以TreeSet只能添加同一种类型的对象
- 底层封装了TreeMap
- 提供多种方法,如:
- Object first()
- Object last()
- Object lower(Object e)
利用lambda表达式定制排序
import java.util.TreeSet; public class Customer { private String name; private int age; public Customer(int age) { this.age = age; } public String toString() { return "[Customer:" + age + "]"; } public static void main(String[] args) { TreeSet<Customer> tsCustomers = new TreeSet<>((o1,o2) -> { Customer c1 = (Customer)o1; Customer c2 = (Customer)o2; return c1.age > c2.age ? -1 :c1.age < c2.age ? 1 : 0; }); tsCustomers.add(new Customer(10)); tsCustomers.add(new Customer(20)); System.out.println(tsCustomers); } }
输出结果为:
以上是关于集合04_Set的主要内容,如果未能解决你的问题,请参考以下文章