当前位置: 首页 > news >正文

Java集合框架:深入理解List与Set及其实现类

在Java集合框架中,List和Set是两个最常用的接口,它们各自有着独特的特点和适用场景。本文将详细介绍List和Set的区别,以及HashSet、LinkedHashSet和TreeSet这三个Set接口的主要实现类的特点、使用方法和适用场景。

一、List和Set集合的区别

1. 有序性

  • List:保证按插入顺序排序,元素的有序性是按照添加的先后顺序确定的
  • Set:存储和取出顺序不一致(除LinkedHashSet外)

2. 唯一性

  • List:元素可以重复,允许存储相同的元素
  • Set:元素唯一,不允许存储重复的元素

3. 获取元素方式

  • List:可以通过索引直接操作元素,提供了基于位置的访问方法
  • Set:不能根据索引获取元素,只能通过迭代器或增强for循环遍历

二、HashSet集合

1. HashSet集合的特点

  • HashSet底层使用的是HashMap实现
  • 不能保证元素的顺序,元素是无序的
  • 不能有重复的元素
  • 集合元素值允许为null
  • 线程不安全
  • 性能在Set实现类中通常是最好的

2. HashSet常用方法

① 添加元素:add(Object o)
HashSet<String> set = new HashSet<String>();
set.add("青城");
set.add("博雅");
System.out.println(set); // 输出顺序不确定
② 获取元素数量:size()

System.out.println(set.size()); // 输出元素个数

③ 删除元素:remove(Object o)

System.out.println(set.remove("博雅")); // 删除成功返回true

④ 判断集合是否为空:isEmpty()

System.out.println(set.isEmpty()); // 集合为空返回true

⑤ 清空集合:clear()

set.clear(); // 移除所有元素

⑥ 使用迭代器遍历:iterator()
Iterator<String> ite = set.iterator();
while(ite.hasNext()) {System.out.println(ite.next());
}
⑦ 判断是否包含元素:contains(Object o)

System.out.println(set.contains("青城")); // 包含返回true

⑧ 使用增强for循环遍历

for (String name : set) {

System.out.println(name);

}

三、LinkedHashSet集合

1. LinkedHashSet集合的特点

  • 元素有序且唯一
  • 链表保证元素有序(插入顺序)
  • 哈希表保证元素唯一
  • 线程不安全
  • 性能略低于HashSet,但高于TreeSet

2. LinkedHashSet的基本使用

① 创建LinkedHashSet
// 创建一个空的LinkedHashSet
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();// 创建具有初始容量的LinkedHashSet
LinkedHashSet<Integer> linkedHashSetWithCapacity = new LinkedHashSet<>(10);// 创建具有初始容量和负载因子的LinkedHashSet
LinkedHashSet<Double> linkedHashSetWithLoadFactor = new LinkedHashSet<>(10, 0.75f);
② 添加元素
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Cherry");
linkedHashSet.add("Apple"); // 重复元素,不会添加
System.out.println(linkedHashSet); // 输出: [Apple, Banana, Cherry] 保持插入顺序
③ 删除元素
linkedHashSet.remove("Banana");
System.out.println(linkedHashSet); // 输出: [Apple, Cherry]linkedHashSet.clear(); // 清空所有元素
④ 检查元素是否存在
boolean containsApple = linkedHashSet.contains("Apple");
System.out.println("Contains Apple: " + containsApple);
⑤ 获取集合大小
int size = linkedHashSet.size();
System.out.println("Size: " + size);
⑥ 遍历LinkedHashSet
// 使用for-each循环遍历
for (String fruit : linkedHashSet) {System.out.println(fruit);
}// 使用Iterator遍历
Iterator<String> iterator = linkedHashSet.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}
⑦ 转换为数组
String[] array = linkedHashSet.toArray(new String[0]);
for (String s : array) {System.out.println(s);
}
⑧ 其他常用方法
// 检查是否为空
boolean isEmpty = linkedHashSet.isEmpty();// 保留与指定集合相同的元素
LinkedHashSet<String> fruits = new LinkedHashSet<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");LinkedHashSet<String> toRetain = new LinkedHashSet<>();
toRetain.add("Apple");
toRetain.add("Cherry");fruits.retainAll(toRetain); // 只保留Apple和Cherry// 删除与指定集合相同的元素
fruits.removeAll(toRetain);

四、TreeSet集合

1. TreeSet集合的特点

  • TreeSet内部使用的是TreeMap,基于红黑树实现
  • 元素:TreeSet会对插入的数据排序,所以输入顺序和输出顺序不一致
  • 插入数据内部有两种排序方法:自然排序(默认)和定制排序
  • 值不能为null
  • 值唯一
  • 线程不安全
  • 性能在三者中通常是最低的

2. TreeSet的基本使用

