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动态代理
所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...
随机推荐
- iBatis基础知识
iBatis简介: 特点:结构性好,小巧,容易上手 搭建环境: 1.创建java 项目 2.导入(3个)jar包:ibatis-2.3.0.667.jar,mysql驱动包,Junit测试包 3.配置 ...
- 生成report由Eamil定時寄出
Blat 是一个命令行发邮件的小工具,仅支持简单的SMTP协议,需要SMTP服务器的支持. 官网:http://www.blat.net/ 下载地址:https://sourceforge.ne ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
- [Luogu2991][USACO10OPEN]水滑梯Water Slides
题面戳我 题面描述 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建一个水上乐园.当然,它最大的亮点就是新奇巨大的水上冲浪. 超级轨道包含 E (1 <= E &l ...
- Bzoj4817:[SDOI2017]树点涂色
题面 Bzoj Sol 做个转化 最开始都是虚边 操作\(1\)就是\(LCT\)里的\(Access\)操作 求的就是路径上虚边的个数+1 然后就好办了 用树链剖分+线段树来维护每个点到根虚边的个数 ...
- USACO08MAR Land Acquisition
斜率优化 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <s ...
- JavaScript中的私有成员[翻译]
原作者:Douglas Crockford,原文地址:http://www.crockford.com/javascript/private.html JavaScript 是世界上被误解最深的编程语 ...
- Xamarin改变移动开发的五个理由
企业开发者不能简单的抛弃现有的桌面和Web应用,然而又不得不忙着创建各种各样的应用,没有太多的预算来开发移动版本,尤其是原生版本. 采用Xamarin,C#开发人员可以使用一份基础代码创建桌面版和移动 ...
- centos7 升级 git(2.14.3) 版本
下载 wget https://www.kernel.org/pub/software/scm/git/git-2.14.3.tar.gz 安装依赖包 yum install curl-devel ...
- Cucumber 行为驱动开发简介
Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. 现在看看Cucumber中用到的术语 . ...