分享知识-快乐自己:都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事
都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事
就用下面这段代码在jdk的三个版本运行看了下效果:
import java.lang.reflect.Field;
import java.util.ArrayList; public class ArrayListDemo { public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
Integer capacity = getCapacity(list1);// 获取容量
int size = list1.size();
System.out.println("list1的容量:" + capacity);
System.out.println("list1的大小:" + size);
System.out.println("----------------------------"); ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(1);
capacity = getCapacity(list2);// 获取容量,arraylist初始化容量是10
size = list2.size();
System.out.println("list2的容量:" + capacity);
System.out.println("list2的大小:" + size);
System.out.println("----------------------------"); ArrayList<Integer> list3 = new ArrayList<Integer>(); capacity = getCapacity(list3);// 获取容量,arraylist初始化容量是10
for (int i = 0; i < 10; i++) {
list3.add(i);
}
capacity = getCapacity(list3);
size = list3.size();
System.out.println("list3的容量:" + capacity);
System.out.println("list3的大小:" + size);
System.out.println("----------------------------"); ArrayList<Integer> list4 = new ArrayList<Integer>();
for (int i = 0; i < 11; i++) {
list4.add(i);
}
capacity = getCapacity(list4);// 获取容量
size = list4.size();
System.out.println("list4的容量:" + capacity);
System.out.println("list4的大小:" + size); } // 获取list容量
public static Integer getCapacity(ArrayList list) {
Integer length = null;
Class clazz = list.getClass();
Field field;
try {
field = clazz.getDeclaredField("elementData");
field.setAccessible(true);
Object[] object = (Object[]) field.get(list);
length = object.length;
return length;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return length;
}
}
jdk1.6:运行结果
list1的容量:10
list1的大小:0
----------------------------
list2的容量:10
list2的大小:1
----------------------------
list3的容量:10
list3的大小:10
----------------------------
list4的容量:16
list4的大小:11
部分源代码:
public void ensureCapacity(int var1) {
++this.modCount;
int var2 = this.elementData.length;
if (var1 > var2) {
Object[] var3 = this.elementData;
int var4 = var2 * 3 / 2 + 1;
if (var4 < var1) {
var4 = var1;
}
this.elementData = Arrays.copyOf(this.elementData, var4);
}
}
jdk1.7 :运行结果
list1的容量:0
list1的大小:0
----------------------------
list2的容量:10
list2的大小:1
----------------------------
list3的容量:10
list3的大小:10
----------------------------
list4的容量:15
list4的大小:11
部分源代码:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(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
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (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);
}
jdk1.8:运行结果
list1的容量:0
list1的大小:0
----------------------------
list2的容量:10
list2的大小:1
----------------------------
list3的容量:10
list3的大小:10
----------------------------
list4的容量:15
list4的大小:11
部分源码:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, 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
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (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);
}
总结:
发现不同jdk是不一样的,关于(1.5倍+1)出现在jdk1.6,其他1.7和1.8都是(1.5倍扩容)。
关于 详细代码和原理可以参考 3。参考1和2也是不错的!
参考 1: ArrayList扩容1.5倍
分享知识-快乐自己:都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事的更多相关文章
- 都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事
都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事 就用下面这段代码在jdk的三个版本运行看了下效果 import java.lang.reflect.Field; ...
- coding++:都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事
都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事 就用下面这段代码在jdk的三个版本运行看了下效果: import java.lang.reflect.Fiel ...
- ArrayList 扩容原理
面试中经常问到的问题之一就是List的扩容机制了,他是怎么做到扩容的,大家都能答出来底层是数组,复制一个数组来扩容,但是再具体一点来说,大家就不知道该怎么说了,如果不看源码说这么多确实就差不多了,但是 ...
- ArrayList扩容机制实探
ArrayList初始化 问题:执行以下代码后,这个list的列表大小(size)和容量(capacity)分别是多大? List<String> list = new ArrayList ...
- ArrayList扩容机制
一.先从 ArrayList 的构造函数说起 ArrayList有三种方式来初始化,构造方法源码如下: 1 /** 2 * 默认初始容量大小 3 */ 4 private static final i ...
- 你们都在用IntelliJ IDEA吗?或许你们需要看一下这篇博文
写在前面 以前一直用的elipce,如今入坑IntelliJ IDEA,没想到啊.深深的爱上了它,强大到无所不能: "工欲善其事必先利其器",IntelliJ IDEA作为一个非常 ...
- ArrayList扩容原理分析
1:代码解读和分析 1.1:构造方法分析 1: public ArrayList(int initialCapacity) { ) { this.elementData = new Object[in ...
- ArrayList 扩容 和 Vector
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[siz ...
- ArrayList扩容机制以及底层实现
简介 来源:博客园 作者:吾王彦 博客链接:https://www.cnblogs.com/qinjunlin/p/13724987.html ArrayList动态数组,是 java 中比较常 ...
随机推荐
- swiper插件简介及用法
swiper Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果.Swiper开源.免费.稳定. ...
- php5.4 的 php-fpm 的重启
php 5.3.3以后 源码中已经内嵌了 php-fpm,不用象以前的php版本一样专门打补丁了,只需要在configure的时候添加编译参数即可. 关于php-fpm的编译参数有 –enable-f ...
- SpringMVC 运行流程以及与Spring 整合
1. 运行流程 2. Spring 和 SpringMVC 整合 // 1. 导入 jar 包 // 2. 配置 web.xml <!-- 配置 Spring 的核心监听器 --> < ...
- Java 之 Servlet
JavaWeb 三大组件: Servlet, Filter, Listener. Servlet 的作用是处理请求,服务器会把接收到的请求交给 Servlet 来处理.在 Servlet 中通常需要: ...
- Python 一键同步windows和linux数据(基于pscp.exe)
outline 项目中需要把 windows server 上的数据同步到 linux server,方法很多,这里记录下自己采用的一种比较简单的方法. 准备工作 首先确保你 windows serv ...
- 解决跨域HttpResponseJsonCORS, HttpResponseCORS 返回字典数据
#!/usr/bin/python # -*- coding: UTF-8 -*- import json from django.http import HttpResponse def HttpR ...
- swift 值得学习的项目
http://www.php100.com/html/it/biancheng/2015/0112/8329.html
- 用Android NDK编译FFmpeg
附(2018-01-06): 有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见: https://github.com/writing ...
- python代码编辑器PyCharm快捷键补充
个人觉得特别有用的: 替换:Ctrl+R 删除当前行 CTRY Y: 复制当前行:Ctrl+D ALT F7: 查找哪些地方使用了选中的方法. ALT UP: 移到上一个方法 ALT DOWN: 移到 ...
- 关于shared pool的深入探讨(二)【转载】
关于shared pool的深入探讨(二) 作者:eygle |English [转载时请标明出处和作者信息]|[恩墨学院 OCM培训传DBA成功之道]链接:http://www.eygle.co ...