Map、Set、List集合差别及联系详解

一、集合

  1. 集合类存放于java.util包中。
  2. 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
  3. 集合类型主要有3种:set(集)、list(列表)和map(映射)。

那这个三者有什么关系呢
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
└Set
Map
├Hashtable
├TreeMap
├HashMap
│└LinkedHashMap
在这里插入图片描述

1、Iterator(接口)

Iterator就是迭代器接口,这是Collection类的父接口。
Iterable接口只有一个方法: iterator()。不论Collection的实际类型如何,它都支持iterator()的方法。它返回一个代表当前集合对象的泛型迭代器,可以用于之后的遍历操作。
具体用法:

Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
  Object obj = it.next(); // 得到下一个元素
} 

2、Collection(接口)

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。Java SDK不提供直接继承自Collection的类,无法进行实例化,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

3、List(接口)

List接口继承了Collection 接口以定义一个允许重复项的有序集合
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引
实际上有两种List:
一种是基本的ArrayList,其优点在于随机访问元素,另一种是LinkedList,它并不是为快速随机访问设计的,更针对于数组的修改。(Vector其实也是属于List接口中的,但是现在已经不怎么用了。在网上看一些大佬讲解List接口 一般也不带上Vector)
3.1、ArrayList
ArrayList : 基于数组实现的,是一个动态数组,其容量能自动增长。ArrayList允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。因为在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
3.2、LinkedList
LinkedList:LinkedList是Link(链表)的数据结构。对于随机访问速度较慢,因为它是线性的数据存储方式,所以需要移动指针从前往后依次查找,但是它进行增删操作的会快一些。还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast()。有了这些方法可以将LinkedList当做队列和双向队列使用。
3.3、Vector
Vector:实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。Vector是唯一的同步容器类!并且他是线程同步的,所以当两个或多个线程同时访问时性能良好的。(但是Vector官方已经不推荐使用了)

4、Set(接口)

Set接口同样也是Collection接口的一个子接口,它表示数学意义上的集合概念。Set中不包含重复的元素,即Set中不存两个这样的元素e1和e2,使得e1.equals(e2)为true。由于Set接口提供的数据结构是数学意义上集合概念的抽象,因此它需要支持对象的添加、删除,而不需提供随机访问。(所以Set集合经常用来进行去重操作)
4.1、HashSet
 HashSet: HashSet是基于HashMap实现的。虽然集定义成无序,但HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能,能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的。
4.2、TreeSet
TreeSet:TreeSet是基于TreeMap实现的,是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。

5、Queue(接口)

Queue用于模拟"队列"这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队 列中的元素。

6、Map(接口)

Map接口不是Collection接口的继承。
Map的实现类是以<K,V>键值对的形式储存的。
Map的这些实现类中Key的储存形式和Set的储存的形式是一模一样的。
Map的这些实现类中Value的储存形式和List的储存的形式是差不多的。
6.1、HashMap
HashMap实现的是Cloneable接口。在Map中插入、删除和定位元素,HashMap是最好的选择。HashMap和HashSet集合一样不能保证元素的顺序,HashMap不能保证key-value对的顺序。
6.2、 LinkedHashMap
LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区分)

6.3、 HashTable
Hashtable类和Properties类是Map接口的历史实现。和HashMap不同的是HashTable要求Key和Value都不能为空,并且他支持线程同步,在多线程的下的表现良好。不过现在已经不推荐使用了,一般用都HashMap,如果有线程安全的高并发实现的需求,推荐使用 ConcurrentHashMap。

6.4、 TreeMap
TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap存储key-value对(节点)时,需要根据key对节点进行升序排序。当然也可以自定义排序方法。

由于博主只是个编程小白,若有什么不对或者缺失的地方,欢迎大家有什么补充的话都可以发在评论区里。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值