日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

List有关知识与ArrayList的实现

發(fā)布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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及后續(xù)的元素統(tǒng)一往后搬移一個位置list.add(1, "Java數據結構");System.out.println(list);// 刪除指定元素,找到了就刪除,該元素之后的元素統(tǒng)一往前搬移一個位置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的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。