还搞不懂Java中List和Set的区别?那就把这篇文章在那个甩给他

有 List 了为什么还要有 Set?Java 容器 Set 的核心通关指南 Set 跟 List 的主要区别是不允许重复对象,这在有些场景会减少复杂度,提高程序的效率。Set 中的HashSet 是无序集合,不能像 List 一样使元素的排列顺序和插入顺序保存一致,想要使用有序 Set 可以选择 LinkedHashSet 和 TreeSet,TreeSet 更是能让我们指定比较器,让元素在插入时就进行好排序。不过这里介绍的 Set 容器都不是线程安全的,等讲到 Java 并发时咱们会在介绍 Set 相关的并发容器。 阅读详情

最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请移步GitHub



一、特性

两个接口都是继承自Collection,是常用来存放数据项的集合,主要区别如下:

  1. List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在Set中不允许重复元素存在。
  2. 与元素先后存放顺序有关,List是有序集合,会保留元素插入时的顺序,Set是无序集合。
  3. List可以通过下标来访问,而Set不能。

二、常见实现类

1. List接口

常见实现类如下:

  • ArrayList(数组实现):允许对元素进行快速随机访问,从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
  • Vector(数组实现):支持线程的同步,某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销(相关方法与ArrayList很相似,在方法上用synchronized修饰)。发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList(1.5倍 + 1)和Vector(2倍)的数组扩容的大小不同。
  • LinkedList(链表实现):很适合数据的动态插入和删除,随机访问和遍历速度比较慢。还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

2. Set接口

常见实现类有HashSet、TreeSet和LinkedHashSet:

  • hashset: 当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置(为什么HashSet 是如何保证不重复的)。也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等。不能保证元素的排列顺序,顺序有可能发生变化;集合元素可以是null,但只能放入一个null;
  • LinkedHashSet : LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
  • TreeSet: TreeSet是SortedSet接口的唯一实现类,底层的数据结构是红黑树,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式,如下示例:
    • 自然排序——自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
    • 定制排序——自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法

如下示例:

package javase.collection;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;


