java集合相关_java集合相关

集合类存放于java.util包中

首先需要说的是Collection

Collection是集合的基本接口,List、Set、Queue就继承于Collection接口(Map没有)。

java的集合主要有三种:Set,List和Map

先说Collection系的三个:Set,List与Queue,这里列出他们的常用接口及其实现类

58161a0ae29fc2a2736725f9d55aec26.png

Set(集)

Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责),存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

SortedSet : 是继承了Set的一个借口,顾名思义是有序的Set,实现类基本只有TreeSet,其中的有序指的是元素中大小的顺序而并不是插入时的顺序。

TreeSet : SortedSet的实现类,保存次序的Set, 底层基于TreeMap,TreeMap为红黑树结构。使用它可以从Set中提取有序的序列。

HashSet : Set的实现类之一,为快速查找设计的Set。底层基于HashMap,存入HashSet的对象必须定义hashCode()。HashSet查找某个对象时,首先用hashCode()方法计算出这个对象的Hash码,然后再根据Hash码到相应的存储区域用equals()方法查找,从而提高了效率。

LinkedHashSet : HashSet的子类,具有HashSet的查询速度,且内部使用链表来维护元素的顺序(这里的顺序指的是插入时的顺序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

List(列表)

List最重要的特点就是次序,它保证维护元素特定的顺序,即list中元素是有序的。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用,因为其是链表的存储结构)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。Java List一共三个实现类:分别是ArrayList、Vector和LinkedList。

ArrayList : 由数组实现的List(顺序存储,即在存储空间内开辟一块连续的空间用于存储,值得一提的是如果存储空间满了则会自动增加50%+1的空间)。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢(由于顺序存储的缘故,如果假设有10个元素,需要删掉其中的第2个,则3,4,5...一直到第10个元素的位置都需要往前移动,插入同理)。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。

Vector : 也是由数组实现的List,大体上与ArrayList无异,Vector的主要优点即线程安全,一个Vector中同一时间只能有一个线程对它进行写操作,但是由于线程的同步需要消耗一定资源,所以速度上自然比不上ArrayList。

Stack : Vector的一个子类,基于动态数组实现的一个线程安全的栈。当然由于Vector的线程安全的效率值得商榷,Stack的效率也并不高。

LinkedList : List和Deque接口的实现类,链表存储结构,向List中间插入与删除的开销并不大(因为本身的存储空间并不连续,元素和下一个元素之间都是通过指针来连接)。随机访问则相对较慢(因为访问时需要移动指针,而ArrayList则直接访问某一固定位置即可),还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

Queue(队列)

Queue与Set,List同级,均继承了Collection接口,它定义了一个基本的Queue应该有哪些功能以及约束。

PriorityQueue : 即优先队列,通过二叉小顶堆实现,可以用一棵完全二叉树表示,优先队列的作用是能保证每次取出的元素都是队列中权值最小的,其中权值是由元素本身的自然顺序(natural ordering),或是通过构造时传入的比较器(Comparator)来决定。

Deque : 继承自Queue,Deque是双向队列,Queue遵循先进先出,但Deque头尾均可进出。

ArrayDeque : Deque的一个实现类,当用作堆栈时,此类可能会比Stack快,并且当用作队列时速度高于LinkedList,造成这种情况其实也非常好理解,Stack继承自Vector,其所有操作均遵照线程安全的方式进行,消耗的资源会比不线程安全的Deque要大,而LinkedList是链表结构,在头尾插入删除操作的速度又不如顺序存储结构的Array系(当然,LinkedList的优点是中间元素的相应增删操作,但是队列怎么可能允许做这类操作)。

Map(映射)

Map与Collection在集合框架中属并列存在(即前文提到的继承Collection的不包括Map)。

Map存储的是键值对,而之前的List和Set存储的只是值,当然,也可以说他们在集合中的序号看做他们的键,不过本质上是不同的。Map存储元素使用put方法,Collection使用add方法,Map集合取出元素时先转成Set集合,再通过迭代获取元素,于Collection也有不同。另外由于Map集合中使用键值对进行储存,所以键必须是唯一的,即任意两个键不能相同,但是值可以是相同的,即任意两个不同键对应的值可以相同。Map

这里要先提一下Hash表的概念了:Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找

Hashtable : 底层是哈希表数据结构,线程是同步的(即线程安全),不可以存入null键,null值。效率较低,被HashMap 替代。

HashMap : 底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,和equals方法。

LinkedHashMap : 该子类基于哈希表又融入了链表,提高插入和删除元素的效率,当然访问时效率应该也会有所下降。

TreeMap : 底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator进行比较排序,当然也可以定义他们实现特殊的排序方法。

参考博文:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值