欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中ArrayList與順序表的概念與使用實例

 更新時間:2022年01月11日 09:35:51   作者:Solitudefire  
順序表是指用一組地址連續(xù)的存儲單元依次存儲各個元素,使得在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲在相鄰的物理存儲單元中的線性表,下面這篇文章主要介紹了Java?ArrayList與順序表的相關(guān)資料,需要的朋友可以參考下

前言

通過前面的博客我們已經(jīng)大致了解了關(guān)于Java的基本知識,而下面的幾篇博客我們著重開始對于數(shù)據(jù)結(jié)構(gòu)的知識進行學(xué)習(xí),這篇博客我們就了解關(guān)于順序表和ArrayList的相關(guān)知識,從名字上我們就可以看到ArrayList是數(shù)組鏈表,也就是我們總說的順序表。這是Java內(nèi)置的,因此不需要我們寫,這也方便了程序員的使用。那么面我們就來了解一下ArrayList順序表的相關(guān)知識。

在學(xué)習(xí)順序表之前呢,我們需要了解幾個概念。

泛型(Generic)

泛型的引入

問題: 我們在之前學(xué)習(xí)順序表的時候,只能保存int類型的元素,如果現(xiàn)在我們需要保存Person類型對象的引用順序表,那么我們該如何解決呢?

回答:

  • 首先,我們在學(xué)習(xí)多態(tài)過程中已知一個前提,基類的引用可以指向子類的對象。
  • 其次,我們也已知Object是 java 中所有類的祖先類。

那么,解決這個問題我們就想到一個辦法,我們將順序表數(shù)組種元素類型定義為Object類型,這樣我們的Object類型的引用可以指向int類型的對象,也可以指向Person類型的對象。舉個例子:

public class MyArrayList {
	private Object[] array; // 保存順序表的元素,即 Object 類型的引用
	private int size; // 保存順序表內(nèi)數(shù)據(jù)個數(shù)
	
	public void add(Object o) { 
		尾插 
	}
	public Object get(int index) { 
		獲取 index 位置的元素 
	}
	...
}

現(xiàn)在的 MyArrayList 雖然可以做到添加任意類型的引用到其中了,但遇到以下代碼就會產(chǎn)生問題。

Person person = (Person)books.get(0);
// 將 Object 類型轉(zhuǎn)換為 Person 類型,需要類型轉(zhuǎn)換才能成功
// 這里編譯正確,但運行時會拋出異常 ClassCastException

此時的book對象的get()方法的返回值是Object類型因此我們需要強制轉(zhuǎn)化為Person類型才可以賦值給person對象,但是這只是編譯上通過,但是運行仍會報錯,因此引入了泛型這個概念。

泛型的基本概念

泛型分為兩類:

  1. 泛型類
  2. 泛型方法

什么是泛型類呢?我們來看一個例子:

public class MyArrayList<E> {
	private E[] array;
	private int size;
	...
}

在這個MyArrayList類中,我們可以看到后面跟了一個尖括號,這就是泛型的標志。有以下幾點需要注意:

  1. 尖括號 <> 是泛型的標志。
  2. E 是類型變量(Type Variable),變量名一般要大寫。
  3. E 在定義時是形參,代表的意思是 MyArrayList 最終傳入的類型,但現(xiàn)在還不知道。

也就是說我們在用這個類創(chuàng)建對象時,我們可以在類的尖括號中告訴編譯器你使用的是什么對象。比如:

// 定義了一個元素是 Book 引用的 MyArrayList
MyArrayList<Book> books = new MyArrayList<Book>();
books.add(new Book());
// 會產(chǎn)生編譯錯誤,Person 類型無法轉(zhuǎn)換為 Book 類型
books.add(new Person());
// 不需要做類型轉(zhuǎn)換
Book book = book.get(0);
// 不需要做類型轉(zhuǎn)換
// 會產(chǎn)生編譯錯誤,Book 類型無法轉(zhuǎn)換為 Person 類型
Person person = book.get(0);

我們可以看到,MyArrayList存放的是Book類型的引用,這是編譯器就可以達到類似Object的效果,存儲Book類型的對象,如果在里面又想放入Person類型的對象就會報錯。

