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动态代理
所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...
随机推荐
- Windows Developer Day Review
北京时间 3 月 8 日凌晨 1 点钟,今年的第一次 Windows Developer Day 正式召开. 因为时间太晚看不了直播,我也是第二天早上在公司看的重播.整个会议过程有很多值得去研究 ...
- 异常-----freemarker.core.ParseException: Encountered "string"
1.错误描述 freemarker.core.ParseException: Encountered "string" at line 21, column 21 in type. ...
- RobotFramework自动化测试框架的基础关键字(二)
1.1.1 如何快速查询某一个关键字的API说明 鼠标选中我们关键字,同时按住Ctrl+Alt键,即可出来该关键字的帮助API以及使用示例 1.1.2 如何快速补全关键字 ...
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- Bzoj4872: [Shoi2017]分手是祝愿
题面 Bzoj Sol 首先从大向小,能关就关显然是最优 然后 设\(f[i]\)表示剩下最优要按i个开关的期望步数,倒推过来就是 \[ f[i]=f[i-1]*i*inv[n]+f[i+1]*(n- ...
- [BZOJ1007] [HNOI2008] 水平可见直线 (凸包)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线:L1:y=x ...
- Zabbix 微信报警Python版(带监控项波动图片)
#!/usr/bin/python # -*- coding: UTF- -*- #Function: 微信报警python版(带波动图) #Environment: python import ur ...
- kubernetes Auto Install Guide
1.概念&架构 Kubernetes is an open-source system for automating deployment, scaling, and management o ...
- static与final的区别
final被修饰的变量为常量一旦赋值不能修改,被修改的方法为最终方法不能被重写,被修饰的类是最终类,不能被继承static被修饰的变量和方法,为该整个类及其类的对象所共享,一个类或对象修改了被定义的类 ...
- Java中的代理模式--静态代理和动态代理本质理解
代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...