Collection的总结

集合的由来

集合的出现是为了弥补数组的缺陷,因为数组只能存储同一种类型的对象,而且长度是不能改变的,不能自动进行扩容,我们在程序的开发过程中,我们也不能确定自己要创建多少个对象,都是什么类型的,所以集合就出现了,集合可以存储不同类型的对象,而且大小是可变的。

Collection作为集合的跟节点,它的主要子接口是List和Set

List(此接口是有序的,是可以存储重复的元素的),它的实现子类都有ArrayList(这是一个大小可变的动态数组

                                                                                                                               允许包括NULL的所有元素

                                                                                                                                此实现是不同步,是线程不安全的

                                                                                                                                操作基本是以线性时间进行的

                                                                                                                                 它的增删比较慢,因为要移动元素

                                                                                                                                 它的查改比较快,因为有角标

                                                                                                                                  是有序的

                                                                                                                                 )

                                                                              LinkedList双向循环链表(该实现子类可以当做列表,栈,队列,双端队列来使用

                                                                                                                          允许包括NULL的所有元素

                                                                                                                         此实现是不同步,是线程不安全的

                                                                                                                            是有序的

                                                                                                                            它的增删比较快,查改比较慢

                                                                                                                                )

                                                                             Vector(该类和ArrayList类差不多,是线程安全的,所以效率低,也是有序的

                                                                                          一般被ArrayList代替使用

                                                                                  )

                                                                         Stack(这是Vector的一个子类,表示的是栈,常用的方法就是pop()弹栈,push()进                                                                                    栈,也是有序的,也是线程安全的,所以效率不高,不推荐使用,一般被

                                                                                   LinkedList代替

                                                                                 )

Queue(线性表队列,除了有Collection的方法外,还有对头和尾进行的操作,offer()进队一个元素,poll()出队一个元素,element()获取一个元素并不清除)

                                                          子接口有Deque(表示的是双端队列,只能对线性表的两端进行操作

                                                                                               )

                                                       子类有ArrayDeque(这是一个循环的队列

                                                                                        允许重复

                                                                                          有序

                                                                                        线程不安全

                                                                                          禁止空元素

                                                                                          用作堆栈时快于 Stack在用作队列时快于 LinkedList

                                  )

                                                    子类有LinkedList(双向循环链表,只能在头尾进行操作,用作List时可以在任何位置操作

                                                       )

                                                  子类有PriorityQueue(优先队列,底层结构是一个最小堆(数组实现的一个完全的二叉树),)元素 的入队顺序不代表该优先队列的迭代顺序,元素的排布顺序其实和元素的优先级有关,优先不代表元素的入队顺序,仅表示元素之间的优先关系)

   Set集合(一个不包含重复元素的集合,不提供角标访问,因为是无序的,遍历的方式是迭代器)

                                                    子类HashSet (这是一个单链表的数组

                                                                            是无序的

                                                                            允许使用NULL元素

                                                                             此实现是不同步的,是线程不安全的                                                                     

                                                                                  )

                                                         LinkedHashSet 这是HashSet的子类(这是一个双链表数组的实现,LinkedList[] arr

                                                                                                                          是有序的

                                                                                                                           允许NULL元素

                                                                                                                           线程不安全

                                                                                                                             底层就是一哈希表+双向链表,哈希表保证元素的唯一性依赖于两个方法:int hashCode()和boolean equals(Object obj)) ,  用HashSet存储元素的执行顺序:

                                                                                  首先比较hashCode()值是否相同

                                                                            是:继续执行equals(),看其返回值

                                                                   是true:说明元素重复,不添加

                                                                    是false:就直接添加到集合

                                                                                   否:就直接添加到集合

                                                    TreeSet(底层数据结构,红黑树 - AVL平衡树 - 二分搜索平衡树 - 二分搜索

                                                                    有序

                                                                    不允许重复元素

                                                                    使用元素的自然顺序对元素进行排序

                                                                    线程不安全的

                                                                   对于不是java自定义的引用对象,需要实现Comparable接口

)

   

 

 

Collection集合的分类

类名    重复     NULL     有序       线程安全      底层结构     备注

ArrayList   允许   允许   有序   不安全   动态数组    支持角标访问,任何位置

LinkedList    允许    允许   有序   不安全   双向循环链表     可以用作列表,队列,双向队列,栈,任何位置

 Vector   允许   允许   有序   安全    动态数组    一般被ArrayList代替使用

Stack    允许    允许    有序    安全    动态数组    是Vector的子类,被LinkedList替代

Deque    允许    禁止    有序   不安全   双端队列     相对于Queue来说,是可以双向进行操作

 ArrayDeque    允许   禁止    有序   不安全   循环数组队列   用作堆栈时快于 Stack在用作队列时快于 LinkedList

PriorityQueue    允许   禁止   有序    不安全 最小堆(数组实现的一个完全的二叉树) 有序是指优先级排序,所以需要对象实现Comparable接口来定义优先级大小

HashSet    不允许    允许   无序   不安全   哈希表(单向链表类型的数组) 需要元素对象重写hashCode和equals法

 LinkedHashSet     不允许   允许    无序   不安全    哈希表(双向链表类型的数组)      是HashSet的子类

TreeSet   不允许   不允许   有序    不安全     红黑树(二分搜索树)       有序是指自然排序,需要元素对象实现Comparable接口来定义数值大小关系

                       

                             

                                    

 

 

 

                       

                                                                                                       

          

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值