`
wenjinglian
  • 浏览: 806113 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

了解ArrayList原理

阅读更多

1.ArrayList 介绍

有序集合,按顺序存储元素

非线程安全

底层实现:底层采用数组实现,就是一个自动扩展的动态数组,

初始大小:集合的初始化大小10

容量扩张:(原始大小 * 3)/2 + 1  = 50% + 1

 

2.与其他集合对比

与Vector 对比

 Vector 是线程安全的

与LinkedList 对比

 LinkedList 以链表形式存储,每个元素都保存了前一个元素和后一个元素的地址

 ArrayList  add,remove操作比LinkedList慢,ArrayList需要进行移位操作,LinkedList只需要改变当前元素前后地址

 ArrayList get,set 操作比LinkedList快,ArrayList只需要通过下标定位元素,LinkedList需要遍历整个链表 

 

3.源码分析 

 

ArrayList 

private transient Object[] elementData;  // 实际采用Object数组

public ArrayList() {
    //初始化容量大小10
	this(10);
    }

// 获取元素
public E get(int index) {
	RangeCheck(index); //检查下标是否越界
	return (E) elementData[index]; //下标获取
    }
//重新指定下元素
 public E set(int index, E element) {
	RangeCheck(index);

	E oldValue = (E) elementData[index];
	elementData[index] = element;
	return oldValue;
    }

//添加操作
public boolean add(E e) {
	ensureCapacity(size + 1);  // Increments modCount!! 容量自动扩张
	elementData[size++] = e;
	return true;
    }

//删除操作
 public E remove(int index) {
	RangeCheck(index);

	modCount++;
	E oldValue = (E) elementData[index];

	int numMoved = size - index - 1;
	if (numMoved > 0)
	    System.arraycopy(elementData, index+1, elementData, index,
			     numMoved); //删除元素后面的元素往前移,元素有移位操作,消耗性能
	elementData[--size] = null; // Let gc do its work  清空最后的位置,让垃圾回收

	return oldValue; //返回当前删除的元素
    }

//自动容量扩张
public void ensureCapacity(int minCapacity) {
	modCount++;  //记录当前集合的操作次数,用于判断当前是否有并发操作
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1; // 扩大 (原始大小 * 3)/2 + 1 = 50% + 1
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity); // 创建新数组大小将原来的数组复制到新的数组当中,数组元素越多性能消耗
	}
    }
数组copy方法:public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length) 
参数:src 原始数组.srcPos 原始数组开始下标.dest 目标数组下标.destPos 目标数组下开始下标.length .复制的数组长度

 

4.优化

尽可能的在初始化的时候设定大小,避免容量扩张

public void ensureCapacity(int minCapacity) // 只有在容量不够的情况下才扩张
{
  ...
if (minCapacity > oldCapacity) {
    //扩张
}
}

新增和删除操作比较频繁可以使用LinkedList

 

 

 

 

分享到:
评论

相关推荐

    Java中的ArrayList的底层源码解读、LinkedList、Vector的区别介绍

    适用人群:JavaSE初学者,对源码感兴趣的,想要深度了解ArrayList底层实现、数据结构、add方法、Remove方法、以及自动扩容机制的同学,并且对ArrayList已经有过使用,想要学习它与LinkedList,Vector等的区别,该...

    ArrayList 深入理解底层

    本文章主要讲解ArrayList集合添加和集合扩容,其他方法都相对简单,读懂这个后相信你翻翻源码即可读懂其他方法原理,下面讲解源码的可能会有点枯燥,请着重去了解集合添加和扩容的一个流程 构造方法 我们来看源码...

    ArrayList的自动扩充机制实例解析

    本文主要介绍了ArrayList的自动扩充机制,由一个题目切入主题,逐步向大家展示了ArrayList的相关内容,具有一定参考价值,需要的朋友可以了解下。

    jsp+servlet开发java web图书后台管理系统

    项目描述 ...request是负责页面之间传递参数和数据的类,是java封装好的,你只要把它当成一个工具就可以了,就好比你用遥控器控制电视,你并不需要详细了解遥控器的工作原理。所以不用配置mysql。

    数据结构与算法.zip

    但是,不需要自己实现,并不代表什么都不需要了解。 如果不知道这些类库背后的原理,不懂得时间、空间复杂度分析,你如何能用好、用对它们?存储某个业务数据的时候,你如何知道应该用ArrayList,还是Linked List呢...

    java-server-interview-questions:java服务端面试题整理

    java基础 1、Arrays.sort实现原理和Collections.sort实现原理。 答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSort实现的。TimSort算法就是找到已经排好序数据的子序列,...arraylist和linke

    Collection集合及其方法,迭代器,泛型和数据结构(2020.05.09)

    今天对集合和集合的一些方法做了整理,以及迭代器的使用,一直以来泛型的使用对我来说都是难点,今天终于突破了,最后对数据结构做了一些简单的介绍,但对于java来说,数据结构显得不那么重要(了解原理即可)。...

    阿里面试经历感想回顾总结

    Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap, TreeMap这一类的。以下简单模拟一个数据结构的连环炮。 比如,面试官先问你HashMap是不是有序的? 你肯定回答说,不是有序的。那面试官就会...

    android-7 面试知识点

    5、手写单例模式中的懒汉双重锁代码6、LaunchMode及其使用场景7、请手写一个冒泡排序8、Activity的启动过程9、请大概说一下你了解的Service10、说一下你了解的广播11、请说一下内容提供者12、Handler原理13、OKHttp...

    自定义GridView并且实现拖拽(附源码)

    方法和上一篇自定义ListView实现拖拽ListItem项交换位置一个原理。只是在交换位置上记录了X轴的相关坐标,计算了X轴的相关变量。实现效果图如下 说明: 本篇给出实现代码,但是不做任何说明。如需了解请看上一篇blog...

    习----题-Java-Web程序设计教程-[共2页].pdf

    如果要深 入了解泛型编程,请查阅相关资料。 习 题 上机实践 1.将本学期开设的课程名称加入到 HashSet 中,并使用迭代器遍历输出。 2.调试书本上 TreeSet 的例子,理解其原理。 3.完成以下实验: (1)定义一个...

    Java面试题.docx

    10、string 转换成 integer的方式及原理 11-20题: 11、哪些情况下的对象会被垃圾回收机制处理掉? 12、静态代理和动态代理的区别,什么场景使用? 14、Java中实现多态的机制是什么? 16、说说你对Java反射的...

    JavaRushHomeWork:我的课程任务 javarush.ru

    02 Java 简介:变量、方法、类03 第一个程序:键盘输入,在IDE中工作04 引入分支和循环05 介绍类:编写自己的类、构造函数06 认识对象:编写自己的对象、生命周期、静态变量07 数组和列表:数组,ArrayList。 了解...

    Java服务器端开发面试.doc

    Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...

    leetcode下载-Note:我的笔记

    需要了解其实现原理,还要灵活运用,如:自己实现 LinkedList、两个栈实现一个队列,数组实现栈,队列实现栈等。 内存模型 垃圾回收算法(JVM) 类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要) ...

    高级java笔试题-interview:采访记录

    4.谈谈常用容器类的原理和应用场景 面试 1.一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法 金山一面(Android开发) 1.arraylist与vector的区别 2.优化view 3....

    asp.net知识库

    在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C#...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目...

Global site tag (gtag.js) - Google Analytics