深入剖析ArrayList的底层源码-常用方法及其源码剖析(arraylist源码分析)

网友投稿 344 2022-06-14


深入剖析ArrayList的底层源码-常用方法及其源码剖析

1. get()方法

get(int index)方法是返回集合中指定位置的元素。

源码剖析

/**

* Returns the element at the specified position in this list.

*

* @param  index index of the element to return

* @return the element at the specified position in this list

* @throws IndexOutOfBoundsException {@inheritDoc}

*/

public E get(int index) {

// 检查下标索引是否越界

rangeCheck(index);

// 返回指定索引处的值

return elementData(index);

}

首先会检查索引值是否越界,如果索引值大于数组大小,则会抛出异常。

源码如下:

private void rangeCheck(int index) {

// 索引值大于数组大小

if (index >= size)

// 抛出异常

throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

}

如果所引是合法的,则调用elementData(int index)方法获取指定位置的元素。

2. set() 方法

set(int index, E element) 方法将index索引处的元素替换成element对象,返回被替换的旧元素。

源码剖析

/**

* Replaces the element at the specified position in this list with

* the specified element.

*

* @param index index of the element to replace

* @param element element to be stored at the specified position

* @return the element previously at the specified position

* @throws IndexOutOfBoundsException {@inheritDoc}

*/

public E set(int index, E element) {

// 检查下标索引是否越界

rangeCheck(index);

// 指定下标处的旧值

E oldValue = elementData(index);

// 指定下标处赋新的值

elementData[index] = element;

// 返回旧值

return oldValue;

}

3. add() 方法

add(E e) 方法 将指定的元素追加到此集合的末尾

源码剖析

/**

* Appends the specified element to the end of this list.

*

* @param e element to be appended to this list

* @return true (as specified by {@link Collection#add})

*/

public boolean add(E e) {

// 插入元素之前,会检查是否需要扩容

ensureCapacityInternal(size + 1);  // Increments modCount!!

// 将元素添加到数组中最后一个元素的后面,最后将集合中实际的元素个数加 1

elementData[size++] = e;

return true;

}

add(int index, E element) 在集合元素序列 index 位置处插入

源码剖析

/**

* Inserts the specified element at the specified position in this

* list. Shifts the element currently at that position (if any) and

* any subsequent elements to the right (adds one to their indices).

*

* @param index index at which the specified element is to be inserted

* @param element element to be inserted

* @throws IndexOutOfBoundsException {@inheritDoc}

*/

public void add(int index, E element) {

// 检查下标索引是否越界

rangeCheckForAdd(index);

// 插入元素之前,会检查是否需要扩容

ensureCapacityInternal(size + 1);  // Increments modCount!!

// 将 index 位置及其后面的所有元素都向后移一位

System.arraycopy(elementData, index, elementData, index + 1,

size - index);

// 将新元素插入到 index 位置处,元素个数加 1

elementData[index] = element;

size++;

}

4. remove() 方法

remove(int index) 方法是删除该集合中指定位置的元素

源码剖析

/**

* Removes the element at the specified position in this list.

* Shifts any subsequent elements to the left (subtracts one from their

* indices).

*

* @param index the index of the element to be removed

* @return the element that was removed from the list

* @throws IndexOutOfBoundsException {@inheritDoc}

*/

public E remove(int index) {

// 检查下标索引是否越界

rangeCheck(index);

modCount++;

// 返回被删除的元素值

E oldValue = elementData(index);

// 需要移动的元素的个数

int numMoved = size - index - 1;

if (numMoved > 0)

// 将 index + 1 及其后面的元素向前移动一位,覆盖被删除的元素值

System.arraycopy(elementData, index+1, elementData, index,

numMoved);

// 把数组最后一个元素赋值为null,将元素个数减一

elementData[--size] = null; // clear to let GC do its work

// 返回旧值

return oldValue;

}

remove(Object o) 方法是删除指定的元素,如果有重复的元素,则只会删除下标最小的元素

源码剖析

/**

* Removes the first occurrence of the specified element from this list,

* if it is present.  If the list does not contain the element, it is

* unchanged.  More formally, removes the element with the lowest index

* i such that

* (o==null ? get(i)==null : o.equals(get(i)))

* (if such an element exists).  Returns true if this list

* contained the specified element (or equivalently, if this list

* changed as a result of the call).

*

* @param o element to be removed from this list, if present

* @return true if this list contained the specified element

*/

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;

}

fastRemove(int index) 方法是快速删除,删除跳过边界检查的方法,也不返回删除的元素值

源码剖析

/*

* Private remove method that skips bounds checking and does not

* return the value removed.

*/

private void fastRemove(int index) {

modCount++;

int numMoved = size - index - 1;

if (numMoved > 0)

System.arraycopy(elementData, index+1, elementData, index,

numMoved);

elementData[--size] = null; // clear to let GC do its work

}

5. size() 方法

返回集合中的元素个数

源码剖析

/**

* Returns the number of elements in this list.

*

* @return the number of elements in this list

*/

public int size() {

return size;

}

6. indexOf(Object o) 方法

返回对象o在集合中第一次出现的位置的索引

源码剖析

/**

* Returns the index of the first occurrence of the specified element

* in this list, or -1 if this list does not contain the element.

* More formally, returns the lowest index i such that

* (o==null ? get(i)==null : o.equals(get(i))),

* or -1 if there is no such index.

*/

public int indexOf(Object o) {

// 如果查找的元素为空

if (o == null) {

// 循环遍历数组

for (int i = 0; i < size; i++)

// 如果 i 位置的原素为空

if (elementData[i]==null)

// 返回下标

return i;

// 否则,查找的元素不为空

} else {

// 循环遍历数组

for (int i = 0; i < size; i++)

// 找到第一个和要查找的元素相等的元素

if (o.equals(elementData[i]))

// 返回下标

return i;

}

// 返回 -1.则表示没有找到

return -1;

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入剖析ArrayList的底层源码-ArrayList 和 Vector 的区别(arraylist类的底层数据结构是数组结构)
下一篇:深入剖析ArrayList的底层源码-构造方法及其源码剖析(arraylist底层)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~