集合相关
2020-10-23 16:13:29 0 举报
list和map的成长体,有问题的地方可以留言,会继续成长
作者其他创作
大纲/内容
Vector
继承
内部类这里不加介绍
SortedSet
NavigableSet
ConcurrentNavigableMap
AbstractQueue
Queue
SortedMap
数组保存数据线程不安全需要扩容:但是看实现 容量小于64的时候一次扩容接近翻倍,其他情况扩容50%添加数据和取数据会重新对队列排序,但是排序不是严格的排序,保证优先级高的在队列第一个。排序使用二分法保证获取的时候优先级最高的在第一个他的线程安全版本是PriorityBlockingQueue不光继承了AbstractQueue还实现了BlockingQueue,通过内部的ReentrantLock锁实现线程安全
CopyOnWriteArrayList
很任性的一个队列根本没有容量,只要你敢塞数据,他就敢报错他的机制是这样的,应用与多线程场景,并且是先用获取的方法,然后另外一个线程再放
主要是头尾都可以塞数据和取数据
AbstractMap
ConcurrentLinkedQueue
链表保存数据提供链表头部和链表尾部两个默认字段不需要设置长度实现线程安全不是用锁来实现的,而是通过cas机制实现在进行cas添加数据的时候理论上是有可能一直等不到返回数据的。。。====美丽的分隔线====链表实现的队列:LinkedBlockingQueue 继承AbstractQueue实现BlockingQueueLinkedBlockingDueue继承AbstractQueue实现BlockingDueue这俩类似,都通过加锁实现线程安全,只是LinkedBlockingDueue,可以在队列头部和尾部随意添加数据,而LinkedBlockingQueue只能在尾部
TreeMap
ConcurrentHashMap
数组保存数据默认容量 10Object[]数组保存数据线程安全提供功能基本和ArrayList一样只是在扩容的时候可以手动指定每次扩容多少,如果不指定,默认扩容一倍
链表数组维护数据线程安全实现和HashMap(JDk1.7)类似但是效率低,每次是对整个数组加锁
Iterable
List
实现
默认容量 10Object[]数组保存数据线程不安全add方法每次执行前会进行容量确认(首次添加数据之前,数组为空数组,首次添加数据的时候会对数组第一次扩容)每次扩容在当前容量基础上添加当前容量的一半remove不是真的删除,是通过将当前索引以后的数组重新赋值给当前数组,覆盖掉要删除的数据modCount作用 在使用迭代器迭代时提供数组遍历(expectedModCount)检查的依据trimToSize(去除预申请的空间,但是会先复制当前数据)removeAll(Collection<?> c) 获取不在参数c中数据retainAll(Collection<?> c) 取交集都会对原数组进行删除操作subList操作返回的不是ArrayList,而是他的内部类SubListtoArray方法执行的数据数据拷贝一份
通过对红黑树的维护完成map功能线程不安全类似于HashMap软引用存储的数据gc内存回收的时候可能会被回收数据对象的引用分为四种1、强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。比如String str = \"hello\"这时候str就是一个强引用。2、软引用内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。 3、弱引用如果一个对象具有弱引用,在垃圾回收时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。 4、虚引用如果一个对象具有虚引用,就相当于没有引用,在任何时候都有可能被回收。使用虚引用的目的就是为了得知对象被GC的时机,所以可以利用虚引用来进行销毁前的一些操作,比如说资源释放等。
LInkedList
Map
用CopyOnWriteArrayList存储的数据。线程问题和CopyOnWriteArrayList一样添加重复数据的时候不会成功,返回falseset是真的鸡贼
NavigableMap
IdentityHashMap
AbstractSet
AbstractList
HashMap
用HashMap存储的数据,惊不惊喜。所有的数据操作都只是操作HashMap的key线程也不安全
ConcurrentSkipListMap
ConcurrentMap
ArrayBlockingQueue
不再使用数组存储数据,使用链表存储数据,默认会有一个头部节点和尾部节点线程不安全和ArrayList相比不用扩容,用多少有多少get获取数据的时候采用了二分法进行遍历查找,速度不如ArrayList新增的时候效率优于ArrayListset的时候也需要遍历需要的节点支持队列操作,并进行有功能扩展(对队列头尾都可以操作)
课下作业:自己拓展
BeanContext
SynchronousQueue
使用了一个ReentrantLock成员变量的锁默认长度为0,每次新增数组长度会加1,不存在批量扩容,每次新增都会进行扩容。存储数据的Object数组线程可见获取数据的时候还是从数组中直接获取set、add、remove方法的时候或先获取锁,然后修改或者移除数据。流程为先复制一份数据出来,更新复制后的数据,修改完成之后,将新的数组复制给对象的默认数组数组排序sort方法也是同样流程修改加锁,读取不加锁。修改的是复制出来的数组,修改完成会将复制的数组当做对象默认存储的数组同样,subList返回的也不是CopyOnWriteArrayList,是一个继承了AbstractList的内部类
LinkedHashSet
Object[]数组保存数据线程不安全没有使用红黑树类似HashMap比较key的时候直接使用==比较key可以为null,key为null时会将默认的Object对象作为key
Dictionary
ConcurrentSkipListSet
BlockingQueue
Deque
WeakHashMap
通过对红黑树的维护完成map功能可排序线程不安全再看看
LinkedHashMap
AbstractCollection
用ConcurrentSkipListMap存储的数据。所有的数据操作都只是操作ConcurrentSkipListMap的key线程也不安全
ArrayList
数组保存数据takeIndex 记录读取位置putIndex 记录存储位置count 记录当前数据量获取数据时只判断count的值线程安全,使用了一个ReentrantLock成员变量的锁默认使用不公平锁,可以设置为使用锁的方式添加数据add 队列满的时候会直接抛出异常offer 队列满的话不抛出异常 返回false,并且提供了一个有等待时长的重载方法put 队列满的话 死等获取数据并移除remove 队列为空,直接报错 由于本身没有实现remove方法,使用的是父类的,父类获取数据为null会抛出异常poll 队列为空 返回null 并且提供了一个有等待时长的重载方法take 队列为空 死等
链表+红黑树的数组维护数据线程安全添加和删除的时候获取数组的元素,如果为null,则进行cas操作完成修改操作;如果不为null,则通过synchronized锁住当前元素,进行数据变更红黑树部分和HashMap类似红黑树的转换是在放完数据之后发现达到阈值8了,才进行的红黑树转换key和value不允许null
HashSet
使用HeadIndex链表保存数据这个链表是一个跳表对象中有level当前级别、node节点信息、down下一个节点、right右边的节点。用户存储的数据在node中,HeadIndex其他属性用来维护跳表随机跳跃,一个随机值的计算判断是否需要添加跳跃层级顺序存储存储数据的时候根据key先检索数据,找到应该加在哪个节点之后,添加节点判断是否需要添加高度,是否需要添加高度的算法随机,如果需要的话会添加一些默认index节点和HeadIndex高度添加之后对挂载的node节点进行楼层的重新挂载高度添加之前,数据会一直在node下和right的node下挂载,添加高度之后才会在down进行挂载key不允许null
CopyOnWriteArraySet
Collection
PriorityQueue
Set
Hashtable
0 条评论
下一页