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

关于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()方法效率要高很多,如下示例

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.mzph.cn/bicheng/244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内部类

一.概念 当一个事物内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0c;而这个内部的完整的结构又只为外部事物提供服务&#xff0c;那么将这个内部的完整结构最好使用内部类。在Java中&#xff0c;可以将一个类定义在另一个类或者一个方法内部&#xff0c;前…

记录OCEAN报错信息和对应解决方案

记录OCEAN代码报错信息和对应我代码部分解决方案 Error fprintf/sprintf: format spec. incompatible with data - “Format is ‘GBW IS %e\n’, argument #1 is nil”使用gainBwProd()测得GBW返回值为nil&#xff0c;导致printf出错添加检测代码 if(GBW nil printf("GB…

将gdip-yolo集成到yolov9模型项目中(支持预训练的yolov9模型)

1、yolov9模型概述 1.1 yolov9 YOLOv9意味着实时目标检测的重大进步&#xff0c;引入了可编程梯度信息&#xff08;PGI&#xff09;和通用高效层聚合网络&#xff08;GELAN&#xff09;等开创性技术。该模型在效率、准确性和适应性方面取得了显著改进&#xff0c;在MS COCO数…

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块&#xff0c;本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数&#xff0c;来说说该函数的主要功能是什么&#xff0c;简单来说&#xff0c;super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xf…

外包干了30天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

设计模式学习笔记 - 开源实战二(上):从Unix开源开发学习应对大型复杂项目开发

概述 软件开发的难度无外部两点&#xff0c;一是技术男&#xff0c;代码量不一定多&#xff0c;但要解决的问题比较难&#xff0c;需要用到一些比较深的技术解决方案或者算法&#xff0c;不是靠 “堆人” 就能搞定的&#xff0c;比如自动驾驶、图像识别、高性能消息队列等&…

【详细的Kylin使用心得】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

2024-03-23青少年软件编程(Python语言)等考(二级)解析

2024-03-23青少年软件编程(Python语言)等考(二级)解析一、单选题(共25题,共50分) 1.期末考试结束了,全班的语文成绩都储存在列表score中,班主任老师请小明找到全班最高分,小明准备用Python来完成,以下哪个选项,可以获取最高分呢?( B ) A. min(score) B. max(score…

超级USB设备工具箱V2.0 绿色版-供大家学习研究参考

1、芯片精灵 ChipGenius V3.01 2、惠普U盘格式化工具 V2.2.0 3、MFormat V1.00中文版 4、MyDisk V2.50 5、安全移除USB磁盘&#xff08;Disk Ejector&#xff09; 6、U盘烧录修复工具&#xff08;PortFree Production Program&#xff09; V3.38 7、护U使者 V1.28 8、闪存精灵2…

【缺啥补啥】图表征学习-1

图表征学习&#xff1a; 学习图中的元素&#xff0c;如节点、边、子图或整个图的向量表征&#xff0c;并应用基于向量的机器学习算法进行图数据的建模和分析 动态环境&#xff1a; 图数据包括结构、特征、性质、任务等&#xff0c;随时间发生变化 开放环境&#xff1a; 泛指数据…

《Effective C++》《资源管理——13、以对象管理资源》

文章目录 1、Terms13:Use objects to manage resources1.1、普通指针进行资源管理存在的问题1.2、RALL1.3、没有针对“动态分配数组”而设计的智能指针 2、面试相关2.1 解释RAII原则&#xff0c;并给出它在资源管理中的重要性。举出一个可以编译的例子2.2 描述一个你曾经使用RA…

如何批量给Word文件增加前缀序号?“汇帮批量重命名”帮助你批量给word文件增加前缀序号。

批量给Word文件增加前缀序号的过程&#xff0c;对于经常处理大量文档的人来说&#xff0c;是一项既繁琐又必要的任务。首先&#xff0c;我们需要明确为什么要给Word文件增加前缀序号。在很多情况下&#xff0c;当我们需要按照一定的顺序对多个文档进行管理和归档时&#xff0c;…

Faiss原理和使用总结

Faiss是一种用于高维向量检索的库&#xff0c;特别适用于大规模数据集的相似性搜索。其核心原理和使用方法可以总结如下&#xff1a; Faiss的核心原理&#xff1a; 索引结构&#xff1a;Faiss提供了多种索引结构&#xff0c;包括基于树的索引&#xff08;如k-means、PCA、IVF等…

基于STC15系列库操作LED灯

一、准备工作 1. 基于STC15系列库的工程模板 参考&#xff1a;51单片机工程模板的建立&#xff08;基于STC15系列库&#xff09;-CSDN博客 2. Keil编译器 二、程序编写 1. 新建 led.c 和 led.h 文件并存放于 user/led 文件夹下&#xff1b; 2. 新建 user.c 和 user.h 文件并…

如何辨别:DNS污染or DNS劫持?

DNS劫持和DNS污染的情况在互联网中并不少见&#xff0c;到底是出现了DNS污染还是DNS劫持。什么是DNS污染&#xff1f;什么是DNS劫持&#xff1f;我们该如何辨别DNS污染和DNS劫持&#xff1f; DNS劫持&#xff1a; DNS 劫持是指恶意攻击者通过非法手段篡改了网络中的 DNS 服务…

理论知识:Top-K 准确率

Top-1 Accuracy: 这是最常见的准确率评估方式&#xff0c;指的是模型预测的最有可能的类别&#xff08;即概率最高的类别&#xff09;是否正是真实的类别。换句话说&#xff0c;就是模型的预测结果中排名第一的类别是否正确。 Top-3 Accuracy: 这个评估标准比 Top-1 更宽松一些…

android 创建module

文章目的&#xff1a; 快速创建module并使用 创建步骤&#xff1a; 1 创建module 2 修改module下的build.gradle文件 3 修改清单文件中MainActivity属性&#xff0c;否则APP会因为有多个启动界面而崩溃 4 在主项目build.gradle引用该object Module 至此&#xff0c;可在APP中…

Golang的[]interface{}为什么不能接收[]int?

在 Go 中&#xff0c;[]interface{} 和 []int 是两种不同的类型&#xff0c;虽然它们的底层数据结构都是切片&#xff0c;但是它们的元素类型不同。[]interface{} 是一个空接口切片&#xff0c;可以容纳任意类型的元素&#xff0c;而 []int 是一个整数切片&#xff0c;只能容纳…

vue项目生成二维码(并避免重复生成)

一、需求&#xff0c;按连接&#xff08;带参数&#xff09;生成二维码 二、步骤 1、先安装插件 npm install qrcodejs2 --save-dev2、在需要用到二维码的页面引入 import QRCode from qrcodejs2;3、主要代码 <div id"qrCode2" ref"qrCodeDiv" class&…