class Person implements Comparable<Person>{
    private int age;
    private String name;
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public String toString() {
        return  "[" + name + " : " + age + "]";
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    @Override
    public int compareTo(Person person) {
        //返回0表示相等,则不加入TreeSet
        return this.age > person.getAge() ? 1 : -1;
    }
}
class Person2 {
    private int age;
    private String name;
    public Person2(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public String toString() {
        return  "[" + name + " : " + age + "]";
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
}
class MyComp implements Comparator<Person2>{
    @Override
    public int compare(Person2 o1, Person2 o2) {
        return o1.getAge() > o2.getAge() ? 1 : -1;
    }
}
public class CollectionTest {
    public static void main(String[] args) {
//        TreeSet<Person> psets = new TreeSet<>(new MyComp());
//        psets.add(new Person("Bob",23));
//        psets.add(new Person("Alice",36));
//        psets.add(new Person("Tom",18));
//        Iterator<Person> it = psets.iterator();
//        while (it.hasNext()){
//            System.out.println(it.next());
//        }
        TreeSet<Person2> psets = new TreeSet<>(new MyComp());
        psets.add(new Person2("Bob",23));
        psets.add(new Person2("Alice",36));
        psets.add(new Person2("Tom",18));
        Iterator<Person2> it = psets.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

三、相互转化

因为List和Set都实现了Collection接口的addAll(Collection<? extends E> c)方法,因此可以采用addAll()方法将List和Set互相转换;另外,List和Set也提供了Collection<? extends E> c作为参数的构造函数,因此通常采用构造函数的形式完成互相转化。

//List转Set
Set<String> set = new HashSet<>(list);
//Set转List
List<String> list1 = new ArrayList<>(set);
只会“有序无序”?面试官嫌弃的List、Set、Map回答! 讲到这里,小林的眼睛亮了起来:“原来它们的实现原理和使用场景才是关键!我补充道:“不仅如此,你还可以结合场景深入分析,比如:”1、为什么HashSet的查询速度快?因为底层用HashMap实现,基于哈希表的查询复杂度接近O(1)。2、为什么TreeMap比HashMap慢?TreeMap基于红黑树实现,增删查复杂度是O(logN),而HashMap在理想情况下是O(1)。3、线程安全问题怎么解决? 阅读详情

相关推荐

matlab电容式传感器仿真,差动电容式位移传感器的仿真研究

设计了一种差动电容式位移传感器,主要对传感器的数学模型及电容检测电路进行了仿真研究。其中检测电路设计主要包括正弦激励电路、转换桥路、信号放大电路、精密整流电路和滤波电路。最后利用Matlab/SimurFnk软件对所设计的系统进行仿真,并分析了传感器性能。仿真研究表明,传感器及其检测电路具有合理性,测量范围内具有很好的线性度。0|| I≯ lat on ii{差动容尊翩’亘研发注:湖南省教育厅资...

weixin_36323601的博客 1390

java每天一问【List和Set的区别】

List和Set的区别 List:有序,按对象进入的顺序保存对象,可重复,运行多个NULL对象,可以使用Iterator 取出所有元素,在逐一遍历,还可以使用get(int index)方法获取指定下标的元素。 Set:无序,不可重复,最多允许有一个NULL对象,取元素的时候只能使用Iterator接口取得所有元素,在逐一遍历各个元素。 ...

qq_34699995的博客 658

乐鑫ESP32-C6产测全流程:RAM固件测试与阈值校准实战指南

Wi-Fi模组量产测试是保障IoT设备射频性能与硬件可靠性的关键环节,其核心在于基于RAM的无损固件加载、可配置的阈值判定机制及多工位协同控制。该流程依托串口协议与结构化配置(如JSON阈值文件、.bin测试固件),实现RF性能(fb_rssi、tx_power)、GPIO导通性、Flash ID识别与固件版本校验等原子化测试项的自动化执行。技术价值体现在避免Flash擦写风险、支持动态温补与在线学习校准,并无缝对接MES系统实现质量数据闭环。典型应用场景包括ESP32-C6/C3/S2等乐鑫全系Wi-Fi

weixin_35756690的博客 311

List,Set,Collection,Collections比较

官方话 1.List和Set都是接口,他们都继承于接口Collection,List是一个有序的可重复的集合,而Set的无序的不可重复的集合。Collection是集合的顶层接口,Collections是一个封装了众多关于集合操作的静态方法的工具类,因为构造方法是私有的,所以不能实例化。 2.List接口实现类有ArrayList,LinkedList,Vector。ArrayList和...

weixin_33859665的博客 138

ArcGIS插值可视化气象数据

前言 地图底图的制作和气象数据的预处理见我上两篇博客 ArcGIS精美中国地图制作(详解) python处理日值气象数据 在前面我们已经将日值的地温数据处理成了年均地温,添加了站点经纬度坐标并导出为excel格式。 得到如下数据: 导入数据 在Arcmap中 文件-添加XY数据 将年均地温和站点位置数据导入。 注意:excel表格的格式要另存为97-2003工作簿形式,否则会有"arcgi...

江北20190411的博客 2万+

科研绘图系列:基因突变瀑布图统计以及可视化

科研绘图系列:基因突变瀑布图统计以及可视化

专注生信领域 1653

Java: Set String List 互转

Java: Set String List 互转 1.Code import java.util.*; public class Main { public static void main(String[] args) { //List 转成 Set System.out.println("-------List 转成 Set--------");...

d3y1`5 81_09 9669

趋势跟踪策略

/ 绘制K线图的下跌部分,使用绿色标记 stickline(close>=open,high,close,1,1,colorgreen);end // 在图表上绘制当前趋势的图标,如果trend=1或-1 drawicon(trend=1,stopprice,10);end // 绘制K线图的上涨部分,使用红色标记 stickline(close>=open,high,close,1,1,colorred);

2401_84919512的博客 354

Java 集合 —— List、Set 和 Map 的区别

1.集合类型主要有3种:set(集)、list(列表)和map(映射)。 2.三者关系如下图: List、Set和Map的区别: 集合 List Set Map 元素顺序 有序 无序 key无序、value无序 元素是否可重复 可重复 不可重复 key不可重复、value可重复 List List中存储的元素有序,指的是读出的顺序与存入的顺序是一致的。 Set Set存储的元素是无序的,这里的无序指的是存入的顺序与输出的顺序可能是不一致的。 Map Map存储的元

低调,谦虚,自律,反思,成长! 4926

Python 爬虫实战:爬取国家统计局公开数据

国家统计局作为权威的宏观经济数据发布机构,汇聚了人口、GDP、就业、产业经济等多维度的核心统计数据,是开展经济研究、政策分析、行业洞察的重要数据支撑。相较于商业数据平台,国家统计局的公开数据具备权威性、全面性和时效性等特点,但部分数据分散在不同栏目且缺乏结构化下载渠道。本文基于 Python 爬虫技术,系统讲解国家统计局公开数据的爬取方法,重点解决静态表格解析、分页数据抓取、数据结构化转换等问题,同时严格遵循政府网站数据使用规范,为科研、教学等场景提供合规的数据获取方案。本文以国家统计局官网(

2503_91057718的博客 1818

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

java list set map的区别_Java集合类List/Set/Map的区别和联系

Java集合类List/Set/Map的区别和联系一、Array , ArraysJava所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。1、效率高,但容量固定且无法动态改变。array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。2、Java中有一个Arrays类,专门用来操作array。arrays中拥有一组static函数,equ...

weixin_29157533的博客 129

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java集合面试题(02) Java中List和Set之间区别

Java中List和Set之间有什么区别是一个非常流行的Java集合面试问题,也是在Java中使用Collection类时要记住的一个重要的基本概念。 List和Set都是Java程序最重要的Collection类中的两个,以及各种Map实现。 List和Set的基本特征在Java的List和Set接口中被抽象出来,然后List和Set的各种实现都在相应接口之上增加了特定的特征。例如,Java中的ArrayList是由Array支持的List实现,而LinkedList是另一个像链接列表数据结构一样工作的L

Bob Liu的程序人生 2472

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java 数组map_Java之数组array和集合list、set、map

之前一直分不清楚java中的array,list。同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚。世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合有人想有可以自动扩展的数组,所以有了List有的人想有没有重复的数组,所以有了set有人想有自动排序的组数,所以有了TreeSet,TreeList,Tree**而几乎有有的集合都是基于数组来实现的.因为...

weixin_39620653的博客 877

java set和list 别再纠结了!Java里Set和List选错,代码直接崩给你看

java set和listCollection是Java集合框架中的核心接口之一,掌握它对于理解整个集合体系至关重要。在日常开发中,我们频繁使用的List、Set等集合均继承自Collection

2603_96171993的博客 158

Java之数组array和集合list、set、map

之前一直分不清楚java中的array,list。同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚。 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的人想有没有重复的数组,所以有了set 有人想有自动排序的组数,所以有了TreeSet,TreeList,Tree**...

diaolapei9880的博客 410

java set中元素是数组_Java-杂项:Java数组Array和集合List、Set、Map

之前一直分不清楚java中的array,list。同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚。世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合有人想有可以自动扩展的数组,所以有了List有的人想有没有重复的数组,所以有了set有人想有自动排序的组数,所以有了TreeSet,TreeList,Tree**而几乎有有的集合都是基于数组来实现的.因为...

weixin_35252979的博客 531

【Java集合框架 入门必看】30 分钟搞懂List/Set/Map 用法!

Java集合框架List/Set/Map详解核心用法,通过对比数组与集合的特性差异,帮助开发者理解List、Set、Map三大接口的应用场景。文章包含30分钟快速入门指南,通过实际代码演示ArrayList/LinkedList的增删查改操作、HashSet的去重功能以及HashMap的键值对存储方式,并附有运行结果和避坑建议。重点讲解了集合自动扩容、泛型约束、遍历方法等实用技巧,适合需要处理动态数据的新手快速掌握Java集合框架的核心知识。

学无止境 1294

Java系列-Set、List、Map的遍历总结

Java系列-Set、List、Map的遍历总结 标签: Java集合遍历arraylisthashmapiterator 2015-04-28 08:21 1996人阅读 评论(2) 收藏 举报 分类: Java(19) 作者同类文章X 版权声明:本文为博主原创文章,转载请注明来源。 不知道

qq_39698507的博客 268

Java单列集合——List

本文系统地介绍了Java中集合框架的分类和特点,主要包括Collection和Map两大类型。详细分析了Collection集合的家族体系、通用方法及源码实现,重点讲解了List和Set的区别,以及三种遍历方式(迭代器、增强for循环、Lambda表达式)。此外,深入剖析了ArrayList和LinkedList的底层实现原理,包括ArrayList的扩容机制和LinkedList的双向链表结构。文章还强调了在使用自定义对象时重写equals()方法的重要性,并提供了集合操作中的注意事项和常见面试问题解答。

m0_70325779的博客 2045

Array、List、Set、与Map

最近经历了几次面试,发现Java基础还是很重要的,所以好好弥补之前遗留的漏洞还是很有必要的。基础不牢固,就会越来越浮,无法走的深入。         这篇文章,主要总结了映射、集合等容器的相关联系与区别,会有比较透彻的分析,聪明的你看了定会过目不忘~         1、首先 ,我们来分析Array数组。         Array数组通过下标来实现操作,速度快、效率高,但我们无法判断其中有

劝学 799

java set collection_Java中Collection、List、Set、Map之间的关系总结

初学java,单个的接触有点迷糊,所以总结下他们的关系一、关系Collection--List:以特定顺序存储--ArrayList、LinkList、Vector--Set:不能包含重复的元素--HashSet、TreeSetMap--HashMap、HashTable、TreeMap二、分别讲解Collection:Collection是一个父接口,List和Set是继承自他的子接口,Coll...

weixin_42181545的博客 341

java集合,Map集合,List集合,Set集合

Hachmap中还有一个entry集合,其使用场景即利用entry来将键值对附加给其他集合,并有自己的方法 如:对象.getKey()来获取该对象在entry中的key 对象.getValue来获取该对象在entry中的value。Object是所有类的父类,泛型为Object时可以存多种数据类型不同的数据,因为Object会自动转换为相应的包装类,但不能将泛型为Object的集合存入其他泛型为引用数据的集合。

Ma___378803338的博客 1238

java map collection_Java中Collection、List、Set、Map之间的关系总结|chu

初学java,单个的接触有点迷糊,所以总结下他们的关系一、关系Collection--List:以特定顺序存储--ArrayList、LinkList、Vector--Set:不能包含重复的元素--HashSet、TreeSetMap--HashMap、HashTable、TreeMap二、分别讲解Collection:Collection是一个父接口,List和Set是继承自他的子接口,Coll...

weixin_31716637的博客 119
上一篇: 七年java开发,在拿下阿里、腾讯、百度、美团的offer后,有感而发,总结如下
下一篇: 系统扩展/复用性太差?阿里架构师教你如何对现有系统做微服务改造
Java_supermanNO1
博客等级 码龄7年 1170粉丝 329原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值