java 中的JDK封装的数据结构和算法解析(集合类)----顺序表 List 之 ArrayList
1. 数据结构之List (java:接口)【由于是分析原理,这里多用截图说明】
List是集合类中的容器之一,其定义如下:(无序可重复)
An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element iinserted. The user can access elements by their integer index (position in the list), and search for elements in the list.(一个有序集合(也称为序列)。用户界面精确控制列表中每个元素的位置插入。用户可以访问元素的整数索引(位置列表),搜索列 表中的元素。)
继承关系:public interface List<E> extends Collection<E> ---无序可重复的容器。
public interface Collection<E> extends Iterable<E> ---Collection是list和set的顶级接口,也是容器的意思。
collection 英文释义:征收; 收集,采集; 收藏品; 募捐;
public interface Iterable<T> ---Iterable 说明该实现容器可以被迭代。
下是list接口的方法



其中的List接口定义了元素的添加(add)和获取(get)方式以及集合被迭代(Iterable 可迭代接口),并没有说明集合的容器的实现方式,下面讲述分别List的实现类 ArrayList(用数组实现的list)和LinkedList(用链表实现的list)。
List的动态数组实现方式--- ArrayList
JDK对Arraylist的解释:Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, includingnul. In addition to implementing the List interface,this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)Array实现列表的接口。实现了 所有可选列表操作,并允许所有元素,包括 空字符。除了实现列表接口, 这个类提供了一些方法来操作数组的大小内部使用存储列表。(这类相当于Vector,除了它是同步的)。
下面是RandomAccess

其中:RandomAccess 是随机存取的意思:

上面数百度贴吧的某哥们的解释,我觉得挺对。由此可见随机存取速度很快,高效。

解析其中类的数据结构:Object[] EMPTY_ELEMENTDATA--- 对象数组
Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA---对象数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA--也是一个空的对象数组,数组为空默认使用次对象,区别下次添加元素增加元素的个数。
Object[] elementData---真正的数组元素存放在此,构造时初始化。
三个成员函数分别对应三个ArrayList的构造函数
Object[] EMPTY_ELEMENTDATA 对应构造方法: public ArrayList(int initialCapacity) {},当给定参数的initialCapacity等于0时elementData等价于EMPTY_ELEMENTDATA。
Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA对应构造方法:应 public ArrayList() {},无参时elementData等价于DEFAULTCAPACITY_EMPTY_ELEMENTDATA。
ArrayList原理:数据的添加:
每次add(T e) 添加元素是,都会检查数组是否够用,如果不够用动态进行添加。

ensureCapacityInternal () 方法中判断增长后的数据长度是否大于当前数组的长度,如果大于,则进行递增:下图截图

grow()方法是增长数据,其实现方法如下:

可以看到java中数组最大值是int 的最大值,可以点源码hugeCapacity()查看。上图中的数组最终他由系统生成一个新的数组且将原来的数据拷贝到新数组。最终看到数组拷贝是Native修饰的,说明了这个方法是的本地实现,其可以保证速度大于new一个新数组。
数据的遍历:
数据的遍历用到一个内部类来解决:如下图

由于内部类可以访问到类的所有信息,而且private修饰不可以被外部访问到,可以说是正真体现了封装的特新。cursor代表当前的指针,如果发现当先指针等于数组的大小size怎返回没有下一个数组元素的boolean值false。
最后对get方法说明:

get方法是直接拿到数组的第index个元素,说明其效率高。最后这个get方法没有看到同步的关键字synchronized修饰,可见此方法不支持多线程。
总结:
ArrayList是基于数组实现的List,其构造构造形式保持了默认的数组元素的个数,当动态添加元素的时候可以对数组进行动态的扩容(其实是重新生成一个比之前容量大的新数组,然后将就数组的数组元素的值重新copy到新数组)。而且数组的重新生成是用了system.copyArray()的本地函数,保证了其高效。对于数组的遍历其用内部类来实现,主要用到当前指针这个变量来判断是否有下一个元素。最后强调一点:ArrayList是线程不安全的,这或许一定程度上可以加快程序的执行。
java 中的JDK封装的数据结构和算法解析(集合类)----顺序表 List 之 ArrayList的更多相关文章
- java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 Vector (向量)
Vector 看JDK解释(中文翻译)吧: Vector 类可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.但是,Vector 的大小可以根据需要增大或缩小,以适应创建 ...
- java中基本类型封装对象所占内存的大小(转)
这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- Java 中 try、catch、finally 语句块的执行顺序
假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...
- SDUT OJ 数据结构上机测试1:顺序表的应用
数据结构上机测试1:顺序表的应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- java中的集合/容器的数据结构
最近双11在网上买了本 数据结构和算法--java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现 ...
- Java中如何使封装自己的类,建立并使用自己的类库?
转自:http://blog.csdn.net/luoweifu/article/details/7281494 随着自己的编程经历的积累会发现往往自己在一些项目中写的类在别的项目中也会有多次用到.你 ...
- Java中的JDK动态代理
所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...
随机推荐
- iOS - XMPP Openfire 服务器的搭建
前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: jdk-8u91-macosx-x64.dmg mysql-5.7 ...
- MyISAM和InnoDB索引实现区别
首先来讲MyISAM: MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是 ...
- 关于protected关键字
protected,算是默认的访问作用域的超集,他们在相同包下时,都可以访问所声明的成员:但对于不同包的访问,默认访问域就不行,protected也必须是通过继承关系来访问. TestBase bas ...
- CSS3 2D、3D转换
2D转换方法:transform().rotate().scale().skew().matrix() 3D转换方法:rotateX().rotateY() 1.示例代码 <!DOCTYPE h ...
- 【POJ3683】Priest John's Busiest Day
题目 John is the only priest in his town. September 1st is the John's busiest day in a year because th ...
- jQuery 事件代理时的this
在jQuery使用on方法进行事件代理的时候,this是有多种变化的.下面开始对其进行研究 HTML的代码: <ul id="selected-plays" class=&q ...
- python之hasattr()、 getattr() 、setattr() 函数
这三个方法可以实现反射和内省机制,在实际项目中很常用,功能也很强大. [转]http://www.cnblogs.com/cenyu/p/5713686.html hasattr(object, na ...
- 使用Python解析豆瓣上Json格式数据
现在的API接口多为xml或json,json解析更简洁相对xml来说 以豆瓣的API接口为例,解析返回的json数据: https://api.douban.com/v2/book/1220562 ...
- 快速了解react
概况: 通过本篇文章你可以对react的重点有个整体的认识. 关于react是什么,优点,解决什么问题等,网上一大推就不啰嗦了. 了解虚拟DOM的实现,参考这篇文章 [虚拟DOM](https://w ...
- NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告
前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...