转载自 Java集合从菜鸟到大神演变

先来看一张集合概况图,这里从上到下列举了几个最经常用的集合

1、集合接口

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。声明了适用于JAVA集合(只包括Set和List)的通用方法。Set 和List 都继承了Conllection,Map没有.

2、集合类型

JAVA集合主要分为三种类型:Set(集),List(列表),Map(映射)

Set集合:集合元素是不能重复的,元素是没有顺序的,所以它不能基于位置访问元素。

List集合: 集合元素是可以重复的,元素是有顺序的,所以它可以基于位置访问元素。

Map:它包含键值对。Map的键是不能重复的,可以保证元素的插入顺序,也可以排序。

3、集合介绍

Set(集):

HashSet

HashSet是基于HashMap实现的,它不允许出现重复元素,不保证和政集合中元素的顺序,允许包含值为null的元素,但最多只能有一个null元素。

TreeSet

TreeSet可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素按照“升序”排列。

  

LinkedHashSet

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

List(列表):

ArrayList

内部结构基于数组实现,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。

LinkedList

LinkedList 是一个继承于AbstractSequentialList的双向链表,可以被当作堆栈、队列或双端队列进行操作。LinkedList同时还实现了List、Deque(双端队列)、Cloneable(能克隆)、java.io.Serializable(支持序列化,能通过序列化去传输)等接口,LinkedList是非同步的。

每个节点除含有元素外,还包含向前,向后的指针。 
新建一个LinkedList,生成一个头节点(header,就是一个头指针),它的元素为null。

它自包含,next和previous指针都指向自己。 执行add(Object obj)方法后,会生成一个新节点

Header节点的next指向链表的第一个节点,previous指向链表的最后一个节点,在这里都是first,再增加一个对象,它的形状像下面这样。

Vector

Vector 是矢量队列,它是JDK1.0版本添加的类。继承于AbstractList,实现了List(支持相关的添加、删除、修改、遍历等), RandomAccess(随机访问功能), Cloneable(能被克隆)这些接口。

Vector实际上是通过一个数组去保存数据的。当我们构造Vecotr时;若使用默认构造函数,则Vector的默认容量大小是10。

当Vector容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数 >0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。Vector的克隆函数,即是将全部元素克隆到一个数组中。和ArrayList不同,Vector中的操作是线程安全的。

Stack

Stack是栈,它的特性是:先进后出(FILO, First In Last Out)。

Stack继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。

Map(映射):

  Map基于散列表的实现,Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。

HashMap

HashMap底层就是一个数组结构(叫做Entry Table),数组中的每一项又是一个链表(叫做Bucket,用于解决hash冲突而设计的)。当新建一个HashMap的时候,就会初始化一个数组。插入和查询“键值对”的开销是固定的,可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。初始化结构如下:

  

每个bucket包含一个Entry(map自定义的一种结构,包含一个往后的指针)的链表。 
在put(key, value)后,它的结构如下:

LinkedHashMap

类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序,只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

  

TreeMap

基于红黑树数据结构的实现,查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

  

WeakHashMap

弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。

  

IdentifyHashMap

使用==代替equals()对“键”作比较的hash map,专为解决特殊问题而设计。

Hashtable

Hashtable与HashMap类似,Hashtable继承自Dictionary类,实现了Map接口,不同的是它不允许记录的键或者值为空;和HashMap相比,Hashtable是线程同步的,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。而且Hashtable可以通过Enumeration去遍历。

4、总结

List按对象进入的顺序保存对象,不做排序或编辑操作。

Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。

Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。

如果添加元素的顺序对你很重要,应该使用 LinkedHashSet/TreeSet或者LinkedHashMap/TreeMap. 

最后还要提到集合类里面一个很重要的类:Collections,它有很多自己独特的静态方法。当然它主要提供几种特殊集合(List, Map,Set),可以调用静态方法来获得:Unmodifiable*(不可修改集合,不可添加或删除元素),Synchronize*(保持同步集合,它的基本每个方法都加锁,防止并发操作),Checked*(声明之始传入特定类型,以后的操作都会验证加入元素是否属于已定类型),Singleton*(集合中只包含一个元素)。它们都是通过包装集合类中的抽象类获得,产生不同的行为。

