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的更多相关文章

  1. java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 Vector (向量)

    Vector  看JDK解释(中文翻译)吧: Vector 类可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.但是,Vector 的大小可以根据需要增大或缩小,以适应创建  ...

  2. java中基本类型封装对象所占内存的大小(转)

    这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...

  3. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  4. Java 中 try、catch、finally 语句块的执行顺序

    假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...

  5. SDUT OJ 数据结构上机测试1:顺序表的应用

    数据结构上机测试1:顺序表的应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  6. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  7. java中的集合/容器的数据结构

    最近双11在网上买了本 数据结构和算法--java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现 ...

  8. Java中如何使封装自己的类,建立并使用自己的类库?

    转自:http://blog.csdn.net/luoweifu/article/details/7281494 随着自己的编程经历的积累会发现往往自己在一些项目中写的类在别的项目中也会有多次用到.你 ...

  9. Java中的JDK动态代理

    所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...

随机推荐

  1. CentOS中配置SoftWareRaid磁盘冗余阵列

    (以vmware workstation为例) 1.关机添加一块硬盘 2.使用fdisk -l 可以看到 /dev/sdb硬盘设备 3.fdisk /dev/sdb配置磁盘分区,准备4个磁盘分区,用于 ...

  2. hdu5751 Eades

    今天热身考到FFT,完全忘光了,模板敲错了... 晚上温习下以前的题目 这题就是从最大值每次分割现在的区间,这样递归的区间最大值会更小,对于每种最大值都是卷积做 #include<bits/st ...

  3. Word巧用大纲视图 快速重排版面

    对于由于内容顺序混乱而造成的目录顺序不当的文章,通常我们一定会想到先对文档内容进行手工排序,然后重新提取目录.但这样操作显然麻烦,而且也容易出错.对于从正文内容自动提取出来的目录,由于按住Ctrl键单 ...

  4. Maven使用中央仓库下载慢的解决办法

    配置Maven仓库的方法 打开Maven配置文件Setting.xml,如下: vim /Users/yuanweipeng/.m2/settings.xml 在配置文件中添加如下配置: <mi ...

  5. jQuery拓展简易快速实现触摸效果

    1.js代码 //触摸开始事件,改变元素的样式 function touchstart(e) { $(this).removeClass("touchend").addClass( ...

  6. ThreadPoolExecutor线程池参数设置技巧

    一.ThreadPoolExecutor的重要参数   corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线 ...

  7. 【BZOJ4816】数字表格(莫比乌斯反演)

    [BZOJ4816]数字表格(莫比乌斯反演) 题面 BZOJ 求 \[\prod_{i=1}^n\prod_{j=1}^mf[gcd(i,j)]\] 题解 忽然不知道这个要怎么表示... 就写成这样吧 ...

  8. 【BZOJ3932】任务查询系统(主席树)

    [BZOJ3923]任务查询系统(主席树) 题面 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei ...

  9. [BZOJ1000] A+B Problem

    Description Calculate a+b Input Two integer a,b (0<=a,b<=10) Output Output a+b Sample Input 1 ...

  10. 设置mysql密码 Access denied 问题

    原文:http://www.upwqy.com/details/31.html 在Mac上安装完mysql以后 在终端执行 /usr/local/mysql/bin/mysql 可以直接进入.但是在设 ...