栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java(ArrayList)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java(ArrayList)

package com.atguigu.javase.collection;

import java.util.AbstractList;
import java.util.Arrays;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.RandomAccess;

public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable {
	
	
	private static final int DEFAULT_CAPACITY = 10;
	
	private static final Object[] EMPTY_ELEMENTDATA = {};
	
	private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
	
	// 内部最核心的数组存储
	transient Object[] elementData; // non-private to simplify nested class access
	
	// 计数器
	private int size;
	
	// 记录修改次数
	protected transient int modCount = 0;
	
	// 内部数组初始时是一个空数组,长度为0
	public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
	
	public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
	
	private static int calculateCapacity(Object[] elementData, int minCapacity) { // [], 1
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 第一次添加元素时进入
            return Math.max(DEFAULT_CAPACITY, minCapacity); // 10, 1
        }
        return minCapacity;
    }

    private void ensureCapacityInternal(int minCapacity) { // 1
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); // 10
    }

    private void ensureExplicitCapacity(int minCapacity) { // 10
        modCount++; // 调整修改次数

        // overflow-conscious code
        if (minCapacity - elementData.length > 0) // 10 - 0 > 0
            grow(minCapacity); // 10
    }
    
    private void grow(int minCapacity) { // 10
        // overflow-conscious code
        int oldCapacity = elementData.length; // 0
        int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容1.5倍
        if (newCapacity - minCapacity < 0) // 0 - 10 
            newCapacity = minCapacity; // 10
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity); // 10
    }
    
    E elementData(int index) {
        return (E) elementData[index];
    }
    
    public E remove(int index) { // 2
        rangeCheck(index);

        modCount++; // 修改次数
        E oldValue = elementData(index);

        int numMoved = size - index - 1; // 11 - 2 - 1
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index, numMoved); // 把元素整体左移
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }
    
    private class Itr implements Iterator {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount; // 内部有一个期望的修改的次数
        
        final void checkForComodification() {
            if (modCount != expectedModCount) // 取元素时, 发现当前的修改次数和期望的有出入, 抛出异常
                throw new ConcurrentModificationException();
        }
    }
    
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1, size - index); // 把元素整体右移
        elementData[index] = element;
        size++;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/724245.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号