• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > ArrayList详解和使用示例_动力节点Java学院整理

ArrayList详解和使用示例_动力节点Java学院整理

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了arraylist详解,arraylist,arraylist的用法,java arraylist,java arraylist用法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

第1部分 ArrayList介绍

ArrayList简介

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。

ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。稍后,我们会比较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。

ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。

ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。 

ArrayList构造函数 

// 默认构造函数
ArrayList()
// capacity是ArrayList的默认容量大小。当由于增加数据导致容量不足时,容量会添加上一次容量大小的一半。
ArrayList(int capacity)
// 创建一个包含collection的ArrayList
ArrayList(Collection<? extends E> collection) 
</div>

ArrayList的API 

// Collection中定义的API
boolean    add(E object)
boolean    addAll(Collection<? extends E> collection)
void    clear()
boolean    contains(Object object)
boolean    containsAll(Collection<?> collection)
boolean    equals(Object object)
int     hashCode()
boolean    isEmpty()
Iterator<E>   iterator()
boolean    remove(Object object)
boolean    removeAll(Collection<?> collection)
boolean    retainAll(Collection<?> collection)
int     size()
<T> T[]    toArray(T[] array)
Object[]   toArray()
// AbstractCollection中定义的API
void    add(int location, E object)
boolean    addAll(int location, Collection<? extends E> collection)
E     get(int location)
int     indexOf(Object object)
int     lastIndexOf(Object object)
ListIterator<E>  listIterator(int location)
ListIterator<E>  listIterator()
E     remove(int location)
E     set(int location, E object)
List<E>    subList(int start, int end)
// ArrayList新增的API
Object    clone()
void     ensureCapacity(int minimumCapacity)
void     trimToSize()
void     removeRange(int fromIndex, int toIndex)
</div>

第2部分 ArrayList数据结构

ArrayList的继承关系

java.lang.Object
  java.util.AbstractCollection<E>
  java.util.AbstractList<E>
    java.util.ArrayList<E>
public class ArrayList<E> extends AbstractList<E>
  implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}

</div>

ArrayList与Collection关系如下图:

ArrayList包含了两个重要的对象:elementData 和 size。

(1) elementData 是"Object[]类型的数组",它保存了添加到ArrayList中的元素。实际上,elementData是个动态数组,我们能通过构造函数 ArrayList(int initialCapacity)来执行它的初始容量为initialCapacity;如果通过不含参数的构造函数ArrayList()来创建ArrayList,则elementData的容量默认是10。elementData数组的大小会根据ArrayList容量的增长而动态的增长,具体的增长方式,请参考源码分析中的ensureCapacity()函数。

(2) size 则是动态数组的实际大小。 

第3部分 ArrayList源码解析(基于JDK1.6.0_45)

为了更了解ArrayList的原理,下面对ArrayList源码代码作出分析。ArrayList是通过数组实现的,源码比较容易理解。   