總結(jié)

  1. 泛型是為了解決某些容器、算法等代碼的通用性而引入,并且能在編譯期間做類型檢查。
  2. 泛型利用的是 Object 是所有類的祖先類,并且父類的引用可以指向子類對象的特定而工作。
  3. 泛型是一種編譯期間的機制,即 MyArrayList< Person > 和MyArrayList< Book > 在運行期間是一個類型。
  4. 泛型是 java 中的一種合法語法,標志就是尖括號 <>。

包裝類(Wrapper Class)

包裝類的引入

我們知道Object引用可以指向任意類型的對象,但是8種基本數(shù)據(jù)類型又不是對象,那么泛型就無法對這8種基本數(shù)據(jù)類型失效了。因此為了解決這個問題java 引入了一類特殊的類,即這 8 種基本數(shù)據(jù)類型的包裝類,在使用過程中,會將類似int這樣的值包裝到一個對象中去。

基本數(shù)據(jù)類型與包裝類的對應(yīng)關(guān)系

基本數(shù)據(jù)類型包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

基本就是類型的首字母大寫,除了 Integer 和 Character。

ArrayList與順序表

ArrayList簡介

簡單了解了泛型和包裝類的知識,下面我們就正式學(xué)習(xí)ArrayList的相關(guān)知識。

在集合框架中,ArrayList是一個普通的類,實現(xiàn)了List接口,具體框架圖如下:

說明:

  1. ArrayList實現(xiàn)了RandomAccess接口,表明ArrayList支持隨機訪問。
  2. ArrayList實現(xiàn)了Cloneable接口,表明ArrayList是可以clone的。
  3. ArrayList實現(xiàn)了Serializable接口,表明ArrayList是支持序列化的。
  4. 和Vector不同,ArrayList不是線程安全的,在單線程下可以使用,在多線程中可以選擇Vector或者CopyOnWriteArrayList。
  5. ArrayList底層是一段連續(xù)的空間,并且可以動態(tài)擴容,是一個動態(tài)類型的順序表。

ArrayList使用

ArrayList的構(gòu)造

方法解釋
ArrayList()無參構(gòu)造
ArrayList(Collection<? extends E> c)利用其他 Collection 構(gòu)建 ArrayList
ArrayList(int initialCapacity)指定順序表初始容量

舉個例子:

public static void main(String[] args) {
	// ArrayList創(chuàng)建,推薦寫法
	// 構(gòu)造一個空的列表
	List<Integer> list1 = new ArrayList<>();
	// 構(gòu)造一個具有10個容量的列表
	List<Integer> list2 = new ArrayList<>(10);
	list2.add(1);
	list2.add(2);
	list2.add(3);
	// list2.add("hello"); // 編譯失敗,List<Integer>已經(jīng)限定了,list2中只能存儲整形元素
	// list3構(gòu)造好之后,與list中的元素一致
	ArrayList<Integer> list3 = new ArrayList<>(list2);
	// 避免省略類型,否則:任意類型的元素都可以存放,使用時將是一場災(zāi)難
	List list4 = new ArrayList();
	list4.add("111");
	list4.add(100);
}

ArrayList常見方法 

方法解釋
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 位置元素設(shè)置為 element
void clear()清空
boolean contains(Object o)判斷 o 是否在線性表中
int indexOf(Object o)返回第一個 o 所在下標
int lastIndexOf(Object o)返回最后一個 o 的下標
List 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中有效元素個數(shù)
	System.out.println(list.size());
	// 獲取和設(shè)置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數(shù)據(jù)結(jié)構(gòu)");
	System.out.println(list);
	// 刪除指定元素,找到了就刪除,該元素之后的元素統(tǒng)一往前搬移一個位置
	list.remove("JVM");
	System.out.println(list);
	// 刪除list中index位置上的元素,注意index不要超過list中有效元素個數(shù),否則會拋出下標越界異常
	list.remove(list.size()-1);
	System.out.println(list);
	// 檢測list中是否包含指定元素,包含返回true,否則返回false
	if(list.contains("測試課程")){
		list.add("測試課程");
	}
	// 查找指定元素第一次出現(xiàn)的位置:indexOf從前往后找,lastIndexOf從后往前找
	list.add("JavaSE");
	System.out.println(list.indexOf("JavaSE"));
	System.out.println(list.lastIndexOf("JavaSE"));
	// 使用list中[0, 4)之間的元素構(gòu)成一個新的ArrayList返回
	List<String> ret = list.subList(0, 4);
	System.out.println(ret);
	list.clear();
	System.out.println(list.size());
}

