一、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/
相关推荐
Java-JDK、数据库系统开发、Web开发学习笔记 Java-JDK部分: 1. Object类的所有方法及功能:Object类是Java中的顶层类,所有类实际上都继承了Object类的所有方法。Object类提供了以下方法: * protected Object ...
`Iterator`接口提供了一个方法`iterator()`,用于获取一个迭代器实例,该迭代器可以按顺序访问容器中的元素,而容器的数据结构实现细节对外部是隐藏的。 `List`接口是`Collection`接口的子接口,它增加了对有序元素...
笔记主要分为十个部分,详细讲解了IT行业的基本概念、Java与其他语言的对比、JDK的基础知识,以及面向对象编程的核心概念。 首先,笔记介绍了IT行业,帮助读者理解行业背景,对比了C、C++和Java三种编程语言的特性...
- **LinkedHashMap**:与HashMap相比,LinkedHashMap维护了一个插入顺序或访问顺序的双向链表,适合于频繁遍历的操作,但它的插入和删除速度略慢。 - **HashTable**:早期的Map实现,线程安全,但效率较低,不允许...
### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...
以下是对笔记中各个部分知识点的详细介绍: 1. Vector和ArrayList的区别: - Vector是同步的,适用于线程安全的环境,但因为同步的实现会导致性能损耗。 - Vector在扩容时将容量翻倍,而ArrayList的扩容方式是增加...
- **表的管理**:创建表、修改表结构、插入数据等操作。 以上内容覆盖了韩顺平老师《Java循序渐进学从入门到精通》笔记的主要知识点,从基础知识到高级特性都有涉及,适合初学者和有一定经验的开发者学习参考。
以上是根据传智播客视频JavaSE学习笔记总结的关键知识点,覆盖了Java基础环境配置、字符串操作、多线程编程、集合框架、输入输出流、网络编程、反射机制、正则表达式等多个方面,希望对Java初学者和进阶者有所帮助。
【Hibernate - Annotation 学习笔记】 Hibernate 是一个流行的开源Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据存储。Annotation是Hibernate提供的一种元...
### Java学习笔记知识点详解 #### 一、Java环境配置与工具软件 - **JAVA环境变量配置**: - **JDK安装路径**:定义变量`java_myhome`,其值为`C:\Java\jdk1.8.0_112`。 - **PATH变量配置**:增加`%java_myhome%\...
JDK与JRE的区别在于,JDK包含了开发工具和JRE,而JRE仅包含运行时环境。 Java代码的编译和执行过程是JVM工作的重要环节。源码编译由Java源码编译器完成,这个过程包括了源码的分析、输入到符号表、注解处理和语义...
3. **HashSet与TreeSet**:Set接口的实现类中,HashSet基于哈希表,插入和查找速度快,但不保证顺序;TreeSet基于红黑树,能保持元素排序。 4. **HashMap与TreeMap**:Map接口的实现类,HashMap提供快速的查找和...
### Java入门学习笔记 #### 一、Java特点与运行原理 **1.1 Java特点** - **简单性:** Java的设计使得它易于学习且避免了许多传统编程语言中存在的复杂性。 - **面向对象:** Java是一种纯面向对象的语言,支持...
- **反转**: 使用`reverse()`方法反转字符串缓冲区中的字符顺序。 #### 4. 字符串与StringBuffer之间的转换 - **String → StringBuffer**: 可以通过`new StringBuffer(String s)`构造方法来实现。 - **...
`HashSet`基于哈希表实现,不保证元素顺序,而`TreeSet`使用红黑树实现,元素按照自然排序或者自定义比较器的顺序排列。 2. `List`接口:`List`接口同样继承自`Collection`,它维护元素的顺序,并且允许重复元素。...
- **顺序结构**:按照代码出现的顺序执行。 ##### 4.2 分支控制 - **if-else**:根据条件判断选择执行不同代码块。 - **switch-case**:基于不同case值执行相应的代码块。 ##### 4.3 循环控制 - **for**:循环次数...
- 数据库基础,介绍了数据库中表的作用、数据库的标准语言、数据库的种类、如何定义表以及DBMS的安装。 - select语句是SQL中用于查询数据库中数据的关键语句,包括了基本语法、列别名、算术表达式以及如何处理空值。...
#### 二十六、类实例化的顺序 - **静态初始化块和静态变量先于非静态初始化块和非静态变量。** - **构造函数最后执行。 #### 二十七、equals与==的区别 - **==** 用来比较两个变量是否指向同一个对象。 - **...
- **`LinkedHashSet`**:继承自`HashSet`,保持元素的插入顺序。 - **`TreeSet`**:基于红黑树实现,元素自然排序或自定义排序。 - **`List`**:允许元素重复的有序集合。 - **`ArrayList`**:基于数组实现。 - ...