(最详细)关于List和Set的区别与应用

embedded/2024/11/14 21:56:53/

关于List与Set的区别

List和Set都继承自Collection接口;


  • List接口的实现类有三个:LinkedList、ArrayList、Vector。
  • Set接口的实现类有两个:HashSet(底层由HashMap实现)、LinkedHashSet。

在List中,List.add()是基于数组的形式来添加元素的,因此在List中,元素存放是有序的,且可重复,并且支持for循环和迭代器遍历,因此List在查找元素效率较高,插入和删除元素效率较低。

在Set中,Set.add()是基于HashMap实现的,通过Map.put来添加元素,因此在Set中元素不可重复(map-key不可重复),且元素存放位置是由该元素的hashCode来决定的,其位置是固定且无序的,Set遍历也只能使用迭代器,因为其无序,所以不能使用下标取值。

在List和Set中,都有一个contains()方法来判断是否存在指定元素,但由于两者实现方式各不相同,因此两者该方法的效率都不一样。在List中的contains是对每一个元素都是用equals()来判断是否存在该值,但是在Set是基于HashMap实现的,其中的contains实际上是调用Map.ccontainsKey方法,先判断元素对应的hashcode只有有值,没有直接返回,有的话再用equals判断内容是否相等


简单总结:与List相比,Set的contains()方法效率要高很多,如下示例

java">public class Test {public static void main(String[] args) {List<String> list = getListData();Set<String> set = getSetData();long listStart = System.currentTimeMillis();if (list.contains("list1000000")) {System.out.println("list contains list1000000");}long listEnd = System.currentTimeMillis();System.out.println("list contains list1000000 time:" + (listEnd - listStart));long setStart = System.currentTimeMillis();if (set.contains("set1000000")) {System.out.println("set contains set1000000");}long setEnd = System.currentTimeMillis();System.out.println("set contains set1000000 time:" + (setEnd - setStart));}public static List<String> getListData() {List<String> list = new ArrayList<>();for (int i = 0; i <= 1000000; i++) {list.add("list" + i);}return list;}public static Set<String> getSetData() {Set<String> set = new HashSet<>();for (int i = 0; i <= 1000000; i++) {set.add("set" + i);}return set;}
}

输出结果:


http://www.ppmy.cn/embedded/8847.html

相关文章

SQLAIchemy 异步DBManager封装-03得心应手

前言 SQLAIchemy 异步DBManager封装-01入门理解SQLAIchemy 异步DBManager封装-02熟悉掌握 在前两篇文章中&#xff0c;我们详细介绍了SQLAlchemy异步DBManager的封装过程。第一篇文章帮助我们入门理解了整体的封装结构和思路&#xff0c;第二篇文章则帮助我们更加熟悉和掌握了这…

SystemC 等待异步事件解决方案

本文为实现 SystemC 响应异步事件 解决方案。 应用场景&#xff1a; SystemC是一个支持系统事务级、行为级建模的开源的C library&#xff1b; 我们将SystemC仿真的模拟叫做模拟器。在很多场景下&#xff0c;模拟器要保持alive&#xff0c;等待异步async事件&#xff0c;做出…

大一考核题解

在本篇中&#xff0c;将尽力使用多种解法&#xff0c;来达到一题多练的效果。 1&#xff1a; 1.原题链接&#xff1a; 238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 这道题首先一眼肯定想到拿整体的积除以当前元素&#xff0c;将结果作为ans&#xff0c;…

基于SSM的心理咨询管理管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的心理咨询管理管理系统拥有三个角色&#xff1a;学生用户、咨询师、管理员 管理员&#xff1a;学生管理、咨询师管理、文档信息管理、预约信息管理、测试题目管理、测试信息管理…

npm 常用命令详解

当使用npm&#xff08;Node Package Manager&#xff09;时&#xff0c;以下是一些常用命令及其功能的详细解释&#xff1a; npm install&#xff1a;安装依赖包。如果你的项目有一个package.json文件&#xff0c;npm install将根据该文件中列出的依赖项来安装所有必需的包。 …

Git 实用技巧2——新建空白分支 | 重命名分支 | 回退到历史 commit

git version 2.39.2.windows 1. 新建空白分支 参考&#xff1a;Git - git-switch Documentation: https://git-scm.com/docs/git-switch/zh_HANS-CN 使用 --orphan 参数&#xff0c;创建一条不基于任何现有提交的空白分支。其初始提交&#xff08;即 HEAD&#xff09;不指向任…

vue3的ref和reactive

ref RefImpl&#xff1a;引用对象&#xff0c;如果想让一个普通变量变成响应式的&#xff0c;就需要把这个变量丢给ref。 修改的时候需要使用name.value进行修改。使用的时候直接使用name字段就行。 补充&#xff1a;const obj{name:’li’}定义的对象是可以修改对象里面的属性…

MAC: 使用技巧

提高文件夹的权限并删除文件 提高权限 打开 Finder 应用程序。 在您想要删除的文件夹&#xff0c;并右键单击它。 显示简介 - 共享与权限”&#xff08;Sharing & Permissions&#xff09; -点击锁图标&#xff0c;并输入管理员密码解锁 - 将当前用户的权限更改为“读与写”…