1List :元素可以重复,可以存null

1.1 ArrayList:采用数组,非线程安全,默认初始量10,扩容机制1.5倍,Fail-Fast机制,快速失败机制。查找快速,增删需要一个个复制移动元素,适合查找。Jdk8中默认初始量为0。

1.2 Vector:和ArrayList差不多,是线程安全的。

1.3 LinkedList:带头尾指针的双向链表,实现了Queue接口,Deque(Queue的子接口),可当做栈、队列使用。增删快速,查找需要链表一个个找,适合增删操作。

2 Set:元素不重复

2.1 HashSet:基于HashMap实现的,HashSet底层使用HashMap来保存所有元素。元素保存在map的key中。

2.2 LinkedHashSet:它继承与HashSet、又基于LinkedHashMap来实现的,迭代顺序可为插入顺序或是访问顺序

2.3 TreeSet: 其底层使用的就是TreeMap,用红黑树来存储数据,不能存null,不然抛异常,实现了SortedSet接口,可以用Comparealbe自然排序,或者自定义Comparetor接口

3.1HashMap:key value键值对,可以存null值,key是final的不可修改。 数组+链表 HashMap内部维护着一个散列数组(就是一个存放元素的数组),每个列表都是一个桶,我们称其为散列桶,而当我们向HashMap中存入一组键值对时,HashMap首先获取key这个对象的hashcode()方法的返回值,得出一个数字,再对桶总数取余,这个数字就是这组键值对要存入散列数组中的下标位置。桶为空就加进去,不为空就用equals()查看散列数组的链表里是否已经包含这个对象,HashMap会将每组键值对封装为一个Entry的实例,然后将该实例存入链表,否则就替换value。

那么在获取元素时,HashMap同样先根据key的hashcode值进行散列算法,找到它在散列数组中的位置,然后遍历该位置的链表,找到该key所对应的value之后返回。HashMap 的实例有两个参数影响其性能:初始容量16 和加载因子(默认0.75). 达到16*0.75=12时,map扩容一倍成32.

(定位桶位置没有用取余,而是用&,容量都是2的幂次方,因为&(length-1),这样结果是1或者0,分布更均匀)

fail-fast机制:通过volatile类型的modCount域,modCount顾名思义就是修改次数,对HashMap内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的expectedModCount。

Jdk8中的hashmap:大致过程差不多,只是链表中采用链表+红黑树,当超过8时转换成红黑树,低于6转回链表,在扩容中和jdk7不同的是,采用&高位,利用结果1还是0判断是原位置还是原位置+扩容量的位置。Jdk7采用重新计算hash值。

在JDK7 存在死循环和数据丢失问题。

数据丢失:

并发赋值被覆盖: 在 createEntry 方法中,新添加的元素直接放在头部,使元素之后可以被更快访问,但如果两个线程同时执行到此处,会导致其中一个线程的赋值被覆盖。

已遍历区间新增元素丢失: 当某个线程在 transfer 方法迁移时,其他线程新增的元素可能落在已遍历过的哈希槽上。遍历完成后,table 数组引用指向了 newTable,新增元素丢失。

新表被覆盖: 如果 resize 完成,执行了 table = newTable,则后续元素就可以在新表上进行插入。但如果多线程同时 resize ,每个线程都会 new 一个数组,这是线程内的局部对象,线程之间不可见。迁移完成后resize 的线程会赋值给 table 线程共享变量,可能会覆盖其他线程的操作,在新表中插入的对象都会被丢弃。

死循环:

HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,链表尾部的数据会成为新链表的头部,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。

JDK8 在 resize 方法中完成扩容,并改用尾插法,不会产生死循环,但并发下仍可能丢失数据。可用 ConcurrentHashMap 或 Collections.synchronizedMap 包装成同步集合。

Hashmap不安全:https://www.jianshu.com/p/e2f75c8cce01

3.2TreeMap:底层使用红黑树,key不能为null,不然抛异常。实现了SortedMap接口,可以用Comparealbe自然排序,或者自定义Comparetor接口

3.3 LinkedHashMap:具有可预知的迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

3.3 HashTable:线程安全的。不可以存null值。

3.4 CurrentHashMap:jdk7中,采用数组+链表,Segment分段枷锁,Segment是继承Reentranlock,从而实现线程安全。Entry的value和next Entry都是valitaile的,保证可见性。Key是final。

Jdk8中,参考了1.8HashMap的实现方式,采用了数组,链表,红黑树的实现方式,采用Node节点,利用synchronized+CAS加锁实现的。

