参考文献 :http://blog.csdn.net/qq_25868207/article/details/55259978
https://www.cnblogs.com/LittleHann/p/3690187.html
https://www.jianshu.com/p/047e33fdefd2
Java容器类类库的用途是"保存对象",并将其划分为两个不同的概念:
1) Collection
一组"对立"的元素,通常这些元素都服从某种规则
1.1) List必须保持元素特定的顺序
1.2) Set不能有重复元素
1.3) Queue保持一个队列(先进先出)的顺序
2) Map
一组成对的"键值对”对象
Collection和Map的区别在于容器中每个位置保存的元素个数:
1) Collection 每个位置只能保存一个元素(对象)
2) Map保存的是"键值对",就像一个小型数据库。我们可以通过"键"找到该键对应的"值"
ArrayList要点概括:
1.ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素。
2.底层使用数组实现
3.该集合是可变长度数组,数组扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量增长大约是其容量的1.5倍,这种操作的代价很高。
4.采用了Fail-Fast机制,面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险
5.remove方法会让下标到数组末尾的元素向前移动一个单位,并把最后一位的值置空,方便GC
LinkedList要点概括:
1.LinkedList是List接口的双向链表非同步实现,并允许包括null在内的所有元素。
2.底层的数据结构是基于双向链表的,该数据结构我们称为节点
3.双向链表节点对应的类Node的实例,Node中包含成员变量:prev,next,item。其中,prev是该节点的上一个节点,next是4.该节点的下一个节点,item是该节点所包含的值。
5.它的查找是分两半(二分)查找,先判断index是在链表的哪一半,然后再去对应区域查找,这样最多只要遍历链表的一半节点即可找到
HashSet要点概括
1.HashSet由哈希表(实际上是一个HashMap实例)支持,不保证set的迭代顺序,并允许使用null元素。
2.基于HashMap实现,API也是对HashMap的行为进行了封装,可参考HashMap
LinkedHashSet 要点概括
对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同。
HashTable要点概括
1.Hashtable是基于哈希表的Map接口的同步实现,不允许使用null值和null键
2.底层使用数组实现,数组中每一项是个单链表,即数组和链表的结合体
3.Hashtable在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。Hashtable底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
4.synchronized是针对整张Hash表的,即每次锁住整张表让线程独占
HashMap 要点概括
1.HashMap是基于哈希表的Map接口的非同步实现,允许使用null值和null键,但不保证映射的顺序。
底层使用数组实现,数组中每一项是个单向链表,即数组和链表的结合体;当链表长度大于一定阈值时,链表转换为红黑树,这样减少链表查询时间。
2.HashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Node对象。HashMap底层采用一个Node[]数组来保存所有的key-value对,当需要存储一个Node对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法3.决定其在该数组位置上的链表中的存储位置;当需要取出一个Node时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Node。
4.HashMap进行数组扩容需要重新计算扩容后每个元素在数组中的位置,很耗性能
5.采用了Fail-Fast机制,通过一个modCount值记录修改次数,对HashMap内容的修改都将增加这个值。迭代器初始化过程中会将这个值赋给迭代器的expectedModCount,在迭代过程中,判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map,马上抛出异常
ConcurrentHashMap要点概括
ConcurrentHashMap是线程安全且高效的HashMap。多线程环境下,使用非线程安全的HashMap会导致死循环,而如文章中建议的那样,HashTable这种过时容器效率低下(使用synchronized来保证线程安全)。ConcurrentHashMap使用锁分段技术,大大提高了并发使用的效率。
锁分段技术: 假设容器有多把锁,每一把锁用于锁容器其中一部分数据,当多线程访问容器不同数据段数据时,线程间就不存在锁竞争,从而提高并发访问效率。
1.ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。
它使用了多个锁来控制对hash表的不同段进行的修改,每个段其实就是一个小的hashtable,它们有自己的锁。只要多个并发发生在不同的段上,它们就可以并发进行。
2.ConcurrentHashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。Hashtable底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
3.与HashMap不同的是,ConcurrentHashMap使用多个子Hash表,也就是段(Segment)
4.ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁。如果使用传统的技术,如HashMap中的实现,如果允许可以在hash链的中间添加或删除元素,读操作不加锁将得到不一致的数据。ConcurrentHashMap实现技术是保证HashEntry几乎是不可变的
LinkedHashMap 要点概括
1.LinkedHashMap继承于HashMap,底层使用哈希表和双向链表来保存所有元素,并且它是非同步,允许使用null值和null键。
2.基本操作与父类HashMap相似,通过重写HashMap相关方法,重新定义了数组中保存的元素Entry,来实现自己的链接列表特性。该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而构成了双向链接列表。

