1. ArrayList 在底层维护一个 Object[] ,如果你使用了泛型,其实是维护一个泛型指定类型的数组对象
/**
* 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;
ArrayList维护的数组的长度表示一个“容量”,用户一般不主动维护“容量”这个值,我们通常要使用的是数组的长度,也就是你add了多少个对象。
2. 用户通过ArrayList对象的size()方法得到ArrayList实例中对象的数目
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
/**
* Returns the number of elements in this list.
*
* @return the number of elements in this list.
*/
public int size() {
return size;
}
当我们进行add remove等操作的时候,ArrayList对象会自动维护size值
3. ArrayList 的构造方法
(1)指定“容量”的构造方法
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list.
* @exception IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = (E[])new Object[initialCapacity];
}
如果在实例化ArrayList类的时候,指定了“容量”,那么ArrayList会生成一个指定容量大小的数组
(2)默认构造方法
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
(3) 构造一个与指定集合内容相同的ArrayList
/**
* @param c the collection whose elements are to be placed into this list.
* @throws NullPointerException if the specified collection is null.
*/
public ArrayList(Collection<? extends E> c) {
size = c.size();
// Allow 10% room for growth
int capacity = (int) Math.min((size*110L)/100, Integer.MAX_VALUE);
elementData = (E[]) c.toArray(new Object[capacity]);
}
使用这个构造方法生成的对象与参数Collection<? extends E> c 的hashCode值是相同的,但是二者互不影响。
此时,ArrayList实例的“容量”是参数Collection<? extends E> c 的size(一定要注意是size,不是c的“容量”)的110%+1
分享到:
相关推荐
在了解ArrayList的源码分析时,我们主要探讨其在Java Development Kit (JDK) 1.8中的实现。ArrayList是一个非常重要的集合框架,用于动态数组的实现,其功能类似于数组,但可以在运行时动态调整大小。它是一个非线程...
ArrayList提供了多个构造函数,包括无参构造、指定容量构造和初始化容量并赋值的构造。无参构造函数默认创建一个容量为10的底层数组,而指定容量的构造函数允许我们预设数组大小,避免不必要的扩容操作。 2. **...
《硬核ArrayList源码分析——深入理解Java集合框架》 ArrayList是Java集合框架中的一个重要组成部分,它是基于动态数组实现的列表。在Java 1.8版本中,ArrayList的实现细节和内部工作原理对于理解其性能和行为至关...
源码分析对于深入理解Java平台的工作原理、优化代码性能以及进行二次开发具有重要的价值。 rt.jar中的源码虽然默认并未提供,但可以通过一些工具,如JDK的`src.zip`或者使用OpenJDK的源码仓库来获取。这些源码提供...
2. 无参构造函数初始化:默认不分配任何空间,而是使用一个空的数组引用,避免不必要的内存开销。 3. 指定数据初始化:接受一个Collection对象,将其转换为ArrayList,如果输入的Collection非Object[]类型,会进行...
源码阅读可以揭示类的内部结构,包括数据成员、构造函数、方法实现等,从而帮助我们编写更高效、更健壮的代码。 **实际应用** 在实际开发中,选择使用`ArrayList`还是`LinkedList`取决于具体需求。如果频繁进行元素...
默认构造函数则会使用`DEFAULTCAPACITY_EMPTY_ELEMENTDATA`。 ArrayList提供了一个从Collection构造的方法,将传入的集合转换为数组并存储。如果集合为空,会生成`EMPTY_ELEMENTDATA`。这里需要注意,如果传入的...
第十五讲和第十六讲可能涵盖Java的集合框架,包括ArrayList、LinkedList、HashSet、HashMap等数据结构的源码分析。集合框架是Java库的重要组成部分,提供了存储和操作对象的高效工具。通过对这些类的源码学习,我们...
MyArrayList提供了构造函数,一个是默认容量为10的构造函数,另一个是带有自定义初始容量参数的构造函数。如果提供的初始容量小于0,程序会抛出异常。 添加元素的方法`add(Object obj)`是ArrayList的核心功能之一。...
ArrayList 源码分析: ArrayList 底层采用数组实现,所以它的操作基本上都是基于对数组的操作。ArrayList 提供了三个构造函数: 1. ArrayList():默认构造函数,提供初始容量为 10 的空列表。 2. ArrayList(int ...
源码分析: 1. **类和对象**:Java是一种面向对象的语言,书中源码会展示如何定义类、封装数据、创建对象以及如何使用面向对象的特性如继承、多态和抽象。通过阅读这些源码,你可以看到类的构造函数、成员变量和...
- 构造函数:每个类可能有一个构造函数,用于初始化新创建的对象。 - 方法:例如,Game类可能有startGame()、checkMatch()、shuffleCards()等方法,分别对应游戏开始、检查匹配和洗牌操作。 3. **图形用户界面...
例如,你可以看到如何通过构造函数初始化对象,如何使用抽象类和接口,以及如何实现多线程等。 3. **异常处理**:Java中的异常处理是编程中必不可少的一部分,源码将展示try-catch-finally结构的使用,以及自定义...
了解类的构造函数、属性(成员变量)和方法(功能),以及如何通过实例化对象来使用这些类是理解源码的关键。 2. **继承与多态**:Java支持单继承和多态性,这意味着一个类可以继承自另一个类,并且可以通过接口...
3. **类与对象**:Java是一种面向对象的语言,源码会展示类的定义(构造函数、属性、方法),对象的创建和使用,以及封装、继承和多态的概念。 4. **继承**:通过`extends`关键字实现类之间的继承关系,源码会展示...
在源码中,你可以看到类(class)的定义,这是Java中的基本构造单元。类通常包含了数据(成员变量)和操作这些数据的方法(函数)。例如,一个简单的"Person"类可能包含姓名和年龄作为属性,以及获取和设置这些属性...
你可以看到构造函数、访问修饰符、抽象类和接口的使用。 3. **异常处理**:Java异常处理是程序健壮性的重要组成部分,源码中会有try-catch-finally结构的实例,以及自定义异常的创建和抛出。 4. **集合框架**:...
因此,对于预知元素数量较大的情况,可以通过构造函数传入初始容量来减少扩容次数。 2. **添加元素**: `add(E e)`方法用于在ArrayList末尾添加元素,时间复杂度为O(1)。`add(int index, E element)`则允许在指定...