`
noble510520
  • 浏览: 55289 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

jdk顺序表笔记

    博客分类:
  • java
阅读更多

一、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)

返回的是该集合的视图,视图是浅拷贝,会直接操作该集合
 
a192136220-94766

查看原文: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、数据库系统开发、Web开发学习笔记 Java-JDK部分: 1. Object类的所有方法及功能:Object类是Java中的顶层类,所有类实际上都继承了Object类的所有方法。Object类提供了以下方法: * protected Object ...

    java学习笔记JDK6课件之十三

    `Iterator`接口提供了一个方法`iterator()`,用于获取一个迭代器实例,该迭代器可以按顺序访问容器中的元素,而容器的数据结构实现细节对外部是隐藏的。 `List`接口是`Collection`接口的子接口,它增加了对有序元素...

    java基础笔记

    笔记主要分为十个部分,详细讲解了IT行业的基本概念、Java与其他语言的对比、JDK的基础知识,以及面向对象编程的核心概念。 首先,笔记介绍了IT行业,帮助读者理解行业背景,对比了C、C++和Java三种编程语言的特性...

    尚硅谷大厂面试题第二季周阳主讲整理笔记

    - **LinkedHashMap**:与HashMap相比,LinkedHashMap维护了一个插入顺序或访问顺序的双向链表,适合于频繁遍历的操作,但它的插入和删除速度略慢。 - **HashTable**:早期的Map实现,线程安全,但效率较低,不允许...

    java基础学习笔记

    ### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...

    java面试笔记.pdf

    以下是对笔记中各个部分知识点的详细介绍: 1. Vector和ArrayList的区别: - Vector是同步的,适用于线程安全的环境,但因为同步的实现会导致性能损耗。 - Vector在扩容时将容量翻倍,而ArrayList的扩容方式是增加...

    韩顺平 java循序渐进学从入门到精通 笔记

    - **表的管理**:创建表、修改表结构、插入数据等操作。 以上内容覆盖了韩顺平老师《Java循序渐进学从入门到精通》笔记的主要知识点,从基础知识到高级特性都有涉及,适合初学者和有一定经验的开发者学习参考。

    传智播客视频JavaSE学习笔记

    以上是根据传智播客视频JavaSE学习笔记总结的关键知识点,覆盖了Java基础环境配置、字符串操作、多线程编程、集合框架、输入输出流、网络编程、反射机制、正则表达式等多个方面,希望对Java初学者和进阶者有所帮助。

    Hibernate -annotation 学习笔记

    【Hibernate - Annotation 学习笔记】 Hibernate 是一个流行的开源Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据存储。Annotation是Hibernate提供的一种元...

    Java学习笔记

    ### Java学习笔记知识点详解 #### 一、Java环境配置与工具软件 - **JAVA环境变量配置**: - **JDK安装路径**:定义变量`java_myhome`,其值为`C:\Java\jdk1.8.0_112`。 - **PATH变量配置**:增加`%java_myhome%\...

    jVM学习笔记.ppt

    JDK与JRE的区别在于,JDK包含了开发工具和JRE,而JRE仅包含运行时环境。 Java代码的编译和执行过程是JVM工作的重要环节。源码编译由Java源码编译器完成,这个过程包括了源码的分析、输入到符号表、注解处理和语义...

    java从刚刚开始到集合的详细代码和笔记教程.rar

    3. **HashSet与TreeSet**:Set接口的实现类中,HashSet基于哈希表,插入和查找速度快,但不保证顺序;TreeSet基于红黑树,能保持元素排序。 4. **HashMap与TreeMap**:Map接口的实现类,HashMap提供快速的查找和...

    Java入门学习笔记

    ### Java入门学习笔记 #### 一、Java特点与运行原理 **1.1 Java特点** - **简单性:** Java的设计使得它易于学习且避免了许多传统编程语言中存在的复杂性。 - **面向对象:** Java是一种纯面向对象的语言,支持...

    java笔记.docx

    - **反转**: 使用`reverse()`方法反转字符串缓冲区中的字符顺序。 #### 4. 字符串与StringBuffer之间的转换 - **String → StringBuffer**: 可以通过`new StringBuffer(String s)`构造方法来实现。 - **...

    马士兵J2SE第七章容器个人学习笔记.pdf

    `HashSet`基于哈希表实现,不保证元素顺序,而`TreeSet`使用红黑树实现,元素按照自然排序或者自定义比较器的顺序排列。 2. `List`接口:`List`接口同样继承自`Collection`,它维护元素的顺序,并且允许重复元素。...

    Java领域基础部分JavaSE笔记

    - **顺序结构**:按照代码出现的顺序执行。 ##### 4.2 分支控制 - **if-else**:根据条件判断选择执行不同代码块。 - **switch-case**:基于不同case值执行相应的代码块。 ##### 4.3 循环控制 - **for**:循环次数...

    java 讲师笔记

    - 数据库基础,介绍了数据库中表的作用、数据库的标准语言、数据库的种类、如何定义表以及DBMS的安装。 - select语句是SQL中用于查询数据库中数据的关键语句,包括了基本语法、列别名、算术表达式以及如何处理空值。...

    java面试笔记整理,包含java,redis,kafka等

    #### 二十六、类实例化的顺序 - **静态初始化块和静态变量先于非静态初始化块和非静态变量。** - **构造函数最后执行。 #### 二十七、equals与==的区别 - **==** 用来比较两个变量是否指向同一个对象。 - **...

    Java基础笔记

    - **`LinkedHashSet`**:继承自`HashSet`,保持元素的插入顺序。 - **`TreeSet`**:基于红黑树实现,元素自然排序或自定义排序。 - **`List`**:允许元素重复的有序集合。 - **`ArrayList`**:基于数组实现。 - ...

Global site tag (gtag.js) - Google Analytics