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 .复制的数组长度
相关推荐
通过阅读源码,我们可以了解到ArrayList是如何处理扩容、如何优化性能以及如何处理各种边界情况的。例如,add()方法中的rangeCheckForAdd()用于检查插入位置是否合法,防止数组越界;removeRange()方法在删除元素后...
在探讨 JDK 7.0 中 ArrayList 的底层实现原理之前,首先需要了解 ArrayList 作为 Java 集合框架中 List 接口的动态数组实现类的基本概念。ArrayList 提供了一种存储有序、可重复、允许为 null 的数据结构,并且该...
了解ArrayList的工作原理对于优化代码和解决实际问题至关重要。在使用ArrayList时,应结合具体应用场景选择合适的操作方式,以提高程序的效率。同时,掌握ArrayList的序列化和克隆机制也有助于在项目开发中实现更...
在了解ArrayList的源码分析时,我们主要探讨其在Java Development Kit (JDK) 1.8中的实现。ArrayList是一个非常重要的集合框架,用于动态数组的实现,其功能类似于数组,但可以在运行时动态调整大小。它是一个非线程...
本篇文章将深入探讨ArrayList的源码,了解其内部实现机制,以及在实际编程中如何有效地使用ArrayList。 1. **ArrayList的构造函数** ArrayList提供了多个构造函数,包括无参构造、指定容量构造和初始化容量并赋值...
首先,我们需要了解ArrayList的内部结构。ArrayList实际上是一个基于数组实现的列表,它维护了一个Object类型的数组,当我们添加元素时,ArrayList会根据需要自动调整数组大小。`get(int index)`方法用于返回指定...
了解ArrayList、Vector和LinkedList的不同特性,可以帮助我们在实际开发中根据具体需求选择最适合的数据结构,从而优化程序性能。虽然JDK提供了丰富的集合框架,但掌握这些核心类的工作原理和适用场景,对于写出高效...
了解ArrayList的内部机制对于优化代码性能至关重要。例如,预估ArrayList的大小并传入构造函数可以避免不必要的扩容操作;在循环中使用迭代器而不是直接调用ArrayList的方法,可以防止...
在实际开发中,了解ArrayList的工作原理和使用技巧对于提升代码性能至关重要。例如,当我们需要快速访问元素而插入和删除操作较少时,ArrayList是一个很好的选择。反之,如果插入和删除操作频繁,考虑使用LinkedList...
ArrayList是Java编程语言中一种常用的动态...了解ArrayList的内部工作原理和特性,有助于我们更好地设计和优化代码,提高程序的性能。在实际开发中,我们应该根据具体需求来选择合适的数据结构,以达到最佳的程序效果。
尽管如此,了解ArrayList的内部工作原理以及如何重写其源代码,对于深化对C#和面向对象编程(OOP)的理解仍然非常有价值。 ArrayList的源代码重写通常涉及以下几个关键部分: 1. **构造函数**:ArrayList有一个无...
通过以上分析,我们可以了解到ArrayList的核心特性以及在使用中的注意事项。理解这些原理对于优化代码性能和避免潜在问题至关重要。在实际开发中,根据具体需求选择合适的数据结构,如ArrayList或LinkedList,能有效...
第二章 ArrayList源码解析 ArrayList是Java集合框架中...通过对构造器、添加、获取、删除、遍历、查找和排序等操作的源码分析,我们可以更深入地了解ArrayList的内部机制,从而更好地运用和优化基于ArrayList的代码。
它基于哈希表(散列表)原理,提供了快速的查找、插入和删除操作。虽然`HashMap`不是线程安全的,但在单线程环境下,其性能优于`HashTable`。如果在多线程环境中使用,可以考虑使用`ConcurrentHashMap`。 以下是...
Java 中最常用的类是 ArrayList,它的实现原理和方法非常重要。在面试中,经常要求手写一个 ArrayList,以考察应聘者对 ArrayList 的熟悉程度。本文将详细介绍如何手写一个 ArrayList,并解释其核心思想和实现细节。...
详细的学习可以通过搜索“ArrayList的动态扩容”来深入了解。 ArrayList的一个重要特性是其非线程安全。这意味着在多线程环境中,多个线程同时修改ArrayList可能会导致数据不一致或异常。为了在多线程环境下安全地...
通过阅读和理解这个测试用例,我们可以更深入地了解Comparator的工作原理以及如何在实际项目中应用。 总的来说,对ArrayList中的对象进行排序涉及到Java集合框架的核心概念,包括List接口、Collections工具类以及...