List、Set、Map的区别和关系

概述:

List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap

常用集合分类

Collection 接口的接口 对象的集合(单列集合)
List 接口:元素按进入先后有序保存,可重复
│—————- LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————- ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————- Vector 接口实现类 数组, 同步, 线程安全

Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-HashSet 使用hash表(数组)存储元素
│———————— LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————– LinkedHashMap 双向链表和哈希表实现
└ ——–TreeMap 红黑树对所有的key进行排序

List和Set集合详解:

list和set的区别图解:

List详情

1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
在这里插入图片描述

ArrayList与LinkedList的区别和适用场景

Arraylist:
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。

LinkedList:
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
适用场景
当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。

ArrayList与Vector的区别和适用场景

ArrayList和Vector都是用数组实现的,主要有这么三个区别:
(1).Vector是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果。而 ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
(2)两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同。
(3)Vector可以设置增长因子,而ArrayList不可以。
(4)Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
适用场景
1.Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高。
2.如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。

set 详情

1)HashSet:Set接口的实现类,底层实现 HashMap,利用了Hashmap的key进行数据存储,add()方法实际调用的 hashmap的 put()方法实现,只不过只有 key,通过 hashCode()和 equals()方法保证元素唯一。
2)LinkedHashSet:底层实现链表,线程不安全,查询慢,增删快;
3)TreeSet:底层实现红黑二叉树(前序-中序-后序),可以对 Set 元素进行排序,每次存储元素会从根元素进行对比,比元素小挂在左边,比元素大,挂载右边,如果一致则不存储;

TreeSet, LinkedHashSet 和 HashSet 的区别与适用场景

TreeSet, LinkedHashSet 和 HashSet 在java中都是实现Set的数据结构
TreeSet的主要功能用于排序
LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
HashSet只是通用的存储数据的集合
2. 相同点
Duplicates elements: 因为三者都实现Set interface,所以三者都不包含duplicate elements
Thread safety: 三者都不是线程安全的,如果要使用线程安全可以Collections.synchronizedSet()
3. 不同点
Performance and Speed: HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序
Ordering: HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则
null:HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException

适用场景
HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。

Map详解

Map注意事项

1)Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。
2)Map 没有继承 Collection 接口, Map 提供 key 到 value 的映射,你可以通过“键”查找“值”。一个 Map 中不能包含相同的 key ,每个 key 只能映射一个 value 。 Map 接口提供 3 种集合的视图, Map 的内容可以被当作一组 key 集合,一组 value 集合,或者一组 key-value 映射。

Map实现类

Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。

HashMapHashTable
无序的无序的
方法不是同步的方法是同步的
线程不安全的线程安全的
效率较高效率较低

总结:
TreeMap是有序的,HashMap和HashTable是无序的。
Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
那么这就意味着:
Hashtable是线程安全的,HashMap不是线程安全的。
HashMap效率较高,Hashtable效率较低。

HashMap和TreeMap适用场景

HashMap:适用于Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)

线程安全集合类与非线程安全集合类

LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。

在集合中常见的数据结构(掌握)

     ArrayXxx:底层数据结构是数组,查询快,增删慢
     LinkedXxx:底层数据结构是链表,查询慢,增删快
     HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
     TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

总结:

Connection接口:
— List 有序,可重复

ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
—Set 无序,唯一

HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()

LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一

TreeSet
底层数据结构是红黑树。(唯一,有序)

  1. 如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: listsetmap都是常见的数据结构,它们的特点和区别如下: 1. list(列表):有序可重复的数据结构,可以通过下标访问元素,支持增删改查操作。 2. set(集合):无序不重复的数据结构,不支持下标访问元素,支持增删查操作。 3. map(映射):无序的键值对数据结构,通过键来访问值,键不重复,值可以重复,支持增删改查操作。 区别: 1. listset的主要区别在于是否允许重复元素,以及是否有序。 2. setmap的主要区别在于set只有键没有值,而map有键值对。 3. listset都是线性结构,而map是非线性结构。 4. listset的查询操作时间复杂度为O(n),而map的查询操作时间复杂度为O(1)。 5. listset的插入和删除操作时间复杂度为O(n),而map的插入和删除操作时间复杂度为O(1)。 总之,选择使用哪种数据结构,需要根据具体的需求来决定。如果需要有序的可重复元素,就使用list;如果需要无序的不重复元素,就使用set;如果需要通过键来访问值,就使用map。 ### 回答2: 在Java中,ListSetMap都是集合类,在实际应用中也被广泛使用。它们有着不同的特点和区别,以下是详细介绍: List(列表)是一个有序集合,允许重复元素存在。List的实现类包括ArrayList、LinkedList、Vector等。其中,ArrayList是最常用的一个,并且查询元素速度较快。List的特点是,可以根据角标访问元素,支持添加、删除、修改、排序等操作。 Set(集合)是一个无序集合,不允许重复元素存在。Set的实现类包括HashSet、TreeSet、LinkedHashSet等。其中,HashSet是最常用的一个,并且插入和删除元素比较快。Set的特点是,不允许重复元素存在,可以判断某个元素是否存在。 Map(映射)是一种键值对映射的集合,每个键都唯一,值则可重复。Map的实现类包括HashMap、TreeMap、LinkedHashMap等。其中,HashMap是最常用的一个,并且插入和删除元素比较快。Map的特点是,可以通过键值获取值,同一个映射中不允许重复键。 在使用ListSetMap时,需要根据具体应用场合和需求来选择合适的集合类型。如果需要有序元素、允许重复元素时,选择List;如果需要无序元素、不允许重复元素时,选择Set;如果需要键值对映射,选择Map。同时在性能考虑时,也要进行权衡选择。 ### 回答3: listsetmap都是常用的数据结构,它们分别有自己的特点和用途。 List是最基本、最常见的数据结构之一,它可以存储任意类型的数据,并按照顺序排列。List中的数据可以重复,可以通过索引位置进行访问和修改。List的特点是可以快速地增加或删除元素,因为它是一种动态数组,但是在访问元素时速度较慢。 Set是一种集合的数据结构,它的特点是不包含重复的元素,且不按顺序排列。Set主要用于去重和查找元素是否存在,可以通过添加、删除、清空等操作来维护集合的元素,但是不能通过索引来访问集合中的元素。 Map是一种键值对的数据结构,它可以存储任意类型的数据,按照键来访问和修改。Map中键和值都可以重复,但是键必须是唯一的。Map的特点是快速地查找和修改数据,可以通过添加、删除、更新、遍历等操作来操作Map中的数据。 总的来说,List适用于有序的元素集合,Set适用于无序的元素集合,Map适用于需要按照键来快速访问元素的数据集合。在使用时需要根据实际需求来选择不同的数据结构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值