1.集合框架总体架构

  • 集合大致分为Set、List、Queue、Map四种体系,其中List,Set,Queue继承自Collection接口,Map为独立接口
  • Set的实现类有:HashSet,LinkedHashSet,TreeSet...
  • List下有ArrayList,Vector,LinkedList...
  • Map下有Hashtable,LinkedHashMap,HashMap,TreeMap...
list 有序,可重复 ArrayList:数组,查询快,增删慢。线程不安全. Vector:数组,查询快,增删慢。线程安全. LinkedList:链表,查询慢,增删快。线程不安全
set 无序(不严谨),唯一 HashSet:无序,唯一,哈希表实现,通过hashCode()和equals()保证唯一。 LinkedHashSet:继承自hashset,底层是链表和哈希表。(FIFO插入有序,唯一) TreeSet:底层是红黑树。(唯一,有序)
map KV形式的键值对 TreeMap:有序,不是线程安全的。 HashMap:无序,不是线程安全的,HashMap允许null值(key和value都允许) HashTable:无序,线程安全的,不允许null值,

2. Set

Set 接口继承Collection,用于存储不含重复元素的集合。

HashSet

底层是哈希表,当插入元素时,HashSet会调用该对象的hashCode()方法得到hashCode,然后根据hashCode决定该对象在哈希表中的存储位置。 (这里有个问题,如果hashcode不是均匀分布的,而是集中在一个区域,极端情况下,hash表会变成链表)

HashSet去重原理:通过equals()方法比较,且其hashCode()方法返回值也相等。 (可以通过覆写hashCode和equals方法改变其去重规则,进行自定义去重)

TreeSet

TreeSet底层是红黑树;加入元素时,必须加入同类型的对象,否则会发生ClassCastException异常,因为TreeSet会调用集合元素的compareTo()方法来比较元素之间的大小关系(自然排序)。

compareTo()方法的返回值决定了顺序:

  • -1 表示放在红黑树的左边,即逆序输出;
  • 1 表示放在红黑树的右边,即顺序输出;
  • 0 表示元素相同,仅存放第一个元素自然排序(treeset去重的原理);

其次,TreeSet也可以通过比较器排序。

LinkedHashSet

继承自HashSet,底层是链表和哈希表。

  • 由链表保证元素有序(插入顺序)。
  • 由哈希表保证元素唯一

TreeSet, LinkedHashSet and HashSet 的区别

  • 都实现Set接口,不包含重复元素
  • 都不是线程安全的,如果要使用线程安全可以Collections.synchronizedSet()
  • TreeSet的主要功能用于排序
  • LinkedHashSet的主要功能用于保证FIFO,即有序的集合(先进先出)
  • HashSet只是通用的存储数据的集合
  • 插入速度: HashSet>LinkHashSet>TreeSet(内部实现排序)
  • HashSet不保证顺序,LinkHashSet保证FIFO(先进先出),TreeSet安装内部实现排序,也可以自定义排序规则
  • HashSet和LinkHashSet允许null, (只能有一个null) 但TreeSet中插入null时会报NullPointerException

3. List

list的实现类有ArrayList,Vector,LinkedList...其中ArrayList和Vector很相似,均是以数组作为底层实现,不同之处在于Vector是线程安全的。

ArrayList

ArrayList基于数组实现,不是线程安全的,内部维护了一个可变长的对象数组,集合内所有元素存储于这个数组中,并实现该数组长度的动态伸缩。

ArrayList使用数组拷贝来实现指定位置的插入和删除。

LinkedList

LinkedList内部以链表的形式来保存元素,因此随机访问集合时性能较差,但插入,删除元素时性能较好。

LinkedList不仅实现了List接口,还实现了Deque接口,可以被当成双端队列来使用,即可被当成“栈”来使用,也可以当成队列使用。

ArrayList 和LinkedList比较

  • 两者都是List接口的实现类,都不是线程安全。List的另外一个实现类vector是线程安全的。
  • ArrayList是基于动态数组的数据结构,而LinkedList是基于链表的数据结构。
  • 对于随机访问get和set(查询操作),ArrayList要优于LinkedList.(LinkedList要移动指针)
  • 对于增删操作(add和remove),LinkedList优于ArrayList。

4. Map

Map集合用于保存映射关系的数据,Map集合中保存了两组值,一组是 key, 一组是 value。

Map的key不能重复。

key和value之间存在单向一对一的关系, 通过key,能找到唯一确定的value。

Map将key和value封装至一个叫做Entry的对象中,Map中存储的元素实际是Entry。只有在keySet()和values()方法被调用时,Map才会将keySet和values对象实例化。

HashMap

key 是通过hash表来存储,value是通过链表来存储。

HashMap将Entry对象存储在一个数组中,并通过哈希表来实现对Entry的快速访问。 (通过key的哈希值计算Entry在数组中的index,以此访问value) (拉链法,解决hash碰撞)

HashTable