package java.util;
 public class ArrayList<E> extends AbstractList<E>
   implements List<E>, RandomAccess, Cloneable, java.io.Serializable
 {
  // 序列版本号
  private static final long serialVersionUID = 8683452581122892189L;
  // 保存ArrayList中数据的数组
  private transient Object[] elementData;
  // ArrayList中实际数据的数量
  private int size;
  // ArrayList带容量大小的构造函数。
  public ArrayList(int initialCapacity) {
   super();
   if (initialCapacity < 0)
    throw new IllegalArgumentException("Illegal Capacity: "+
             initialCapacity);
   // 新建一个数组
   this.elementData = new Object[initialCapacity];
  }
 
  // ArrayList构造函数。默认容量是10。
  public ArrayList() {
   this();
  }
  // 创建一个包含collection的ArrayList
  public ArrayList(Collection<? extends E> c) {
   elementData = c.toArray();
   size = elementData.length;
   // c.toArray might (incorrectly) not return Object[] (see 6260652)
   if (elementData.getClass() != Object[].class)
    elementData = Arrays.copyOf(elementData, size, Object[].class);
  }
  // 将当前容量值设为 =实际元素个数
  public void trimToSize() {
   modCount++;
   int oldCapacity = elementData.length;
   if (size < oldCapacity) {
    elementData = Arrays.copyOf(elementData, size);
   }
  }
  // 确定ArrarList的容量。
  // 若ArrayList的容量不足以容纳当前的全部元素,设置 新的容量=“(原始容量x3)/2 + 1”
  public void ensureCapacity(int minCapacity) {
  // 将“修改统计数”+1
   modCount++;
   int oldCapacity = elementData.length;
   // 若当前容量不足以容纳当前的元素个数,设置 新的容量=“(原始容量x3)/2 + 1”
   if (minCapacity > oldCapacity) {
    Object oldData[] = elementData;
    int newCapacity = (oldCapacity * 3)/2 + 1;
    if (newCapacity < minCapacity)
     newCapacity = minCapacity;
    elementData = Arrays.copyOf(elementData, newCapacity);
   }
  }
  // 添加元素e
  public boolean add(E e) {
   // 确定ArrayList的容量大小
   ensureCapacity(size + ); // Increments modCount!!
   // 添加e到ArrayList中
   elementData[size++] = e;
   return true;
  }
  // 返回ArrayList的实际大小
  public int size() {
   return size;
  }
  // 返回ArrayList是否包含Object(o)
  public boolean contains(Object o) {
   return indexOf(o) >= 0;
  }
  // 返回ArrayList是否为空
  public boolean isEmpty() {
   return size == 0;
  }
  // 正向查找,返回元素的索引值
  public int indexOf(Object o) {
   if (o == null) {
    for (int i = 0; i < size; i++)
    if (elementData[i]==null)
     return i;
    } else {
     for (int i = 0; i < size; i++)
     if (o.equals(elementData[i]))
     return i;
   }
   return -1;
   }
  // 反向查找,返回元素的索引值
   public int lastIndexOf(Object o) {
   if (o == null) {
   for (int i = size-1; i >= 0; i--)
   if (elementData[i]==null)
     return i;
   } else {
   for (int i = size-1; i >= 0; i--)
   if (o.equals(elementData[i]))
    return i;
   }
   return -1;
  }
  // 反向查找(从数组末尾向开始查找),返回元素(o)的索引值
  public int lastIndexOf(Object o) {
   if (o == null) {
    for (int i = size-1; i >= 0; i--)
    if (elementData[i]==null)
     return i;
   } else {
   for (int i = size-1; i >= 0; i--)
    if (o.equals(elementData[i]))
     return i;
   }
  return -1;
  }
  // 返回ArrayList的Object数组
  public Object[] toArray() {
   return Arrays.copyOf(elementData, size);
  }
  // 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型
  public <T> T[] toArray(T[] a) {
   // 若数组a的大小 < ArrayList的元素个数;
   // 则新建一个T[]数组,数组大小是“ArrayList的元素个数”,并将“ArrayList”全部拷贝到新数组中
   if (a.length < size)
 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ArrayList详解和使用示例_动力节点Java学院整理
  • ArrayList详解和使用示例_动力节点Java学院整理

相关文章

  • 2017-05-28Java压缩解压zip技术_动力节点Java学院整理
  • 2017-05-28详解Java动态加载数据库驱动
  • 2017-05-28让Java程序自动重启的实现方法(推荐)
  • 2017-05-28java连接Access数据库的方法
  • 2017-05-28Java 数组分析及简单实例
  • 2017-08-30java 实现对List做二分查找(支持泛型)
  • 2017-05-28SpringBoot拦截器的使用小结
  • 2017-05-28深入理解hibernate的三种状态
  • 2017-05-28Java Map 在put值时value值不被覆盖的解决办法
  • 2017-05-28详解SpringBoot配置devtools实现热部署

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Java IO流 文件的编码实例代码
    • java springmvc乱码解决归纳整理详解
    • java Future 接口使用方法详解
    • Spring mvc整合mybatis(crud+分页插件)操作mysql
    • 详解Http请求中Content-Type讲解以及在Spring MVC中的应用
    • Java多线程并发编程(互斥锁Reentrant Lock)
    • 利用Spring boot如何创建简单的web交互应用
    • Java缓存池代码实例详解
    • 通过Session案例分析一次性验证码登录
    • java 中HttpClient传输xml字符串实例详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有