jdk顺序表笔记
来源:互联网 发布:sqlserver true false 编辑:程序博客网 时间:2024/05/24 15:40
一、AbstractCollection
提供了集合的最大实现
继承该类,必须实现size()和iterator(),因为该类操作集合都是通过iterator
二、fail-fast策略
该策略在集合框架中多次被应用
一种多线程对同一集合操作的保护措施,确保操作目标没有被其他线程操作过,与cas思想有异曲同工之处
具体在集合中的实现:
定义一个全局变量modCount,表示集合被修改的次数
每次进行动态操作的时候,modCount++
在Iterator中定义一个全局变量expectedModCount,
每次操作Iterator的时候都会比较modCount和expectedModCount,相等则认为这个集合没有被并发修改,否则会抛出ConcurrentModificationException
所以只要有modCount这个变量的,都是线程不安全的,这种集合最好使用迭代器,因为直接操作不会检查集合有没有被并发修改
使用volatile修饰modCount
被volatile修饰的变量,程序中的每次引用,处理器都会从内存(共享内存)中去读值,而不是从寄存器(线程独有内存)中获取
这使得fail-fast策略更可靠
三、AbstractList
提供了顺序表的最大实现
该类实现了迭代器
继承该类,需要实现get方法,因为迭代器的next是调用了get
四、ArrayList
1.初始容量为10
构造器(集合)和addAll,是深拷贝,因为调的是AbstractCollection.toArray()---->Arrays.copyOf()------>System.arraycopy()
2.多用会用trimToSize
因为顺序表一建立的时候,就会创建一个初始大小的数组,这样就会有空余的位置,调用这个方法可以把多余的位置清理,节约空间
实际长度是存储数组的length,不是全局变量size,size意味着有多个个元素是有数据的
3.扩展容量
默认是增大一半的空间,要考虑int溢出(溢出<0),以及虚拟机的最大内存
必用ensureCapacity(int minSize),需要增大容量的时候,都要调用
都要确认这个容量是否支持,不支持则会扩展容量
防止数组越界
4.toArray,clone都是深度拷贝
5.维护的数组是没有泛型的,当需要获取元素的时候,才去转型
6.对于动态操作
并没有像通常数据结构的书那样子,要移动操作元素后续的节点,而是直接拷贝一份
7.养成好习惯
动态操作了之后,不单单只是移动指针,要将不存在的元素位置设置为null,目的是为了让垃圾收集器工作
8.提供一些安全性低,但是快速的private方法
比如remove(Obj),获取下标了之后,就可以调用一个fastRemove(index),不需要二次比较值
9.subList(from,to)
返回的是该集合的视图,视图是浅拷贝,会直接操作该集合
查看原文:http://blog.zswlib.com/2016/10/26/jdk%e9%a1%ba%e5%ba%8f%e8%a1%a8%e7%ac%94%e8%ae%b0/ 0 0
- jdk顺序表笔记
- jdk链表笔记
- 数据结构笔记--顺序表
- 顺序表笔记
- 笔记5:顺序表
- jdk加载类顺序
- JDK配置顺序
- 顺序表(学习笔记)
- 数据结构学习笔记:顺序表
- 数据结构笔记之顺序表
- 顺序表(学习笔记)
- 【Data_Structure笔记1】线性表的顺序存储【顺序表】
- 链表学习笔记 -- 顺序链表
- 数据结构学习笔记二 顺序表
- 数据结构之顺序表学习笔记
- 【黑马程序员-学习笔记】数据结构-顺序表
- [学习笔记]线性表的顺序存储
- 数据结构笔记(1)-顺序表
- android怎样调用系统相册
- 在Spring、Hibernate中使用Ehcache缓存
- Oracle存储过程基本语法介绍
- java项目命名规范
- get请求表单的action属性后不能带参数
- jdk顺序表笔记
- 微信是移动端的主要力量
- Let's Talk About project.pbxproj
- ubuntu 14.04 windows7双系统安装
- ODBC 中的错误处理
- PSI/SI表的深度摘要-2
- hibernate中load和get的区别
- JS——笔试点滴记录2——字符串相关
- 方法上spring事物注解失效问题