Java集合从菜鸟到大神演变相关推荐

  1. C语言是菜鸟和大神的分水岭

    作为一门古老的编程语言,C语言已经坚挺了好几十年了,初学者从C语言入门,大学将C语言视为基础课程.不管别人如何抨击,如何唱衰,C语言就是屹立不倒:Java.C#.Python.PHP.Perl 等都有 ...

  2. 打开c语言运行不了_C语言——菜鸟和大神的分水岭:内存、线程、进程

    作为一门古老的编程语言,C语言已经坚挺了好几十年了,初学者从C语言入门,大学将C语言视为基础课程.不管别人如何抨击,如何唱衰,C语言就是屹立不倒:Java.C#.Python.PHP.Perl 等都有 ...

  3. 菜鸟到大神的上位历程,即学即用走向人生巅峰

    菜鸟到大神的上位历程,即学即用走向人生巅峰 结合个人经历总结的前端入门方法,总结从零基础到具备前端基本技能的道路.学习方法.资料.由于能力有限,不能保证面面俱到,只是作为入门参考,面向初学者,让初学者 ...

  4. 软件测试菜鸟还是大神,一道测试用例设计笔试题就能测出!

    软件测试菜鸟还是大神,一道测试用例设计笔试题就能测出!为什么这么说呢?是因为你们的思路有着天壤之别,来看吧: 相信不少朋友在笔试的时候都遇到过测试用例设计的笔试题.通常是一个登陆页面,上面有用户名,密 ...

  5. 程序员趣图:“菜鸟” VS “大神”

    码个蛋(codeegg) 第 843 次推文 作者:不笑青年 链接:https://mp.weixin.qq.com/s/1Sq1_TscEPg8ecaa0ztZfA 据说在程序员个行业中 一个大神程 ...

  6. 能进这个Java组织的都是大神,现在只有三个中国人

    前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 虽然有很多编程语言声称性能和语法都比Java要好,但是这些语言有一样东西比不上Java,这就是社区建设.通常大家查询Java社区都会查到一 ...

  7. “菜鸟”和“大神”de区别

    "菜鸟"和"大神" 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术的东西.首先请您先想想这几个问题.现在社会上有很多程序员,CSDN就是 ...

  8. 从菜鸟到大神之自动化测试(基础一)

    从菜鸟到大神之自动化测试(基础一) 一.自动化测试就是软件测试 1.什么是软件测试? 2.为什么需要软件测试 3.为什么不让开发做测试 4.软件测试的目的和作用 二. 软件测试的七条原则 三.计算机的 ...

  9. 赛尔号周五服务器维护大概到几点,赛尔号:每日玩多少小时算肝帝?2小时是菜鸟,大神:我24小时...

    赛尔号:每日玩多少小时算肝帝?2小时是菜鸟,大神:我24小时 大家好,说起赛尔号这款游戏,很多人都知道这是一个很耗费大家时间的游戏.因为它以肝闻名,以氪为辅,令得很多玩家爱不释手,也令得很多玩家纷纷退 ...

最新文章

  1. hashCode与equals的区别与联系
  2. EasyUI的combobox用法
  3. 【无标题】12.04 Serverless Meetup 深圳站 | Call 你来参加
  4. 计算机视觉中的自监督表示学习近期进展
  5. 重磅发布:阿里云云安全中心一键防勒索功能上线!
  6. html连接有道词典api,调用网易有道词典api
  7. linux常中的cat命令,linux下cat命令详解
  8. 仪表自动识别方法汇总
  9. python人物关系抽取_Python学习笔记(2) Python提取《釜山行》人物关系
  10. PostOffice
  11. Android Studio报错--Error: Library projects cannot set applicationId. applicationId is set to ...
  12. 有了规范,第二代曲面电视会更火吗?
  13. 服务器被腾讯云助手告警通知有木马文件
  14. 架构之——umi框架与dva的使用
  15. 【Mac】Homebrew安装nvm
  16. 地图与定位(一)定位服务
  17. [Unity] Catan Universe: Unity 的移动设备优化
  18. 学习人工智能可以从事哪些职业,有哪些就业前景和薪资待遇?
  19. IBM中国武汉全球服务执行中心正式落成
  20. uni-icons中添加自定义图标

热门文章

  1. c语言 大数相加,c/c++开发分享C语言计算大数相加的方法
  2. [RabbitMQ]创建Java开发环境_消费者_生产者
  3. [PAT乙级]1021 个位数统计
  4. 高等数学上-赵立军-北京大学出版社-题解-练习5.2
  5. dsu on tree 题集 + ac代码
  6. 最短路弗洛伊德(Floyd)算法加保存路径
  7. P6327 区间加区间sin和 线段树 + 数学
  8. Codeforces Round #686 (Div. 3) E. Number of Simple Paths 基环树 + 容斥
  9. HDU - 6769-In Search of Gold-二分+树形dp
  10. Sequence Pair Weight