List有关知识与ArrayList的实现
1. 各種集合類之間的關系
- 1.可以看出List接口繼承自Collection接口, Collection接口又繼承自Iterable接口,即實現了迭代器的功能(遍歷方式可用)
- 2.ArrayList和LinkedList都繼承自AbstractList, 并且實現了List接口
所以現在我們來看一下ArrayList的常用方法
2. ArrayList的框架圖
首先我們來看一下ArrayList的具體框架圖
- 1 實現了RandomAccess
RandomAccess 是一個標記接口,用于標明實現該接口的List支持快速隨機訪問,主要目的是使算法能夠在隨機和順序訪問的list中表現的更加高效。 - 2 實現了Cloneable接口
實現Cloneable接口表示該對象能被克隆
克隆分為淺拷貝和深拷貝兩種,,淺拷貝是指拷貝對象時僅僅copy對象本身和對象中的基本變量,而不拷貝對象包含的引用指向的對象。深拷貝則拷貝引用中指向的對象 - 3 實現了Serializable接口
代表序列化,此處不多講,若有興趣可以自己查 - 4 實現了List接口
這樣就可以使用List接口中定義的方法
3 ArrayList的常用方法
List<Integer> al = new ArrayList<>();
1.public boolean add(E e)
在ArrayList對象中尾插一個元素進入,E e 代表泛型
2. public void add(int index, E element)
在指定位置插入一個元素,注意index必須介于[0, size)間
3.public boolean addAll(Collection<? extends E> c)
泛型寫法: 可以將包含繼承自E的對象的集合放入來添加
4.public E remove(int index)
刪除 index 位置元素
5.public boolean remove(Object o)
刪除遇到的第一個 o
6.public E get(int index)
獲取下標為index位置的元素
7.public E set(int index, E element)
將下標 index 位置元素設置為 element
8.public boolean contains(Object o)
判斷 o 是否在線性表中
9.public int indexOf(Object o)
返回第一個 o 所在下標
10public int lastIndexOf(Object o)
返回最后一個 o 的下標
11 public List<E> subList(int fromIndex, int toIndex)
截取部分List作為返回
具體使用
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("JavaSE");list.add("JavaWeb");list.add("JavaEE");list.add("JVM");list.add("測試課程");System.out.println(list);// 獲取list中有效元素個數System.out.println(list.size());// 獲取和設置index位置上的元素,注意index必須介于[0, size)間System.out.println(list.get(1));list.set(1, "JavaWEB");System.out.println(list.get(1));// 在list的index位置插入指定元素,index及后續的元素統一往后搬移一個位置list.add(1, "Java數據結構");System.out.println(list);// 刪除指定元素,找到了就刪除,該元素之后的元素統一往前搬移一個位置list.remove("JVM");System.out.println(list);// 刪除list中index位置上的元素,注意index不要超過list中有效元素個數,否則會拋出下標越界異常list.remove(list.size()-1);System.out.println(list);// 檢測list中是否包含指定元素,包含返回true,否則返回falseif(list.contains("測試課程")){list.add("測試課程");}// 查找指定元素第一次出現的位置:indexOf從前往后找,lastIndexOf從后往前找list.add("JavaSE");System.out.println(list.indexOf("JavaSE"));System.out.println(list.lastIndexOf("JavaSE"));// 使用list中[0, 3)之間的元素構成一個新的ArrayList返回List<String> ret = list.subList(0, 3);System.out.println(ret);list.clear();System.out.println(list.size()); }4. 自己動手實現一個ArrayList
package day20211015;import java.util.Arrays;public class MyArrayList<E> {private E[] elements;private int size;// 默認容量 10private static final int DEFAULT_CAPACITY = 10;// 構造方法public MyArrayList() {elements = (E []) new Object[DEFAULT_CAPACITY];}public MyArrayList(int capacity) {if (capacity <= 0) {capacity = DEFAULT_CAPACITY;}elements = (E [])new Object[capacity];}public int size() {return size;}public boolean add(E e) {// 考慮擴容問題//elements[size++] = e;//return true;add(size, e);return true;}public void add(int index, E e) {checkRange(index);// 考慮擴容問題ensureCapacity(size);for (int i = size-1; i >= index ; i--) {elements[i+1] = elements[i];}elements[index] = e;size++;}// ArrayList當中的擴容方式 :// 1. 先按照1.5倍的方式來計算newCapacity// 2. 如果newCapacity > MAX_ARRAY_SIZE 按照MAX_ARRAY_SIZE 來擴容 沒有超過就按照1.5倍來public void ensureCapacity(int size) {int oldCapacity = elements.length;if (size > oldCapacity) {int newCapacity = oldCapacity + (oldCapacity >> 1);elements = Arrays.copyOf(elements, newCapacity);}}public int indexOf(E e) {for (int i = 0; i < size; i++) {// 引用類型需要使用equals方法if (e.equals(elements[i])) {return i;}}return -1;}public int lastIndexOf(E e) {for (int i = size-1; i >= 0 ; i--) {if (e.equals(elements[i])) {return i;}}return -1;}@Overridepublic String toString() {return Arrays.toString(elements);}public E remove(int index) {if (index < 0 || index >= size) {throw new ArrayIndexOutOfBoundsException("remove 下標越界");}E e = elements[index];for (int i = index+1; i < size; i++) {elements[i-1] = elements[i];}elements[size-1] = null;size--;return e;}public boolean remove(E e) {int index = indexOf(e);if (-1 == index) {return false;}remove(index);return true;}private void checkRange(int index) {if (index < 0 || index > size) {throw new ArrayIndexOutOfBoundsException("index 越界");}}public E get(int index) {checkRange(index);return elements[index];}public void set(int index, E e){checkRange(index);elements[index] = e;}public void clear() {for (int i = 0; i < size; i++) {elements[i] = null;}size = 0;}public boolean contains(E e) {return -1 != indexOf(e);}public MyArrayList<E> subList(int from, int to) {if (from > to) {throw new IllegalArgumentException("from > to");}else if (from < -1 || to > size) {throw new IllegalArgumentException("from需要大于0, to需要小于size");}int newSize = to - from;MyArrayList<E> list = new MyArrayList<>(newSize);while(from < to) {list.add(elements[from]);from++;}return list;} }總結
以上是生活随笔為你收集整理的List有关知识与ArrayList的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用gin和gorm框架完成的bubbl
- 下一篇: 排序算法(上)