運行結(jié)果:

ArrayList的遍歷

ArrayList 可以使用三方方式遍歷:for循環(huán)+下標、foreach、使用迭代器

代碼示例:

public static void main(String[] args) {
	List<Integer> list = new ArrayList<>();
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(5);
	// 使用下標+for遍歷
	for (int i = 0; i < list.size(); i++) {
		System.out.print(list.get(i) + " ");
	}
	System.out.println();
	// 借助foreach遍歷
	for (Integer integer : list) {
		System.out.print(integer + " ");
	}
	System.out.println();
	//使用迭代器
	Iterator<Integer> it = list.listIterator();
	while(it.hasNext()){
		System.out.print(it.next() + " ");
	}
	System.out.println();
}

運行結(jié)果:

關(guān)于ArrayList順序表的相關(guān)知識就是這么多,ArrayList使用起來是比較簡單的,但是細節(jié)上也是非常多的,而且還有一些其他的方法,我們可以通過源碼分析來看如何使用.

總結(jié)

到此這篇關(guān)于Java中ArrayList與順序表的文章就介紹到這了,更多相關(guān)Java ArrayList與順序表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)之隱式轉(zhuǎn)換vs強制轉(zhuǎn)換

    Java基礎(chǔ)之隱式轉(zhuǎn)換vs強制轉(zhuǎn)換

    這篇文章主要介紹了Java基礎(chǔ)之隱式轉(zhuǎn)換vs強制轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • java復(fù)制文件和java移動文件的示例分享

    java復(fù)制文件和java移動文件的示例分享

    本文主要介紹了java將文件夾下面的所有的jar文件拷貝到指定的文件夾下面的方法,需要的朋友可以參考下
    2014-02-02
  • Spring?AOP底層原理及代理模式

    Spring?AOP底層原理及代理模式

    這篇文章主要為大家介紹了Spring?AOP底層原理及代理模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java中的遞歸方法示例介紹

    Java中的遞歸方法示例介紹

    大家好,本篇文章主要講的是Java中的遞歸方法示例介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java實現(xiàn)視頻自定義裁剪功能

    Java實現(xiàn)視頻自定義裁剪功能

    這篇文章主要介紹了如何通過java實現(xiàn)視頻裁剪,可以將視頻按照自定義尺寸進行裁剪,文中的示例代碼簡潔易懂,感興趣的可以了解一下
    2022-01-01
  • idea如何快速查找一個類或類中方法名和變量

    idea如何快速查找一個類或類中方法名和變量

    這篇文章主要介紹了idea如何快速查找一個類或類中方法名和變量問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 如何解決異步任務(wù)上下文丟失問題

    如何解決異步任務(wù)上下文丟失問題

    在多線程編程中,異步任務(wù)可能會導(dǎo)致上下文信息丟失,為了解決這個問題,可以在執(zhí)行異步任務(wù)前,通過自定義TaskDecorator拷貝主線程的上下文至子線程,這樣可以確保上下文在異步執(zhí)行過程中得以保留,將定制的TaskDecorator設(shè)置至線程池,可以有效地解決上下文丟失問題
    2024-09-09
  • java中@ModelAttribute注解的作用

    java中@ModelAttribute注解的作用

    本文主要介紹了java中@ModelAttribute注解的作用。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java方法遞歸與輸入輸出深入探索

    Java方法遞歸與輸入輸出深入探索

    這篇文章主要介紹了Java方法遞歸與輸入輸出的相關(guān)資料,方法遞歸是一種在方法內(nèi)部調(diào)用自身的技術(shù),適用于具有遞歸結(jié)構(gòu)的問題,輸入輸出是Java程序與外部世界交互的橋梁,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Mybatis-Plus開發(fā)提速器generator的使用

    Mybatis-Plus開發(fā)提速器generator的使用

    本文就介紹這款基于Mybatis-Plus的代碼自助生成器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論