Java容器类 Collection (set list queue)和map相关推荐

  1. Java知识点04——集合(Set、List、Queue、Map、Collection和Iterator、Collections工具类)

    Java知识点04--集合(Set.List.Queue.Map.Collection.Iterator.Collections工具类) 一.集合 1.1 集合概述 二.Collection 2.1 ...

  2. java容器类4:Queue深入解读

    Collection的其它两大分支:List和Set在前面已近分析过,这篇来分析一下Queue的底层实现. 前三篇关于Java容器类的文章: java容器类1:Collection,List,Arra ...

  3. java 先进先出的map_「 深入浅出 」java集合Collection和Map

    本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...

  4. java中set和ge什么么意思,java的Collection和Map详解

    java的Collection和Map详解 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文 ...

  5. Java的集合之Map接口---(英雄联盟的CP例子)从光棍(Collection)变夫妻(Map)

    目录 Interface Map Map接口概述 Map接口和Collection接口的不同 添加功能 V put(K key, V value) 删除功能 void clear() V remove ...

  6. java容器类的继承结构

    摘要: java容器类的继承结构 Java容器类库定义了两个不同概念的容器,Collection和Map Collection 一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的 ...

  7. java容器类继承_JAVA容器 - weslie - OSCHINA - 中文开源技术交流社区

    一. 数组 1.数组是保存一组对象的最有效的方式.但数组有固定的尺寸而受限(p216) 2.数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力.在Java中,数组是一种效率最高的存 ...

  8. java容器类3:set/HastSet/MapSet深入解读

    介绍 Set:集合,是一个不包含重复数据的集合.(A collection that contains no duplicate elements. ) set中最多包含一个null元素,否者包含了两 ...

  9. Java集合框架--List、Set、Map

    Java集合框架接口和类的层次结构: java.util.Collection [I] +--java.util.List [I]+--java.util.ArrayList [C]+--java.u ...

最新文章

  1. mysql slave 详细配置_进击的MysqlSlave环境搭建及配置
  2. 面试中一个暴露能力等级的问题
  3. 【每日进步】September 2012
  4. 投稿指南 | 云计算领域最前沿资讯、技术,期待您的专业解读!
  5. django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
  6. 又一款主流勒索软件 Paradise 的源代码遭泄露
  7. shell单引号、双引号、反引号、无引号的区别
  8. dsoframer.ocx java_dsoframer.ocx(java web 操作word) 总结一下
  9. Unity下载package到本地,Unity高版本如何安装Packager到本地,UnityPackageManager下载包到本地的保存路径
  10. 用python制作勒索病毒_python生成的exe被360识别为勒索病毒原因及解决方法
  11. 防御windows系统激活工具的后门入侵
  12. 迷你西游最新服务器是哪个,迷你西游公测新开服务器“万佛朝宗”公告
  13. Python 类的知识点
  14. android studio 2.2 preview4,Android Studio变黄了,2.2 Preview 4 发布
  15. linux 二次封装 释放,Linux必学的60个命令(二)
  16. Cisco AnyConnect Secure Mobility Client 4.10.05111 (macOS, Linux, Windows)
  17. 2019淘宝双十一活动前期营销分析
  18. openlayers摸爬滚打 3.图层layer和feature的学习和简单例子
  19. 服务器被挖矿后的解决思路
  20. 开源软件及国内发展现状

热门文章

  1. c 语言基础期末考试题及答案,C语言基础题及参考答案
  2. C语言中fopen函数使用举例及打开方式列表
  3. 机器学习: 贝叶斯算法的应用
  4. 学计算机的三本分数线,2020三本分数线
  5. 2022-2027年中国化纤行业市场调研及未来发展趋势预测报告
  6. 开始尝试贝茨视觉训练法
  7. 大饱眼福,52个数据可视化图表鉴赏
  8. HTTP 协议之Gzip压缩原理
  9. 是否真的输在起跑线上?
  10. 多示例学习距离度量 (distance measures)和集合核 (set-kernel)