集合04_Set
2024-09-24 13:55:52
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);
}
}
输出结果为:
最新文章
- 23种设计模式--工厂模式-Factory Pattern
- 【java】之 apache commons-codec 与Apache Digest demo实例,支持md5 sha1 base64 hmac urlencode
- web项目中的跨域问题解决方法
- 学习JQ
- C# 選擇本機檔案並上傳
- mysql给日期增减
- 淘宝的ip地址库
- 在WIN32 DLL中使用MFC库遇到的问题
- MVC 路由规则
- python模块与包
- Servlet的学习之Request请求对象(3)
- Python:generator的send()方法流程分析
- 201521123002《Java程序设计》第8周学习总结
- 爱pia戏推出PC客户端,为您自动置顶窗口,方便查找
- 记一个http-proxy-middleware 代理访问nginx映射的接口不通过的问题(connection close)
- FORTH基础
- Navicat远程连接阿里云服务器的mysql
- requests之一:HTTP请求 状态码
- 图表管理账单的NABCD
- css 小坑