一.成员变量
- // 在AbstractList里面定义的
- protected transient int modCount = 0;
- // 内部用数组实现
- private transient Object[] elementData;
- private int size;
二.构造函数
- // 自己在写代码的时候为了严谨,最好是先判断参数抛出IllegalArgumentException
- public ArrayList(int initialCapacity) {
- super();
- if (initialCapacity < 0)
- throw new IllegalArgumentException("Illegal Capacity: "
- + initialCapacity);
- this.elementData = new Object[initialCapacity];
- }
- // 初始化容量10
- public ArrayList() {
- this(10);
- }
三.存数据
- //增加数据
- public boolean add(E e) {
- //1.保证容量,size+1和容量比较,看是否有位置插入e
- ensureCapacity(size + 1); // Increments modCount!!
- //2.直接赋值
- elementData[size++] = e;
- return true;
- }
- //在指定位置增加数据
- public void add(int index, E element) {
- if (index > size || index < 0)
- throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
- + size);
- //1.保证容量
- ensureCapacity(size + 1); // Increments modCount!!
- //2.向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。
- System.arraycopy(elementData, index, elementData, index + 1, size
- - index);
- //3.将指定的元素插入此列表中的指定位置
- elementData[index] = element;
- size++;
- }
- // 检查容量,minCapacity=size+1
- public void ensureCapacity(int minCapacity) {
- modCount++;
- int oldCapacity = elementData.length;
- // 如果超过容量
- if (minCapacity > oldCapacity) {
- Object oldData[] = elementData;
- // 新容量=(老容量 * 3)/2 + 1
- // 如果老容量为10,则新容量为16
- int newCapacity = (oldCapacity * 3) / 2 + 1;
- //newCapacity < minCapacity会产生这样的情况?????
- if (newCapacity < minCapacity)
- newCapacity = minCapacity;
- //复制原数组数据到大小为newCapacity的数组中
- elementData = Arrays.copyOf(elementData, newCapacity);
- }
- }
- //替换数据
- public E set(int index, E element) {
- RangeCheck(index);
- //保存index处旧值
- E oldValue = (E) elementData[index];
- //赋新值
- elementData[index] = element;
- return oldValue;
- }
- //下标志检查
- private void RangeCheck(int index) {
- if (index >= size)
- throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
- + size);
- }
四.取数据
- public E get(int index) {
- RangeCheck(index);
- return (E) elementData[index];
- }
- // 返回第一次出现o的下标,用equals比较
- // 如果不存在o,返回-1
- public int indexOf(Object o) {
- if (o == null) {
- for (int i = 0; i < size; i++)
- if (elementData[i] == null)
- return i;
- } else {
- for (int i = 0; i < size; i++)
- if (o.equals(elementData[i]))
- return i;
- }
- return -1;
- }
- // 想想为什么不这么实现
- // 上面的实现方式比较次数2+n,下面的比较次数2*n
- public int indexOf(Object o) {
- for (int i = 0; i < size; i++) {
- if (o == null) {
- if (elementData[i] == null)
- return i;
- } else {
- if (o.equals(elementData[i]))
- return i;
- }
- }
- return -1;
- }
- // 从size-1往0遍历
- public int lastIndexOf(Object o) {
- if (o == null) {
- for (int i = size - 1; i >= 0; i--)
- if (elementData[i] == null)
- return i;
- } else {
- for (int i = size - 1; i >= 0; i--)
- if (o.equals(elementData[i]))
- return i;
- }
- return -1;
- }
五.删数据
- //移除index处的元素是List接口里新加的方法
- //同Map一样,在插入元素的操作中会扩容,删除元素并不去减容
- public E remove(int index) {
- RangeCheck(index);
- modCount++;
- E oldValue = (E) elementData[index];
- //需要移动的元素个数
- int numMoved = size - index - 1;
- if (numMoved > 0)
- //数组内(间)元素移动,五个参数依次为
- //src - 源数组。
- //srcPos - 源数组中的起始位置。
- //dest - 目标数组。
- //destPos - 目标数据中的起始位置。
- //length - 要复制的数组元素的数量。
- System.arraycopy(elementData, index + 1, elementData, index,
- numMoved);
- //让GC回收因移动空出的数组最后一位
- elementData[--size] = null;
- return oldValue;
- }
- //remove某个元素是Collection接口里的方法
- //同Map一样,在插入元素的操作中会扩容,删除元素并不去减容
- //remove(int index)和remove(Object o)一次只会移除一个元素
- public boolean remove(Object o) {
- if (o == null) {
- for (int index = 0; index < size; index++)
- if (elementData[index] == null) {
- fastRemove(index);
- return true;
- }
- } else {
- for (int index = 0; index < size; index++)
- if (o.equals(elementData[index])) {
- fastRemove(index);
- return true;
- }
- }
- return false;
- }
- //把index后的元素移往前移一位
- private void fastRemove(int index) {
- modCount++;
- int numMoved = size - index - 1;
- if (numMoved > 0)
- System.arraycopy(elementData, index + 1, elementData, index,
- numMoved);
- //让GC回收因移动空出的数组最后一位
- elementData[--size] = null;
- }
六.List与Array
- //ArrayList转换成数组
- //将ArrayList内部的数组0到size-1位返回即可
- public Object[] toArray() {
- return Arrays.copyOf(elementData, size);
- }
- //ArrayList转换成指定数组a
- public <T> T[] toArray(T[] a) {
- if (a.length < size)
- // Make a new array of a's runtime type, but my contents:
- return (T[]) Arrays.copyOf(elementData, size, a.getClass());
- System.arraycopy(elementData, 0, a, 0, size);
- if (a.length > size)
- a[size] = null;
- return a;
- }
相关推荐
### Java集合容器知识点详解 #### 一、集合容器概述 - **定义**:集合容器是Java平台提供的标准组件,主要用于存储对象。...通过本篇文章的学习,希望读者能够更好地理解和应用Java集合容器,提升编程技能。
通过深入分析ArrayList的源码,我们可以更好地理解其工作原理以及优化策略。这些知识点对于开发高效稳定的Java程序至关重要。对于需要频繁访问和修改的数据集,使用ArrayList可以带来性能上的显著提升。然而,在多...
《深入Java集合学习系列:ArrayList的实现原理》 在Java编程中,ArrayList是集合框架中一个重要的类,属于List接口的实现,它提供了动态数组的功能,允许我们在集合中存储、添加、删除元素,并且可以按索引访问。这...
Java试题-2:ArrayList类动态代理 什么是动态代理 动态代理该怎么实现
**选项分析:** - **A**:`public abstract method();` 此项缺少方法名。 - **B**:`public abstract void method();` 抽象方法不需要方法体,此选项正确。 - **C**:`public abstract void method() {};` 抽象方法...
ArrayList是Java集合框架中常用的动态数组,它允许我们在运行时添加、删除和访问元素。在Java中,ArrayList实现了List接口,因此它支持有序...记住,学习ArrayList不仅是掌握方法,更是理解其在不同场景下的最佳实践。
### Java容器类详解:List、ArrayList、Vector及Map、HashTable应用 #### 一、Java容器类概述 在Java中,容器类(也称为集合类)主要用于存储和管理对象。Java SDK提供了一系列内置容器类,它们位于`java.util`...
【Java 容器详解】 Java 容器是 Java 核心库的重要组成部分,它们提供了存储和管理对象的方式。常见的容器包括以下几类: 1. **集合接口**:主要有 Collection 和 Map 两大接口。 - **Collection**:代表一组不...
- **集合框架**:Java的ArrayList, LinkedList, HashMap等容器类的使用会在源码中体现,帮助理解数据存储和操作。 - **泛型**:源码将展示如何使用泛型编写类型安全的代码,减少类型转换的麻烦。 - **枚举**:...
2. **Tomcat**:不仅可以解析 JSP 动态页面,还可以作为 Servlet 容器。 3. **JBoss**:是一个全面的应用服务器,可以部署各种 Java 应用。 #### 五、GET 与 POST 区别 1. **数据提交方式**: - **GET**:通过 ...
【Java ArrayList 使用与分析】 ArrayList 是 Java 集合框架中的一个重要组成部分,它是一个基于数组实现的可变大小的列表。ArrayList 类继承自 AbstractList 类并实现了 List 接口,这意味着它可以被用作一个有序...
#### 七、super关键字的使用 - **知识点**: `super`关键字用于调用父类的方法或属性,在构造方法中调用父类的构造方法。 - **解析**: - `super(C)`表示在子类构造方法中调用父类构造方法,并传递参数C。 - 选项...
### 一、集合容器概述 #### 1. 什么是集合? 集合(Collection)是指在Java中用来存储、检索及操作一组对象的一种容器。它是一种高级的数据结构,主要用于管理一组对象,而不仅仅是简单地存储这些对象。 #### 2. ...
题目询问如何正确地构造一个实现了`List`接口的`ArrayList`实例。正确的选项是**B**:`List myList=new ArrayList〔〕;` - **A**:`ArrayList myList=new Object〔〕;` 这个选项错误是因为它创建了一个`Object`...
ArrayList 源码分析: ArrayList 底层采用数组实现,所以它的操作基本上都是基于对数组的操作。ArrayList 提供了三个构造函数: 1. ArrayList():默认构造函数,提供初始容量为 10 的空列表。 2. ArrayList(int ...
#### 七、ArrayList、Vector、LinkedList的存储性能和特性 - **ArrayList**:基于动态数组实现,适合随机访问。 - **Vector**:与 ArrayList 类似,但所有操作都是线程安全的,性能相对较低。 - **LinkedList**:...
#### 七、ArrayList、Vector、LinkedList的存储性能和特性 - **ArrayList**: - **特性**:基于数组实现,支持随机访问。 - **性能**:插入和删除效率低。 - **Vector**: - **特性**:与`ArrayList`类似,但...
在Java学习笔记中,我们重点关注Java的IO(输入/输出)操作、常用类库以及集合框架。 1. **Java IO**: - **File类**:提供了文件和目录的基本操作,如创建、删除、重命名等。 - **RandomAccessFile**:支持对...
Java.util 源码分析 Java.util 包是 Java 核心库的重要组成部分,它包含了许多用于日常编程的工具类和接口,如集合框架、日期时间处理、随机数生成、事件处理等。深入理解这个包的源码对于提升Java开发者的技能至关...