`
kakajw
  • 浏览: 265361 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 的 ArrayList 的底层数据结构

 
阅读更多

 

1. 数据结构--ArrayList源码摘要

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    ......

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer.
     */
    private transient E[] elementData;


    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;
   ......
}

 

 

 

ArrayList 的底层最重要的两个属性:Object 数组和 size 属性。

 

 

2. ArrayList 的底层数组的调整

add方法--ArrayList源码摘要

    public boolean add(E o) {
	ensureCapacity(size + 1);  // Increments modCount!!
	elementData[size++] = o;
	return true;
    }

 

 

ensureCapacity方法--ArrayList源码摘要

    public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1;
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
	    elementData = (E[])new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }

 

 

2点结论:

  a. ArrayList 是通过将底层 Object 数组复制的方式(System.arraycopy方法)来处理数组的增长;

  b. 当ArrayList 的容量不足时,其扩充容量的方式:先将容量扩充至当前容量的1.5倍,若还不够,则将容量扩充至当前需要的数量。

(见代码: int newCapacity = (oldCapacity * 3)/2 + 1;

          if (newCapacity < minCapacity)
           newCapacity = minCapacity;

)

 

 

顺便看看 remove 方法

remove 方法--ArrayList源码摘要

    public boolean remove(Object o) {
	if (o == null) {
            for (int index = 0; index < size; index++)
		if (elementData[index] == null) {
		    fastRemove(index);
		    return true;
		}
	} else {
	    for (int index = 0; index < size; index++)
		if (o.equals(elementData[index])) {
		    fastRemove(index);
		    return true;
		}
        }
	return false;
    }

 

 

fastRemove 方法--ArrayList源码摘要

    private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index, 
                             numMoved);
        elementData[--size] = null; // Let gc do its work
    }

 

 

private void fastRemove(int index) 可见,ArrayList 的元素移除后,也是通过 Object 数组复制的方式(System.arraycopy方法)来处理数组的变化; size 总是记录着当前的数组元素的数量。

 

 

这也就解释了 ArrayList 的特点:增加、删除和移动元素的效率低(数组复制过程消耗资源较多); 而查找元素和更新元素的效率高。(如下所示)

 

get 方法--ArrayList 源码摘要

    public E get(int index) {
	RangeCheck(index);

	return elementData[index];
    }

 

 

set 方法--ArrayList 源码摘要

    public E set(int index, E element) {
	RangeCheck(index);

	E oldValue = elementData[index];
	elementData[index] = element;
	return oldValue;
    }

 

 

 

3. ArrayListVector的区别

 

1 vector 是线程同步的,所以它也是线程安全的,而arraylist 是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用 arraylist效率比较高。

 

2如果集合中的元素的数目大于目前集合数组的长度时,vector 增长率为目前数组长度的100%, arraylist 增长率为目前数组长度的50% .如果在集合中使用数据量比较大的数据,用vector有一定的优势。

 

3如果查找一个指定位置的数据vectorarraylist使用的时间是相同的,都是O(1) ,这个时候使用vectorarraylist都可以。

 

而如果移动一个指定位置的数据花费的时间为O(n-i)n为总长度,这个时候就应该考虑到使用linklist ,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。

分享到:
评论

相关推荐

    java数据结构 ArrayList、Stack、Map

    在Java编程语言中,数据结构是组织和存储数据的关键元素,它们提供了高效访问和操作数据的方式。本主题将深入探讨ArrayList、Stack和Map这三种重要数据结构,它们各自具有独特的特性和用途。 **ArrayList** 是Java...

    免费:数据结构(c与c++与java三本书高清晰版).rar

    JAVA版的《数据结构》则可能强调Java平台特有的数据结构实现,如集合框架(Collection Framework),其中包括接口(如List、Set和Queue)和实现(如ArrayList、LinkedList、HashSet、TreeSet等)。Java的这些数据...

    模拟java ArrayList Iterator

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,它是一个动态数组,可以存储任意类型的对象。ArrayList提供了一种高效的方式来管理大量的元素,并且提供了迭代器(Iterator)来遍历这些元素,使得我们...

    数据结构 课件java版本

    在Java中,TreeSet和TreeMap使用了红黑树作为底层数据结构,提供了高效的查找、插入和删除操作。 7. **图**:由顶点和边构成,用于表示对象之间的关系。Java中没有内置的图数据结构,但可以通过自定义类或者使用...

    Java版本数据结构实验报告

    在本实验报告中,我们将深入探讨Java编程语言中的核心数据结构。数据结构是计算机科学的基础,它涉及到如何高效地组织和存储数据,以便于访问和处理。Java版本的数据结构实验旨在帮助学生理解并掌握这些概念,并能...

    数据结构C和java

    Java作为面向对象的语言,提供了丰富的内置数据结构,如ArrayList、LinkedList、Stack、Queue等,这些都是对原始数据结构的封装,使用起来更加方便。Java的ArrayList实现了动态数组,支持快速随机访问;LinkedList是...

    数据结构java版(第2版)

    在Java中,`java.util`包提供了许多内置数据结构类,如ArrayList、LinkedList、Stack、Queue等,这些可以直接使用,但理解它们的底层实现原理对于优化代码性能至关重要。例如,ArrayList基于动态数组实现,适合随机...

    ArrayList的底层原理Java系列2021.pdf

    在进行Java开发过程中,ArrayList是一个我们非常常见的集合类型,被广泛用于存储和操作数据的场景。...通过对ArrayList底层原理的理解,开发者可以更加合理地使用这一数据结构,以应对不同的应用场景。

    深入Java集合ArrayList的源码解析

    ArrayList作为Java集合框架中的重要成员,其底层数据结构和操作方式对于理解Java编程至关重要。这篇文章将从ArrayList的基本属性、构造方法、增删改查的操作以及扩容机制等方面进行深入解析。 首先,ArrayList的...

    Java中的ArrayList的底层源码解读、LinkedList、Vector的区别介绍

    适用人群:JavaSE初学者,对源码感兴趣的,想要深度了解ArrayList底层实现、数据结构、add方法、Remove方法、以及自动扩容机制的同学,并且对ArrayList已经有过使用,想要学习它与LinkedList,Vector等的区别,该...

    Java程序设计与数据结构第六章习题答案

    在Java程序设计与数据结构的学习过程中,第六章通常会涵盖数据结构的重要概念和应用,以及如何用Java语言来实现它们。这一章的内容可能包括数组、链表、栈、队列、树、图等基础数据结构,也可能涉及排序和查找算法。...

    ArrayList底层.pdf

    综上所述,`ArrayList`在Java中是一个非常实用且高效的数据结构。通过上述分析可以看出,`ArrayList`的设计充分考虑了性能和灵活性,在保证线性时间复杂度的基础上,提供了丰富的功能和良好的扩展性。

    java数据结构源代码

    本资源“java数据结构源代码”聚焦于用Java实现的数据结构,包括树、排序、查找以及容器等核心概念。下面将对这些知识点进行详细的解读。 首先,**树数据结构**是计算机科学中非常重要的一种非线性结构,它由节点...

    源码解析jdk7.0集合:ArrayList的底层实现原理.pdf

    其底层数据结构是数组,因此每个 ArrayList 实例都具有一个容量,用于表示底层数组的长度,默认初始容量是 10。随着数据的增加,当数组容量不足以存储更多元素时,ArrayList 会进行扩容操作,即创建一个新的更大的...

    java中ArrayList 、LinkList区别.doc

    在Java编程语言中,ArrayList和LinkedList都是集合框架中两种重要的数据结构,它们分别基于不同的底层实现,具有不同的特性和性能特点。以下是对这两个类的详细分析: 1. **ArrayList 实现**: - ArrayList 实现了...

    笔面试常考算法—数据结构篇(java版)

    Java中的TreeSet和TreeMap使用了红黑树作为底层数据结构。 4. **图**:图是由节点(顶点)和边组成的非线性结构,用于表示对象之间的关系。图可以是无向的,也可以是有向的;可以是有权的,也可以是无权的。图遍历...

    java数据结构与算法1

    在Java中实现数据结构和算法,可以利用其内置的数据类型(如ArrayList和LinkedList)以及集合框架(如List、Set、Map接口),这使得Java在处理数据结构时具有简洁和高效的特性。 4. **C++实现**:虽然标题中主要...

    ArrayList底层原理

    ArrayList是Java编程语言中常用的集合类之一,它实现了List接口,并且其底层数据结构基于数组。ArrayList的主要特点是允许用户按索引访问元素,且提供了动态扩容的能力。在深入理解ArrayList的底层原理之前,我们先...

Global site tag (gtag.js) - Google Analytics