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 .复制的数组长度
相关推荐
适用人群:JavaSE初学者,对源码感兴趣的,想要深度了解ArrayList底层实现、数据结构、add方法、Remove方法、以及自动扩容机制的同学,并且对ArrayList已经有过使用,想要学习它与LinkedList,Vector等的区别,该...
本文章主要讲解ArrayList集合添加和集合扩容,其他方法都相对简单,读懂这个后相信你翻翻源码即可读懂其他方法原理,下面讲解源码的可能会有点枯燥,请着重去了解集合添加和扩容的一个流程 构造方法 我们来看源码...
本文主要介绍了ArrayList的自动扩充机制,由一个题目切入主题,逐步向大家展示了ArrayList的相关内容,具有一定参考价值,需要的朋友可以了解下。
项目描述 ...request是负责页面之间传递参数和数据的类,是java封装好的,你只要把它当成一个工具就可以了,就好比你用遥控器控制电视,你并不需要详细了解遥控器的工作原理。所以不用配置mysql。
但是,不需要自己实现,并不代表什么都不需要了解。 如果不知道这些类库背后的原理,不懂得时间、空间复杂度分析,你如何能用好、用对它们?存储某个业务数据的时候,你如何知道应该用ArrayList,还是Linked List呢...
java基础 1、Arrays.sort实现原理和Collections.sort实现原理。 答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSort实现的。TimSort算法就是找到已经排好序数据的子序列,...arraylist和linke
今天对集合和集合的一些方法做了整理,以及迭代器的使用,一直以来泛型的使用对我来说都是难点,今天终于突破了,最后对数据结构做了一些简单的介绍,但对于java来说,数据结构显得不那么重要(了解原理即可)。...
Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap, TreeMap这一类的。以下简单模拟一个数据结构的连环炮。 比如,面试官先问你HashMap是不是有序的? 你肯定回答说,不是有序的。那面试官就会...
5、手写单例模式中的懒汉双重锁代码6、LaunchMode及其使用场景7、请手写一个冒泡排序8、Activity的启动过程9、请大概说一下你了解的Service10、说一下你了解的广播11、请说一下内容提供者12、Handler原理13、OKHttp...
方法和上一篇自定义ListView实现拖拽ListItem项交换位置一个原理。只是在交换位置上记录了X轴的相关坐标,计算了X轴的相关变量。实现效果图如下 说明: 本篇给出实现代码,但是不做任何说明。如需了解请看上一篇blog...
如果要深 入了解泛型编程,请查阅相关资料。 习 题 上机实践 1.将本学期开设的课程名称加入到 HashSet 中,并使用迭代器遍历输出。 2.调试书本上 TreeSet 的例子,理解其原理。 3.完成以下实验: (1)定义一个...
10、string 转换成 integer的方式及原理 11-20题: 11、哪些情况下的对象会被垃圾回收机制处理掉? 12、静态代理和动态代理的区别,什么场景使用? 14、Java中实现多态的机制是什么? 16、说说你对Java反射的...
02 Java 简介:变量、方法、类03 第一个程序:键盘输入,在IDE中工作04 引入分支和循环05 介绍类:编写自己的类、构造函数06 认识对象:编写自己的对象、生命周期、静态变量07 数组和列表:数组,ArrayList。 了解...
Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...
需要了解其实现原理,还要灵活运用,如:自己实现 LinkedList、两个栈实现一个队列,数组实现栈,队列实现栈等。 内存模型 垃圾回收算法(JVM) 类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要) ...
4.谈谈常用容器类的原理和应用场景 面试 1.一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法 金山一面(Android开发) 1.arraylist与vector的区别 2.优化view 3....
在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C#...
第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目...
第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目...
第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目...