ArrayList 学习笔记

接口

ArrayList实现了List接口,因此可以当作一个List来使用。
此外,ArrayList还实现RandomAccess接口和Serializable,说明ArrayList支持随机访问并且支持Java序列化机制。

实现

ArrayList内部含有的非静态域只有两个,一个用户保存数据的Object数组 elementData,和一个用于表示当前数据数量的size。

为什么不使用elementData的length来表示size呢? 因为elementData的length表示的此ArrayList当前的容量,而不是元素个数。

同时注意到elemantData是生命为transient的,说明这个域的并不是自动序列化的,需要ArrayList自行处理。

从elementData的注释中可以看到,如果当前是一个空的数组,那么当第一个元素被加入时,elementData的大小将会增长到默认大小(10),而不是1.这样做有利于减少数组重新分配的概率,提高运行时效率。

大家都知道,ArraList是支持泛型的,那么为什么要将elementData定义为Object的数组,而不是泛型数组呢? 这是因为泛型参数是不支持new的

部分方法说明

  • trimToSize()

    此方法将elementData的大小调整到刚好能容纳当前的所有元素,以减少内存占用。

  • toArray

    无参的形式,会调用Arrays.copyOf将elementData直接拷贝一份作为结果返回,这样调用者就可以直接修改这个返回的数组,而不影响到arrayList。

    带一个数组参数的形式,如果传入的数组足以容纳当前的所有元组,则将当前所有元素拷贝到传入的数组中,否则就会新建一个数组并拷贝进去,然后作为结果返回回去。如果传入的数组的大小,超过了当前元素的数量,则会在拷贝进去之后,将拷贝进去的最后一个元素之后的元素置为null,调用着可以根据这个null的位置来判断拷贝了多少个元素进去。

  • ensureCapacity

    确保此ArrayList的容量能满足入参要求,如果有必要,会增加ArrayList的容量。

  • contains

    通过从前往后顺序遍历元素,对每个元素调用equal的方式,来检查是否包含某个元素。

  • indexOf

    通过从前往后顺序遍历元素,对每个元素调用equal的方式,来检查是否包含某个元素,如果包含,返回去下标。

  • lastIndexOf

    同indexOf,只是,现在是从后往前开始查找了。

  • grow

    这个方法是动态增长数组的核心,首先尝试增加一半的大小,如果增加了一半之后,依然不能满足要求,就直接增加到需要的大小。

  • subList

    sublist方法返回给定范围内的子序列,但是要注意,这个方法返回的只是原数组在指定的开始索引和结束索引之间的一个视图,并没有重新开辟一个数组,因此任何对这个sublist的修改,都会反映到原数组上,and
    vice versa.

    生成了sublist之后,如果直接操作原数组导致结构发生了变化,那么下次操作sublist之后,就会抛出并行修改异常。通过sublist对象来操作则没有问题。

时间: 2024-07-31 14:23:37

ArrayList 学习笔记的相关文章

Java集合源码学习笔记(二)ArrayList分析

Java集合源码学习笔记(二)ArrayList分析 >>关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫"ArrayList",因为ArrayList内部是用一个数组存储元素值,相当于一个可变大小的数组,也就是动态数组. (1)继承和实现继承了AbstractList,实现了List:ArrayList是一个数组队列,提供了相关的添加.删除.修

Java集合框架学习笔记

本文为学习笔记,学习课程为慕课网Java入门第三季中的集合框架部分,若需要研究文中的代码,可前往下载.http://www.imooc.com/learn/110 1. List(Collection子接口) 1.1 实例化 List list = new ArrayList(); ??List是一个接口,不可直接实例化,通常情况下ArrayList实现类进行实例化. 1.2 增 1.2.1 add(obj) ??直接将obj对象加入List末位. 1.2.2 add(i, obj) ??将ob

Android:日常学习笔记(8)———探究UI开发(5)

Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView的简单用法 public class MainActivity extends AppCompatActivity { private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","

【DAY12】第十二天集合&泛型&IO学习笔记

hash:散列 ------------------ Hashset集合内部是通过HashMap进行实现的.使用的是HashMap中key部分. 对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和 自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行 &运算,得到介于0和集合容量值之间一个数字.该数字表示着数组的下标. 也就是该元素应该存放在哪个元素中. Map与Collection -------------- Map与Collection在

Android学习笔记(十二)——实战:制作一个聊天界面

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Patch图片是一种被特殊处理过的 png 图片,能够指定哪些区域可以被拉伸而哪些区域不可以.一般用来作为聊天信息的背景.在此我们先准备一张png图片.然后在 Android sdk 目录下有一个 tools 文件夹,在这个文件夹中找到 draw9patch.bat文件. 双击打开之后, 在导航栏点击 File→

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的. 提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的.欢迎高手指正. 整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了. 在之前源码初

非计算机专业的码农C#学习笔记 五、数组和集合

数组和集合 1.数组问题Array (1)一维数组:int[] arr={1,2,3,5,5} string[] s={s,l,s,g} (2)二维数组:int[,] arr=new int[2,2]{{1,2},{3,4}} 类型[,] 数组名=new 类型[行数(元素数),列数(元素的子元素数]{{元素1,元素2},{元素…},…,} l  动态数组:类型[,] 数组名=new 类型[M,N],int M=””;int N=””; l  查看内部元素:foreach(int n in arr