几乎和HashMap一样,都是通过数组存储Entry,以key的哈希值计算Entry在数组中的index,用拉链法解决哈希冲突。二者最大的不同在于, Hashtable是线程安全的,其提供的方法几乎都是同步的。

ConcurrentHashMap

ConcurrentHashMap是HashMap的线程安全版,提供比Hashtable更高效的并发性能。

Hashtable 在进行读写操作时会锁住整个Entry数组,这就导致数据越多性能越差。

ConcurrentHashMap使用分离锁的思路解决并发性能,其将 Entry数组拆分至16个Segment中,以哈希算法决定Entry应该存储在哪个Segment。这样就可以实现在写操作时只对一个Segment 加锁,大幅提升了并发写的性能。

在进行读操作时,ConcurrentHashMap在绝大部分情况下都不需要加锁,其Entry中的value是volatile的,这保证了value被修改时的线程可见性,无需加锁便能实现线程安全的读操作。

ConcurrentHashMap它不能保证读操作的绝对一致性。ConcurrentHashMap保证读操作能获取到已存在Entry的value的最新值,同时也能保证读操作可获取到已完成的写操作的内容,但如果写操作是在创建一个新的Entry,那么在写操作没有完成时,读操作是有可能获取不到这个Entry的。

HashMap和HashTable,ConcurrentHashMap的区别

  • 三者在数据存储层面的机制原理基本一致
  • HashMap不是线程安全的
  • Hashtable是线程安全的,能保证绝对的数据一致性
  • ConcurrentHashMap 也是线程安全的,使用分离锁和volatile等方法极大地提升了读写性能,同时也能保证在绝大部分情况下的数据一致性。但其不能保证绝对的数据一致性,在一个线程向Map中加入Entry的操作没有完全完成之前,其他线程有可能读不到新加入的Entry
  • HashTable不允许使用null作为key和value,如果放入null将引发NullPointerException异常,但HashMap可以使用null作为key或value(只能有一个key为null,可以多个value为null)。
  • 如果在遍历的同时,修改HashTable的大小,容易应发异常。可以用代替,ConcurrentHashMap是HashMap的线程安全版,提供比Hashtable更高效的并发性能

参考资料

https://blog.csdn.net/sdgihshdv/article/details/72566485

https://blog.csdn.net/wangwei_620/article/details/82049502

JAVA集合框架的特点及实现原理简介的更多相关文章

  1. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  2. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  3. 【JAVA集合框架之工具类】

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  4. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  5. Java集合框架:HashMap

    转载: Java集合框架:HashMap Java集合框架概述   Java集合框架无论是在工作.学习.面试中都会经常涉及到,相信各位也并不陌生,其强大也不用多说,博主最近翻阅java集合框架的源码以 ...

  6. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  7. Lambda表达式和Java集合框架

    本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...

  8. Java集合框架梳理(含经典面试题)

    Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. 1. 整体框架 Java容器类库一共有两种主要类型:Collection ...

  9. 浅入深出之Java集合框架(下)

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

随机推荐

  1. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  2. K8s的api gateway---ambassador实操

    对于api gateway,以前总是认知感觉和proxy差不多. 最近几天,撸完了ambassador的官方文档,才比较系统的了解了gateway的功能. 它和传统的nginx proxy或是k8s里 ...

  3. JS高阶---变量与函数提升

    大纲: 主体: 案例1: 接下来在控制台source里进行断点测试 打好断点后,在控制台测试window .

  4. plantUML 安装

    plantUML 安装 资源 http://www.graphviz.org/ https://graphviz.gitlab.io/_pages/Download/windows/graphviz- ...

  5. 使用构造函数 Boolean 创造的对象不是布尔值,而是对象,typeof new Boolean(1) == 'object'

    注意,使用构造函数 Boolean 创造的对象不是布尔值: 事实上 new Boolean() 返回的是一个 Boolean 对象: typeof new Boolean(1) == 'object' ...

  6. day45 作业

    一.将当前日期按"2017-12-27 11:11 星期三"格式输出 function getdate(){ var d = new Date(); year = d.getFul ...

  7. Comet OJ 计算机(computer)

    Comet OJ 计算机(computer) 题目传送门 题目描述 小 X 有一台奇怪的计算机. 这台计算机首先会读入一个正整数 nn,然后生成一个包含 nn 个数的序列 aa. 一开始 a_i(1 ...

  8. 使用ES6 Class封装的IndexDB 操作类,并实现模糊搜索

     封装如下: indexDBOperate.js export class IndexDBOperate { db = null // 数据库实例 databaseName = null // 数据库 ...

  9. Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with na

    问题: Springboot 启动时出错,报没法创建bean的错误,看到nested最后是关于mongoTemplate的错误. 过程: 看网上大多说的是修改mongoTemplate的配置,但是sp ...

  10. day 22

    Creativity requires the courage to let go of certainties. 创新需要勇气承担不确定性.