【Java】ArrayList ゝ一纸荒年。 2023-05-29 06:18 52阅读 0赞 一、ArrayList类图 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljYjE5MTQ4NDU0NTE_size_16_color_FFFFFF_t_70][] 二、ArrayList主要的成员变量 (1)private static final int DEFAULT\_CAPACITY = 10;默认容量。 (2)private static final Object\[\] EMPTY\_ELEMENTDATA = \{\}; Shared empty array instance used for empty instances. (3)private static final Object\[\] DEFAULTCAPACITY\_EMPTY\_ELEMENTDATA = \{\}; Shared empty array instance used for default sized empty instances. We distinguish this from EMPTY\_ELEMENTDATA to know how much to inflate when first element is added. (4)transient Object\[\] elementData; The array buffer into which the elements of the ArrayList are stored. The capacity of the ArrayList is the length of this array buffer. Any empty ArrayList with elementData == DEFAULTCAPACITY\_EMPTY\_ELEMENTDATA will be expanded to DEFAULT\_CAPACITY when the first element is added. (5)private static final int MAX\_ARRAY\_SIZE = Integer.MAX\_VALUE - 8; The maximum size of array to allocate. Some VMs reserve some header words in an array. Attempts to allocate larger arrays may result in OutOfMemoryError: Requested array size exceeds VM limit 三、构造函数 public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } 调用带参数的构造函数,当initialCapacity>0时直接new Object\[initialCapacity\]的数组,如果initialCapacity=0,则赋值为EMPTY\_ELEMENTDATA /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 调用无参构造函数时,设置this.elementData = DEFAULTCAPACITY\_EMPTY\_ELEMENTDATA,当加入一个元素第一次扩容时会扩容为DEFAULT\_CAPACITY public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // replace with empty array. this.elementData = EMPTY_ELEMENTDATA; } } // c.toArray might (incorrectly) not return Object\[\] (see 6260652)解释:[https://blog.csdn.net/xiaotuji\_/article/details/72598546][https_blog.csdn.net_xiaotuji_article_details_72598546] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljYjE5MTQ4NDU0NTE_size_16_color_FFFFFF_t_70 1][] 三、add方法及扩容 1、add方法的代码如下: /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (as specified by {@link Collection#add}) */ public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } 扩容逻辑在ensureCapacityInternal(int minCapacity)里面。ensureCapacityInternal的代码逻辑如下: private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } calculateCapacity里面有涉及到DEFAULTCAPACITY\_EMPTY\_ELEMENTDATA的处理,代码如下: private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } 处理完DEFAULTCAPACITY\_EMPTY\_ELEMENTDATA之后接着执行,ensureExplicitCapacity,如下: private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } 如果minCapacity > elementData.length,执行grow(minCapacity)进行扩容,如下: /** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; 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); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } 仅记录个人学习情况,如有错误,请帮指正,谢谢! [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljYjE5MTQ4NDU0NTE_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20191105000131594.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljYjE5MTQ4NDU0NTE=,size_16,color_FFFFFF,t_70 [https_blog.csdn.net_xiaotuji_article_details_72598546]: https://blog.csdn.net/xiaotuji_/article/details/72598546 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljYjE5MTQ4NDU0NTE_size_16_color_FFFFFF_t_70 1]: https://img-blog.csdnimg.cn/2019110520215116.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljYjE5MTQ4NDU0NTE=,size_16,color_FFFFFF,t_70
相关 集合操作性能优化:JavaArrayList与LinkedList对比 在Java中,ArrayList和LinkedList都是常用的集合类,它们分别具有不同的特性,这在一定程度上影响了它们的性能。 1. **ArrayList**: - 数据 Bertha 。/ 2024年12月11日 06:42/ 0 赞/ 95 阅读
相关 使用集合框架:JavaArrayList和HashMap问题分析 在Java编程中,`java.util.ArrayList`和`java.util.HashMap`是两种常用的集合框架。下面对它们的问题进行分析: 1. `ArrayLis 秒速五厘米/ 2024年12月05日 22:06/ 0 赞/ 99 阅读
相关 集合操作不当:JavaArrayList中的插入、删除操作误区演示 在Java中,ArrayList是一种动态数组,支持添加元素、删除元素等操作。然而,在实际使用过程中,可能会出现一些误区。下面我将通过几个示例来演示这些误区: 1. 插入元素 小灰灰/ 2024年10月14日 17:03/ 0 赞/ 120 阅读
相关 集合操作:JavaArrayList删除元素异常案例 在Java中,当我们使用ArrayList类的remove方法来删除一个特定元素时,如果该元素不存在于列表中,会出现`IndexOutOfBoundsException`异常。 ╰+攻爆jí腚メ/ 2024年09月23日 10:03/ 0 赞/ 133 阅读
还没有评论,来说两句吧...