`
flashsnow
  • 浏览: 29937 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

Java ArrayList 构造函数源码分析

 
阅读更多

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源码分析(含jdk1.8).pdf

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

    ArrayList源码分析

    ArrayList提供了多个构造函数,包括无参构造、指定容量构造和初始化容量并赋值的构造。无参构造函数默认创建一个容量为10的底层数组,而指定容量的构造函数允许我们预设数组大小,避免不必要的扩容操作。 2. **...

    硬核ArrayList源码分析,答应我每天看一遍好么

    《硬核ArrayList源码分析——深入理解Java集合框架》 ArrayList是Java集合框架中的一个重要组成部分,它是基于动态数组实现的列表。在Java 1.8版本中,ArrayList的实现细节和内部工作原理对于理解其性能和行为至关...

    Java rt.jar 源码分析

    源码分析对于深入理解Java平台的工作原理、优化代码性能以及进行二次开发具有重要的价值。 rt.jar中的源码虽然默认并未提供,但可以通过一些工具,如JDK的`src.zip`或者使用OpenJDK的源码仓库来获取。这些源码提供...

    深入Java集合ArrayList的源码解析

    2. 无参构造函数初始化:默认不分配任何空间,而是使用一个空的数组引用,避免不必要的内存开销。 3. 指定数据初始化:接受一个Collection对象,将其转换为ArrayList,如果输入的Collection非Object[]类型,会进行...

    Map+List+ArrayList+LinkedList Java源码

    源码阅读可以揭示类的内部结构,包括数据成员、构造函数、方法实现等,从而帮助我们编写更高效、更健壮的代码。 **实际应用** 在实际开发中,选择使用`ArrayList`还是`LinkedList`取决于具体需求。如果频繁进行元素...

    ArrayList源码分析_016.pdf

    默认构造函数则会使用`DEFAULTCAPACITY_EMPTY_ELEMENTDATA`。 ArrayList提供了一个从Collection构造的方法,将传入的集合转换为数组并存储。如果集合为空,会生成`EMPTY_ELEMENTDATA`。这里需要注意,如果传入的...

    JAVA1234:J2SE源码PART1

    第十五讲和第十六讲可能涵盖Java的集合框架,包括ArrayList、LinkedList、HashSet、HashMap等数据结构的源码分析。集合框架是Java库的重要组成部分,提供了存储和操作对象的高效工具。通过对这些类的源码学习,我们...

    Java 中模仿源码自定义ArrayList

    MyArrayList提供了构造函数,一个是默认容量为10的构造函数,另一个是带有自定义初始容量参数的构造函数。如果提供的初始容量小于0,程序会抛出异常。 添加元素的方法`add(Object obj)`是ArrayList的核心功能之一。...

    java提高篇(二一)-----ArrayList.pdf

    ArrayList 源码分析: ArrayList 底层采用数组实现,所以它的操作基本上都是基于对数组的操作。ArrayList 提供了三个构造函数: 1. ArrayList():默认构造函数,提供初始容量为 10 的空列表。 2. ArrayList(int ...

    疯狂java讲义源码和疯狂Java实战源码

    源码分析: 1. **类和对象**:Java是一种面向对象的语言,书中源码会展示如何定义类、封装数据、创建对象以及如何使用面向对象的特性如继承、多态和抽象。通过阅读这些源码,你可以看到类的构造函数、成员变量和...

    java记忆游戏源码

    - 构造函数:每个类可能有一个构造函数,用于初始化新创建的对象。 - 方法:例如,Game类可能有startGame()、checkMatch()、shuffleCards()等方法,分别对应游戏开始、检查匹配和洗牌操作。 3. **图形用户界面...

    java疯狂讲义源码

    例如,你可以看到如何通过构造函数初始化对象,如何使用抽象类和接口,以及如何实现多线程等。 3. **异常处理**:Java中的异常处理是编程中必不可少的一部分,源码将展示try-catch-finally结构的使用,以及自定义...

    java应用范例源码

    了解类的构造函数、属性(成员变量)和方法(功能),以及如何通过实例化对象来使用这些类是理解源码的关键。 2. **继承与多态**:Java支持单继承和多态性,这意味着一个类可以继承自另一个类,并且可以通过接口...

    java程序设计教程源码

    3. **类与对象**:Java是一种面向对象的语言,源码会展示类的定义(构造函数、属性、方法),对象的创建和使用,以及封装、继承和多态的概念。 4. **继承**:通过`extends`关键字实现类之间的继承关系,源码会展示...

    java 小程序带源码

    在源码中,你可以看到类(class)的定义,这是Java中的基本构造单元。类通常包含了数据(成员变量)和操作这些数据的方法(函数)。例如,一个简单的"Person"类可能包含姓名和年龄作为属性,以及获取和设置这些属性...

    core java 2 全部源码

    你可以看到构造函数、访问修饰符、抽象类和接口的使用。 3. **异常处理**:Java异常处理是程序健壮性的重要组成部分,源码中会有try-catch-finally结构的实例,以及自定义异常的创建和抛出。 4. **集合框架**:...

    ArrayList数据结构的分析

    因此,对于预知元素数量较大的情况,可以通过构造函数传入初始容量来减少扩容次数。 2. **添加元素**: `add(E e)`方法用于在ArrayList末尾添加元素,时间复杂度为O(1)。`add(int index, E element)`则允许在指定...

Global site tag (gtag.js) - Google Analytics