1、java中ArrayList该类的定义

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{private static final long serialVersionUID = 8683452581122892189L;/*** 默认容量为10*/private static final int DEFAULT_CAPACITY = 10;/*** 空数组:用于调用带有容量切容量为0时初始化elementData这个值*/private static final Object[] EMPTY_ELEMENTDATA = {};/*** 空数组:用于调用空构造时初始化elementData这个值*/private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};/***数组变量*/transient Object[] elementData; // non-private to simplify nested class access/*** arrayList的长度*/private int size;//后面自己需要看源码...
}

2、ArrayList描述

ArrayList是一个继承abstractList和实现List的接口的实现类。
ArrayList是以数组实现的数组队列,允许重复。可以通过ArrayList来进行增加,删除,修改,遍历等操作。
ArrayList可以说是一个动态数组。动态的最好例子可以说就是ArrayList的底层是数组,该数组的长度可以根据实际需要不断增加。

3、ArrayList的扩容机制

3.1 对外提供的检查是否需要扩容方法

public void ensureCapacity(int minCapacity) {
//判断elementData是否是默认空数组,如果不是minExpand为0,如果是minExpand=DEFAULT_CAPACITY=10int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)? 0: DEFAULT_CAPACITY;
//如果我们预测的值比数组elementData数组的长度实际要大,需要扩容。只能说明我们需要更大容器的列表。if (minCapacity > minExpand) {ensureExplicitCapacity(minCapacity);}}

3.2 内部实现的扩容机制

private void ensureExplicitCapacity(int minCapacity) {modCount++;//父类AbstractLisy生命的属性// overflow-conscious codeif (minCapacity - elementData.length > 0)//我们需要的长度比elementData的长度大,扩容grow(minCapacity);
}private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;//获取当前存放数据数组的长度int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容到原来数组长度的1.5倍if (newCapacity - minCapacity < 0)//如果扩容到长度的1.5倍以后,仍然不够用,直接将我们预计的值作为扩容长度newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)//扩容上限最大值为Integer的最大值-8,如果超过这个最大值,使用下面的方法newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity);//使用数组Arrays的copyOf()进行扩容,每次扩容都采用System.arrayCopy()复制到新数组的
}
private static int hugeCapacity(int minCapacity) {//如果扩容超过Integer.MAX_VALUE-8,代码会走该方法 if (minCapacity < 0) // overflow throw new OutOfMemoryError(); //如果我们预测的长度比Integer.MAX_VALUE-8大,最后取Integer.MAX_VALUE。 return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}

4、ArrayList遍历方式

                List<String> testList = new ArrayList<String>();testList.add("11");testList.add("21");testList.add("31");testList.add("41");testList.add("51");testList.add("61");testList.add("71");/*** for循环遍历*/for(int index=0;index<testList.size();index++){System.out.println(testList.get(index));}System.err.println("===========foreach===========");/*** foreach遍历*/for(String index:testList){System.out.println(index);}System.err.println("===========Iterator===========");/*** 迭代器Iterator*/Iterator<String> iterator = testList.iterator();while(iterator.hasNext()){System.err.println(iterator.next());}

5、ArrayList和vector比较

普及:什么是线程安全什么是线程不安全

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 如图,List接口下面有两个实现,一个是ArrayList,另外一个是vector。 从源码的角度来看,因为Vector的方法前加了,synchronized 关键字,也就是同步的意思,sun公司希望Vector是线程安全的,而希望arraylist是高效的,缺点就是另外的优点。

1、Vector每次扩容都是请求其大小的2倍空间,而ArrayList是1.5倍

2、Vector还有一个子类Stack

Java集合框架:ArrayList扩容机制解释相关推荐

  1. 【java集合框架源码剖析系列】java源码剖析之ArrayList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...

  2. 【Java集合框架】ArrayList类方法简明解析(举例说明)

    本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...

  3. java arraylist排序_一文读懂Java集合框架

    欢迎关注微信公众号:深入浅出Java源码 概念 Java集合框架为程序员提供了预先包装的数据结构和算法来操纵他们.集合框架被设计成要满足以下几个目标. 该框架必须是高性能的.基本集合(动态数组,链表, ...

  4. 容器(一)剖析面试最常见问题之 Java 集合框架

    转载自https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/Java%E9%9B%86%E5%90%88%E ...

  5. java list有序还是无序_牛批!2w字的Java集合框架面试题精华集(2020最新版),赶紧收藏。...

    一个多月前,作者和一些小伙伴决定做一系列的 Java 知识点常见重要问题的小册,方便用来夯实基础!小册的标准就一个,那就是:取精华,取重点.每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标 ...

  6. 一文掌握常见常用Java集合框架

    掌握常见常用Java集合框架 说到集合框架,下面这张图一定经常会看见 初看这副图,你可能会觉得眼花缭乱,问题不大,本文这就带你去了解这副图. 1.整体感知 从图中可以看出,集合框架主要分为两个类型,C ...

  7. 史上最全的集合框架讲解 ----- Java 集合框架(3)---- Map 相关类最全解析

    引言 好了,步入正题,上篇文章Java 集合框架(2)---- List 相关类解析中我们一起看了一下 List 接口的相关具体类(ArrayList.LinkedList-.),这篇开始我们开始探索 ...

  8. 「Java面试题精华集」1w字的Java集合框架篇(2022最新版)附PDF版

    昨天晚上终于把 Java 集合框架部分的的知识点肝完了,转换成 PDF 一共 25 页,后台回复:"面试突击" 即可免费获取下载地址(同样提供了夜间阅读版本). 集合概述 Java ...

  9. Java集合框架综述,这篇让你吃透!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...

最新文章

  1. JS-WEB-API(存储)
  2. mysql基础(3)-高级查询
  3. 客制化键盘键位修改_干电池 支持5设备无线连接 - 高斯ALT71机械键盘拆解评测...
  4. Android CardView卡片布局 标签: 控件
  5. Python3用requests,multiprocessing多线程爬取今日头条图片
  6. 解决win7能上网却右下角网络图标显示红色叉号的问题
  7. 例题:打印正三角形。两层for循环,难点明白行与列的关系
  8. nim3取石子游戏 (威佐夫博弈)
  9. 数据库课程设计报告格式模版
  10. 春运又双叒来啦!阿里出手帮你抢票
  11. 压缩文件密码破解神器rarcrack
  12. 【自建分布式数据库详细指南】(四)设计:CITUS分布式数据仓库OLAP/OLTP的架构选择及PG数据库优化方法策略
  13. 行业研究报告-全球与中国PH/ORP变送器市场现状及未来发展趋势
  14. python画画excel_python在excel中画画
  15. Android自定义View之getTextBounds()
  16. 惠普136w墨粉量低_惠普136w加粉清零
  17. 商务电子邮箱那个安全?怎么使用163邮箱最安全?
  18. IOS AppStore提交流程
  19. 红米K30pro问题小记
  20. Jenkins 自动化部署 持续集成

热门文章

  1. django mysql 名称_Django 自定义表名和字段名
  2. python课程开课吧怎么样-年薪30万,未来十年大量缺人,这个技能在金融圈到底有多吃香?...
  3. php和python-php跟python
  4. 用python画多来a梦-python 绘制哆啦A梦
  5. 用python画多来a梦-使用Python的Turtle绘制哆啦A梦实例
  6. python从入门到精通-终于懂得python从入门到精通教程
  7. micropython和python区别-MicroPython简介
  8. 单片机语音识别源码与资料(ASR M08-B模块arduino与51驱动)
  9. 实现一个基于主存的虚拟块设备驱动程序_存储器的层次结构:寄存器、高速缓存、主存、本地磁盘...
  10. 【动态规划笔记】背包问题:搬寝室