<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在集合框架中,ArrayList是一個普通的類,實現了List介面,具體框架圖如下:
ArrayList底層是一段連續的空間,並且可以動態擴容,是一個動態型別的順序表。
方法 | 使用 |
---|---|
ArrayList() | 無參構造 |
ArrayList(Collection<? extends E> c) | 利用其他 Collection 構建 ArrayList |
ArrayList(int initialCapacity) | 指定順序表初始容量 |
public static void main(String[] args) { // 無參構造 List<Integer> list1 = new ArrayList<>(); // 給定初始容量 List<Integer> list2 = new ArrayList<>(10); // 使用另外一個 ArrayList對其初始化 List<Integer> list3 = new ArrayList<>(list2); list1.add(1); list1.add(2); list1.add(3); // 其父類別 AbstractCollection重寫了 toString方法 System.out.println(list1);// 輸出 [1, 2, 3] }
1、遍歷順序表
2、for - each(實現了Iterable介面)
3、迭代器(實現了Iterable介面)
// 遍歷順序表 for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i)); } // for - each 遍歷 for (String s : list) { System.out.print(s); } // 迭代器列印 // 獲取迭代器物件 Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { // 獲取下一個物件 String next = iterator.next(); // 列印 System.out.print(next); } // listIterator ---- 實現了 Iterator 介面 ListIterator<String> iterator2 = list.listIterator(); while (iterator2.hasNext()) { String next = iterator2.next(); System.out.print(next); }
這裡的 listIterator 實現了 Iterator 介面,從方法上,listIterator 有更多的功能(方法),例如在遍歷的時候,進行新增元素 add()。
ListIterator<String> iterator2 = list.listIterator(); while (iterator2.hasNext()) { String next = iterator2.next(); if (next.equals("hello")) { iterator2.add("三團");// 在 hello 的後面新增 三團 }else{ System.out.print(next + " "); } } System.out.println(list);// [hello, 三團, bit, world]
方法 | 解釋 |
---|---|
boolean add(E e) | 尾插 e |
void add(int index, E element) | 將 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 將集合 c 中的元素 尾插到該集合中 |
E remove(int index) | 刪除 index 位置元素並返回 |
boolean remove(Object o) | 刪除遇到的第一個 o |
E get(int index) | 獲取下標 index 位置元素 |
E set(int index, E element) | 將下標 index 位置元素設定為 element |
void clear() | 清空順序表 |
boolean contains(Object o) | 判斷 o 是否線上性表中 |
int indexOf(Object o) | 返回第一個 o 所在下標 |
int lastIndexOf(Object o) | 返回最後一個 o 的下標 |
List< E > subList(int fromIndex, int toIndex) | 擷取部分 list |
List<String> list = new ArrayList<>(); List<String> listAdd = new ArrayList<>(); listAdd.add("hello"); listAdd.add("world"); listAdd.add("你好~"); list.add("哈哈");// 尾插元素 list.add(0,"你好"); // 0 下標插入 "你好 " list.addAll(listAdd);// 將集合 listAdd 中的元素尾插到該集合中 String s = list.remove(0);// 刪除 index 位置元素並返回 boolean s2 = list.remove("hello");// 刪除遇到的第一個 hello,沒找到則返回 false list.set(0,"we"); list.indexOf("we");//返回第一個 "we" 所在下標 list.lastIndexOf("we");// 返回最後一個 "we" 的下標 System.out.println(list); // 擷取子串 -- 左閉右開區間 List<String> sub = list.subList(1, 3); System.out.println(sub); list.set(2,"修改後的list"); System.out.println(sub);
注意: 這裡的 subList方法,並不是真正的返回一個擷取部分的新地址,而是將原地址的擷取部分返回,所以當修改原來的線性表中的元素時,子串中的內容也會發生改變。
1、當呼叫無參構造時,即List< String > list = new ArrayList<>(),底層還沒有分配真正的記憶體(初始化是一個空陣列),初始容量為 0。當第一次新增元素(呼叫 add 方法) 時,整個順序表的容量被擴充為10,放滿後,以 1.5 倍擴容。
2、當呼叫帶容量的構造方法時,例如 List< String > list = new ArrayList<>(16),順序表初始容量就為16,放滿後以 1.5 倍擴容。
結論
如果呼叫無參構造方法,順序表初始大小為0,當第一次放入元素時,整個順序表容量變為10,當放滿10個元素,進行1.5倍擴容。
如果呼叫給定容量的構造方法,初始大小就是給定的容量,當放滿了,就進行1.5倍擴容。
public class MyArrayList<E> { private Object[] elementData;// 陣列 private int usedSize;// 代表有效的資料個數 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; public MyArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } public MyArrayList(int capacity) { // 判斷引數的合法性 if (capacity >= 0) { this.elementData = new Object[capacity]; }else { throw new RuntimeException("初始化的容量不能為負數!"); } } /** * 新增元素 * @param e 要新增的元素 */ public boolean add(E e) { // 確定一個真正的容量,預測 -> 如需擴容則擴容 ensureCapacityInternal(usedSize + 1); // 擴容完畢,放資料 elementData[usedSize++] = e; return true; } /** * 給 index位置新增元素 * @param index * @param e */ public boolean add(int index, E e) { // 檢查 index 是否合法 rangeCheckForAdd(index); // 確定一個真正的容量 -> 如需擴容則擴容 ensureExplicitCapacity(usedSize + 1); // 移動 index後面的元素,並在 index位置插入元素 copy(index,e); usedSize++; return true; } private void copy(int index, E e){ for (int i = usedSize; i > index; i--) { elementData[i] = elementData[i - 1]; } elementData[index] = e; } private void rangeCheckForAdd(int index) { if (index > usedSize || index < 0) throw new IndexOutOfBoundsException("index位置不合法!"); } public void ensureCapacityInternal(int minCapacity) { // 計算出需要的容量 int capacity = calculateCapacity(elementData, minCapacity); // 根據計算出的容量,看是否需要擴容或者分配記憶體 ensureExplicitCapacity(capacity); } private void ensureExplicitCapacity(int minCapacity) { // 如果需要的容量大於陣列容量,就擴容 if (minCapacity - elementData.length > 0) // 擴容 grow(minCapacity); } private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 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);; 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; } private static int calculateCapacity(Object[] elementData, int minCapacity) { // 確定之前陣列是否分配過記憶體,沒有的話返回一個初始化的容量 10 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(10, minCapacity); } // 分配後,返回 +1 後的值,即實際所需要的容量 return minCapacity; } }
到此這篇關於Java 資料結構深入理解ArrayList與順序表的文章就介紹到這了,更多相關Java ArrayList內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45