Java集合 ArrayList 扩容
Java的集合框架
集合的分类
可以分为单列集合和双列集合
单列集合主要有Collection下面的List与Set,其中List最长被用到的是ArrayList与LinkedList以及Vctor三种 Set最常用的是我们的HashSet以及TreeSet linkedHashSet可以使Set有序(插入与输出)
Collection都可以使用迭代器进行迭代
UML 类图如下
双列集合Map是基类
Map集合下常用的有HashMap与ConcurrentHashMap 、TreeMap、以及LinkedHashMap(保证插入的顺序与输出的顺序一致)
类图如下
ArrayList的源码解析
1、无参构造方法第一次构建创建的数组使{} 没有值 长度是0
list第一次添加元素,不管什么时候添加元素都会查看是需要进行扩容
计算所需要的容量第一次默认是数组大小是10
grow()是进行扩容的方法除了第一次默认是10 以后每一次都是扩容1.5倍
如果使用有参构造方法的话每次以后每次扩容1.5倍 不演示调试截图了
- 代码整理
// 存储数据的集合
transient Object[] elementData; // non-private to simplify nested class access
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// list集合的add方法
public boolean add(E e) {// size 默认是0 第一次添加传入的参数就是 0+1ensureCapacityInternal(size + 1); // Increments modCount!!// 确保内部容量没有问题以后 就进行复制操作elementData[size++] = e;return true;
}
// 确保内部的容量可用
private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 计算容量的方法
private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {// 进入这里说明集合就是初始值 所以看需要的容量的最小值与 默认容量之间那个大 就返回默认容量return Math.max(DEFAULT_CAPACITY, minCapacity);}// 如果前面没有返回说明了 数组已经进行了初始化 就返回现在需要的容量大小return minCapacity;
}
// 确保容量
private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious code 如果容量不够就进行扩容 最小的容量都比数组的长度大了 那肯定就是要进行扩容了if (minCapacity - elementData.length > 0)grow(minCapacity);
}
// 扩容方法
private void grow(int minCapacity) {// overflow-conscious code// 先取出原来的数组容量 第一次取就是0int oldCapacity = elementData.length;// 新的数组长度计算 就是 old + old / 2 原来的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);// 如果new 计算出来的容量不如要求最小的容量 就把new 容量 重新复制成 minif (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 检查是否溢出if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:// 将原来数组中的数据进行拷贝elementData = Arrays.copyOf(elementData, newCapacity);
}
Java集合 ArrayList 扩容相关推荐
- java集合-ArrayList
java集合 ArrayList Iterable Comparable(排序接口) 项目结构: class Dog implements Comparable<Dog> {private ...
- java集合-ArrayList学习笔记
集合和数组关系? 1) 集合是一种容器,可以存储多个数据. 2) 数组的长度是固定的,集合的长度是可变的. 3) 集合中存储的元素必须为引用类型数据,初始值为NULL Arra ...
- Java集合ArrayList
ArrayList List接口的一个实现类 内部封装了一个长度可变的数组对象 当存入的元素,超过数组长度时,会在内存中,分配一个更大的数组 来存储这些元素,可以看做是一个长度可变的数组 优点 允许通 ...
- Java集合—ArrayList底层原理
原文作者:0 errors 0 warnings 原文地址:用大白话告诉你ArrayList的底层原理 目录 一.数据结构 二.线程安全性 三.继承关系 四.构造方法 五.add()方法 六.扩容机制 ...
- Java集合-ArrayList源码解析-JDK1.8
◆ ArrayList简介 ◆ ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAcc ...
- Java 集合 ArrayList 需要知道的几个问题
问:Arraylist 的动态扩容机制是如何自动增加的?简单说说你理解的流程? 答:当在 ArrayList 中增加一个对象时 Java 会去检查 Arraylist 以确保已存在的数组中有足够的容量 ...
- java集合的扩容研究
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...
- 深入Java集合ArrayList的源码解析
现在由大恶人付有杰来从增删改查几个角度轻度解析ArrayList的源码 首先ArrayList的底层数据结构非常简单,就是一个数组. 从源码第115行我们可以得出信息,他的默认数组长度是10. /** ...
- Java 集合 —— ArrayList 分析
List 集合的特征: 有序 可以重复 可以随机访问(使用下标 添加,删除,访问) ArrayList 是 List 的实现类,所以 ArrayList 具有 List 的特征 ArrayList 是 ...
最新文章
- LVS(9)——为NAT单独增加路由器
- 【C语言重点难点精讲】C语言预处理
- 解决微信0day上线CobaltStike的几个问题
- 设计模式学习总结7 - 行为型2 - Command命令模式
- matlab怎么调出来的,如何调出MATLAB内部函数的源程序?
- 修改eclipse或者myeclipse的背景颜色(全部的背景颜色)
- 服装企业IT管理 应该这样当
- GfK十大洞见揭示物联网时代正全面开启
- 我的Delphi开发经验谈(本人修改版) 收藏
- 从数字艺术品到 NFT
- python操作selenium
- 华为freelace耳机修整详录
- matlab把句子分割成单词_将英语句子单个单词分割存储
- 分享程序员面试的7个技巧
- week9 day4 CSS网页布局
- Python的PIL库中的getpixel方法 putpixel方法
- 仿射密码解密(Affine Cipher)
- 10w 行级别数据的 Excel 导入,完整优化记录
- pip安装及matplotlib安装
- APFS分区容器扩容
热门文章
- iPhone收不到软件更新解决方法「苹果教程」
- 标准IO:fseek/rewind/ftell 文件IO:lseek
- 华为荣耀10是Android,华为、荣耀公布升级安卓10.0名单,来看看有没有你的机型吧...
- 上古卷轴5java8_【图片】【上古卷轴5】【无心】个人整合版8.0【霜刃伤情吧】_百度贴吧...
- Python 画雪花
- 不能选择相邻的食物(清雨这个名字取的挺好的哇)
- C#上传阿里云OSS工具类AliOSSTool
- vnc viewer 登陆进去后黑屏(解决办法)
- 清华这个宝塔的基座——“人文日新”一解
- 操作系统复习-2.3 进程同步