java集合思维导图
2021-08-07 14:27:50 40 举报
AI智能生成
登录查看完整内容
java集合思维导图总结
作者其他创作
大纲/内容
存储引用类型的变量容器
每一个对象作为一个元素存在
提供的集合类位于java.util包中
概述
数组固定
集合会改变
长度
数组存储同一类型
集合不一定
内容区别
集合有提供的各种方法
使用方式
数组和集合区别
内存连续
大小固定,查找迅速,增删复杂
容易产生碎片
数组
内存地址不连续
动态调整
增删迅速,查找较慢
不会造成碎片化
链表
基础数据结构
ArrayList
Stack
Vector
LinkedList
List
LinkedHashSet
HashSet
TreeSet
Set
Collection
LinkedHashMap
Properties
HashMap
HashTable
TreeMap
Map
外框
继承关系
底层实现:数组
线程不安全
初始化数组为0
第一次添加扩容到10
之后1.5倍扩容
无参构造
初始化为指定容量大小
不够时,1.5倍扩容
有参构造
扩容机制
适合查询
增删不适合
应用
方法由synchronized的修饰,线程安全
初始化为10
之后2倍扩容
有参构造,之后2倍扩容
多线程
底层实现:双向链表
vector的子类,底层实现和vector一样
pop方法会直接移除最后一个元素
底层实现:hashMap,key为set的元素,value为空的object对象
可以存放null值,只能有一个
底层实现LinkedHashMap
HashSet的子类
数组+双向链表
底层实现TreeMap
无序没有索引不存储相同元素遍历方式 使用迭代器 使用增强for循环底层判重机制 先判断hashCode然后判断equals
单列集合有序集合(是否会按照插入的先后顺序来存储)有索引元素可以重复遍历方式三种 迭代器 普通for 增强for
插入慢,查询效率高
特点
数组+链表
JDK1.7
数组+链表+红黑树
JDK1.8
底层实现
第一次添加:哈希桶初始化为16负载因子默认值为0.75
之后添加:哈希桶每次2倍扩容
当一个桶中的元素>8并且哈希桶桶的个数>=64
什么时候链表会变成红黑树
当红黑树中的节点<=6时会转换成链表
移除节点时会判断是否需要转换成链表
扩容时,移动到新的桶时会判断是否需要转换成链表
调用位置
什么时候红黑树会变成链表
JDK8-在多线程的情况下,红黑树的节点r=r.parent.parent所以查找根节点死循环
JDK7-多线程情况下,两个HashMap扩容最后会导致链成循环的,造成死循环
hashMap的死循环问题
底层结构
通过方法上添加synchronized实现
线程安全
初始化容量为11
之后每次table扩容为原来的2n+1
HashMap+LinkedList
哈希+双向链表
集合有序
非线程安全
hashTable的子类,线程安全
经常读取配置文件等
有序集合,通过红黑树实现
key必须实现comparable接口,否则会抛出异常
通过分段锁+可重入所实现线程安全
结构为:数组+链表
一个segments里面是一个小的hashMap,内置自己的计数器每一个线程对hashmap操作,会锁住segments,所以叫做分段锁并发度一定后,会对segments内置的小HashMap进行扩容
结构
有多少并发量,创建多少个segments
使用可重入锁对segments上锁
内部机制
jdk1.7
通过volatile+synchronized锁节点+CAS操作实现线程安全
底层结构:数组+链表+红黑树
添加元素通过对每一个桶的头结点加锁桶的个数,说明了他的并发量计数,通过baseCount+counterCells数组实现——为了提供并发量
内部结构
jdk1.8
ConCurrentHashMap
java集合
无序存储双列元素,key-valuekey不允许重复,可以为null,只有一个value允许重复,可以有多个null一对key-value存储在一个node中Node实现了Entry接口,一对key0value也是一个entry
0 条评论
回复 删除
下一页