① 插入是按自然顺序排序的
TreeSet ts = new TreeSet();
ts.add("agg");
ts.add("abcd");
ts.add("ffas");
Iterator it = ts.iterator();
while(it.hasNext()) {System.out.println(it.next());
}
// 输出:按照字典序排序
// abcd
// agg
// ffas
② 插入自定义对象需要实现Comparable接口
class Person implements Comparable {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Object o) {Person p = (Person) o;// 先对姓名字典序比较,如果相同,比较年龄if(this.name.compareTo(p.name) != 0) {return this.name.compareTo(p.name);} else {if(this.age > p.age) return 1;else if(this.age < p.age) return -1;}return 0;}
}public class Test {public static void main(String args[]) {TreeSet ts = new TreeSet();ts.add(new Person("agg", 21));ts.add(new Person("abcd", 12));ts.add(new Person("ffas", 8));ts.add(new Person("agg", 12));Iterator it = ts.iterator();while(it.hasNext()) {Person p = (Person) it.next();System.out.println(p.name + ":" + p.age);}}
}
// 输出:
// abcd:12
// agg:12
// agg:21
// ffas:8

五、HashSet、LinkedHashSet、TreeSet的使用场景

1. HashSet

  • 适用场景:在大多数情况下,HashSet是Set接口的首选实现。它的性能基本上比LinkedHashSet和TreeSet要好,特别是添加和查询操作,这也是使用最多的两个操作。
  • 特点:不关心元素的顺序,只关心元素是否存在。

2. LinkedHashSet

  • 适用场景:只有当要求插入顺序和取出顺序一致的时候才使用LinkedHashSet。LinkedHashSet的查询性能稍慢于HashSet,但它可以维持元素的添加顺序。
  • 特点:需要保持插入顺序,但又需要Set的唯一性特性。

3. TreeSet

  • 适用场景:只有在需要对元素进行排序时使用。当需要按照自然顺序或者自定义顺序对元素进行排序时,TreeSet是最佳选择。
  • 特点:元素有序,但性能相对较低。

总结

在Java集合框架中,List和Set各有其独特的用途和特点。List关注的是元素的索引和顺序,允许重复元素;而Set关注的是元素的唯一性,不关心元素的顺序(除LinkedHashSet外)。
对于Set的实现类:
  • 如果不需要保持任何顺序,优先使用HashSet
  • 如果需要保持插入顺序,使用LinkedHashSet
  • 如果需要元素按照自然顺序或自定义顺序排序,使用TreeSet
在实际开发中,根据具体需求选择合适的集合类非常重要,这不仅能提高代码的效率,也能使代码更加清晰易懂。理解这些集合类的底层实现原理和特点,有助于我们做出更加合理的选择。

http://www.dtcms.com/a/578088.html

相关文章:

  • 前端工程师职业规划与转型指南
  • 网站建设管理情况的通报国外工业产品设计网站
  • EventOS:面向MCU的事件驱动框架
  • 视频直播点播平台EasyDSS:打造高品质赛事直播的全链路解决方案
  • 广州网站制作哪家全面万达做的电商网站
  • C# 分部类读取学生信息
  • 分布式事务的实现方案:从理论到实践的全方位解析
  • 瑞萨RH850使用记录(三):看门狗(选项字)、AD、CAN、软复位(复位原因)
  • web应用构建与部署的本质区别
  • 源码管理 网站2021年企业所得税怎么征收
  • 建设小说网站的系统有哪些目前最新推广平台
  • iOS文件管理工具深度剖析,从系统沙盒到跨平台文件操作的多工具协同实践
  • 数据结构—排序算法篇二
  • 基于SpringBoot2+Vue2的实验室和实验器材预约平台
  • 比较好的网站建设技术开发wordpress4.7.2写文章
  • 产品定制网站电子商务平台建设内容
  • 手机射频阻抗匹配调试方法
  • 手机网站打不开被拦截怎么办wordpress漂浮按钮
  • Chaos-nano 协作式异步操作系统:赋能 AVR 8 位单片机的革新之路
  • 实对称矩阵的正交相似对角化
  • 印度外贸网站有哪些专注网站建设怎么样
  • Kustomize实战:PV/PVC多环境管理
  • 成都网站平面设计吴桥网站
  • Adobe Photoshop CS6 Lite:PS极端简化版,压缩后大小仅50M,Photoshop精简版
  • 做新闻类网站还有市场吗莱芜最好的网站建设公司
  • 电力变压器绕组变形多物理场耦合建模与在线监测技术
  • WLAN_频段配置
  • 网站策划书的撰写流程是什么福州网站建设 网站设计 网站制作
  • 进程控制核心(含进程地址空间)
  • 【OpenGL学习】第2课:用OpenGL创建第一个窗口