java 集合底层_java集合底层实现总结相关推荐

  1. java 集合 接口_Java集合之Collection接口

    1 - Java集合介绍 /* 1. 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储. 2. 另一方面,使用Array存储对象方面具有一些弊 端,而 ...

  2. java集合总结_java集合小总结

    java集合就是一个容器. 1.     集合概述 l       为了保存不确定的数据,或者对象,以及保存具有映射关系的数据. l       所有的集合类都位于java.util包下. 1.1.  ...

  3. java集合继承_java集合继承关系

    数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象. 集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象. 上述类图中, ...

  4. Java集合学习_Java集合学习(适合新手)

    集合框架 由⼀组类和接⼝组成的⼀个体系. Collection 集合框架 最基本的接⼝,⼀个 Collection 可以存储⼀组⽆序.不唯⼀的对象,实际开发中不会直接使⽤ Collection 进⾏开 ...

  5. java集合示例_Java集合的addAll()方法和示例

    集合类addAll()方法addAll()方法在java.lang包中可用. addAll()方法用于将所有给定元素(ele)放入给定集合(co). addAll()方法是一个静态方法,可以使用类名进 ...

  6. java族谱设计_Java集合族谱总结

    集合族谱核心成员 集合族谱核心成员 所有的集合类,都实现了Iterator接口,这是用于遍历集合中元素的接口:Java集合框架核心是两个类型的容器,一种是集合(Collection),存储单一元素,一 ...

  7. java treeset原理_Java集合 --- TreeSet底层实现和原理(源码解析)

    概述 文章的内容基于JDK1.7进行分析,之所以选用这个版本,是因为1.8的有些类做了改动,增加了阅读的难度,虽然是1.7,但是对于1.8做了重大改动的内容,文章也会进行说明. TreeSet实现了S ...

  8. java concurrentmap原理_Java集合番外篇 -- ConcurrentHashMap底层实现和原理

    概述 距离上一次集合篇结束已经过了好久了, 之前说要写一下番外,但是太忙了,总也找不出相对松散的时间,也有点静不下心来,最近花了点时间,于是便有了这篇博客. 在开始之前先介绍一个算法, 这个算法和Co ...

  9. java集合性能_Java集合性能分析-疯狂Java讲义

    一.各Set实现类的性能分析 HashSet和TreeSet是Set的两个典型实现.HashSet的性能总是比TreeSet好(特别是最常用的添加.查询元素等操作),因为TreeSet需要额外的红黑树 ...

  10. java list 接口_Java 集合 List接口

    [TOC] List接口 概述有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的 ...

最新文章

  1. pip 升级之后提示 bash: /usr/bin/pip3: No such file or directory
  2. 怎样封装一个自己的mvc框架(五)
  3. 使用LBP+SVM,训练识别给定的测试图像
  4. 自定义OutputFormat案例实操
  5. 广东理工学院计算机考试大纲,2020年广东理工学院专插本专业课考试大纲汇总...
  6. ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 fro m C...
  7. 【信号处理】采样定理的深入浅出
  8. win10输入法转win7模式
  9. eeg地形图matlab,Matlab画地形图
  10. 用计算机运算符编写检索式,在计算机检索中,常用的布尔逻辑算符有哪几种
  11. R 单独窗口显示绘图(plots)
  12. 关于嵌入式面试的一些题
  13. 电脑每次重启总是会进行磁盘检查
  14. Android 错把setLayerType当成硬件加速
  15. 51单片机与AVR(SPI)单片机驱动DS1302
  16. 一直都是技术,今天来点儿文艺范儿……
  17. 赵钟秋谈又拍网架构中的消息/任务系统
  18. Java进阶之路~多态
  19. 磁盘阵列raid LVM创建
  20. 基于javaweb的毕业设计毕业论文管理系统(java+ssm+jsp+tomcat+mysql)

热门文章

  1. 碧桂园博智林机器人总部大楼_碧桂园11.4亿元竞得北滘坤洲地块,近博智林机器人谷...
  2. google三篇重要论文(英文原文)
  3. Java泛型类继承实现
  4. 利用httpclient和多线程刷访问量代码
  5. Springboot微信公众号开发入门流程(校验签名、access_token获取、生成带参二维码、发送文字、图文消息、被动回复消息、图文消息静默跳转)
  6. 对象可以创建数组吗_淘宝联盟平台可以创建淘礼金吗?相关问题解答
  7. PayPal第一次提现失败手续费返还教程
  8. matlab 模的平方,RSA模重复平方算法小示例
  9. 吸料机的工作原理过程
  10. su的2019面试准备