`
wenjinglian
  • 浏览: 824465 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

了解ArrayList原理

阅读更多

1.ArrayList 介绍

有序集合,按顺序存储元素

非线程安全

底层实现:底层采用数组实现,就是一个自动扩展的动态数组,

初始大小:集合的初始化大小10

容量扩张:(原始大小 * 3)/2 + 1  = 50% + 1

 

2.与其他集合对比

与Vector 对比

 Vector 是线程安全的

与LinkedList 对比

 LinkedList 以链表形式存储,每个元素都保存了前一个元素和后一个元素的地址

 ArrayList  add,remove操作比LinkedList慢,ArrayList需要进行移位操作,LinkedList只需要改变当前元素前后地址

 ArrayList get,set 操作比LinkedList快,ArrayList只需要通过下标定位元素,LinkedList需要遍历整个链表 

 

3.源码分析 

 

ArrayList 

private transient Object[] elementData;  // 实际采用Object数组

public ArrayList() {
    //初始化容量大小10
	this(10);
    }

// 获取元素
public E get(int index) {
	RangeCheck(index); //检查下标是否越界
	return (E) elementData[index]; //下标获取
    }
//重新指定下元素
 public E set(int index, E element) {
	RangeCheck(index);

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

//添加操作
public boolean add(E e) {
	ensureCapacity(size + 1);  // Increments modCount!! 容量自动扩张
	elementData[size++] = e;
	return true;
    }

//删除操作
 public E remove(int index) {
	RangeCheck(index);

	modCount++;
	E oldValue = (E) elementData[index];

	int numMoved = size - index - 1;
	if (numMoved > 0)
	    System.arraycopy(elementData, index+1, elementData, index,
			     numMoved); //删除元素后面的元素往前移,元素有移位操作,消耗性能
	elementData[--size] = null; // Let gc do its work  清空最后的位置,让垃圾回收

	return oldValue; //返回当前删除的元素
    }

//自动容量扩张
public void ensureCapacity(int minCapacity) {
	modCount++;  //记录当前集合的操作次数,用于判断当前是否有并发操作
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1; // 扩大 (原始大小 * 3)/2 + 1 = 50% + 1
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity); // 创建新数组大小将原来的数组复制到新的数组当中,数组元素越多性能消耗
	}
    }
数组copy方法:public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length) 
参数:src 原始数组.srcPos 原始数组开始下标.dest 目标数组下标.destPos 目标数组下开始下标.length .复制的数组长度

 

4.优化

尽可能的在初始化的时候设定大小,避免容量扩张

public void ensureCapacity(int minCapacity) // 只有在容量不够的情况下才扩张
{
  ...
if (minCapacity > oldCapacity) {
    //扩张
}
}

新增和删除操作比较频繁可以使用LinkedList

 

 

 

 

分享到:
评论

相关推荐

    深入Java集合学习系列:ArrayList的实现原理

    通过阅读源码,我们可以了解到ArrayList是如何处理扩容、如何优化性能以及如何处理各种边界情况的。例如,add()方法中的rangeCheckForAdd()用于检查插入位置是否合法,防止数组越界;removeRange()方法在删除元素后...

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

    在探讨 JDK 7.0 中 ArrayList 的底层实现原理之前,首先需要了解 ArrayList 作为 Java 集合框架中 List 接口的动态数组实现类的基本概念。ArrayList 提供了一种存储有序、可重复、允许为 null 的数据结构,并且该...

    ArrayList底层原理

    了解ArrayList的工作原理对于优化代码和解决实际问题至关重要。在使用ArrayList时,应结合具体应用场景选择合适的操作方式,以提高程序的效率。同时,掌握ArrayList的序列化和克隆机制也有助于在项目开发中实现更...

    ArrayList源码分析(含jdk1.8).pdf

    在了解ArrayList的源码分析时,我们主要探讨其在Java Development Kit (JDK) 1.8中的实现。ArrayList是一个非常重要的集合框架,用于动态数组的实现,其功能类似于数组,但可以在运行时动态调整大小。它是一个非线程...

    ArrayList源码分析

    本篇文章将深入探讨ArrayList的源码,了解其内部实现机制,以及在实际编程中如何有效地使用ArrayList。 1. **ArrayList的构造函数** ArrayList提供了多个构造函数,包括无参构造、指定容量构造和初始化容量并赋值...

    关于 ArrayList get(0)的异常JDK源码跟进

    首先,我们需要了解ArrayList的内部结构。ArrayList实际上是一个基于数组实现的列表,它维护了一个Object类型的数组,当我们添加元素时,ArrayList会根据需要自动调整数组大小。`get(int index)`方法用于返回指定...

    ArrayList Vector LinkedList 区别与用法.

    了解ArrayList、Vector和LinkedList的不同特性,可以帮助我们在实际开发中根据具体需求选择最适合的数据结构,从而优化程序性能。虽然JDK提供了丰富的集合框架,但掌握这些核心类的工作原理和适用场景,对于写出高效...

    我的ArrayList实现

    了解ArrayList的内部机制对于优化代码性能至关重要。例如,预估ArrayList的大小并传入构造函数可以避免不必要的扩容操作;在循环中使用迭代器而不是直接调用ArrayList的方法,可以防止...

    ArrayList共4页.pdf.zip

    在实际开发中,了解ArrayList的工作原理和使用技巧对于提升代码性能至关重要。例如,当我们需要快速访问元素而插入和删除操作较少时,ArrayList是一个很好的选择。反之,如果插入和删除操作频繁,考虑使用LinkedList...

    arrayList:了解arrayLIst的详细信息

    ArrayList是Java编程语言中一种常用的动态...了解ArrayList的内部工作原理和特性,有助于我们更好地设计和优化代码,提高程序的性能。在实际开发中,我们应该根据具体需求来选择合适的数据结构,以达到最佳的程序效果。

    c#重写ArrayList源代码

    尽管如此,了解ArrayList的内部工作原理以及如何重写其源代码,对于深化对C#和面向对象编程(OOP)的理解仍然非常有价值。 ArrayList的源代码重写通常涉及以下几个关键部分: 1. **构造函数**:ArrayList有一个无...

    从原码解析ArrayList

    通过以上分析,我们可以了解到ArrayList的核心特性以及在使用中的注意事项。理解这些原理对于优化代码性能和避免潜在问题至关重要。在实际开发中,根据具体需求选择合适的数据结构,如ArrayList或LinkedList,能有效...

    第二章 ArrayList源码解析1

    第二章 ArrayList源码解析 ArrayList是Java集合框架中...通过对构造器、添加、获取、删除、遍历、查找和排序等操作的源码分析,我们可以更深入地了解ArrayList的内部机制,从而更好地运用和优化基于ArrayList的代码。

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    它基于哈希表(散列表)原理,提供了快速的查找、插入和删除操作。虽然`HashMap`不是线程安全的,但在单线程环境下,其性能优于`HashTable`。如果在多线程环境中使用,可以考虑使用`ConcurrentHashMap`。 以下是...

    46-Java知识点 手写ArrayList1

    Java 中最常用的类是 ArrayList,它的实现原理和方法非常重要。在面试中,经常要求手写一个 ArrayList,以考察应聘者对 ArrayList 的熟悉程度。本文将详细介绍如何手写一个 ArrayList,并解释其核心思想和实现细节。...

    ArrayList的学习821.docx

    详细的学习可以通过搜索“ArrayList的动态扩容”来深入了解。 ArrayList的一个重要特性是其非线程安全。这意味着在多线程环境中,多个线程同时修改ArrayList可能会导致数据不一致或异常。为了在多线程环境下安全地...

    arraylist 对象 数组排序

    通过阅读和理解这个测试用例,我们可以更深入地了解Comparator的工作原理以及如何在实际项目中应用。 总的来说,对ArrayList中的对象进行排序涉及到Java集合框架的核心概念,包括List接口、Collections工具类以及...

Global site tag (gtag.js) - Google Analytics