Java中的ArrayList和順序表-創(chuàng)新互聯(lián)

文章目錄
  • 前言
  • 一、線性表
  • 二、順序表
  • 三、ArrayList的簡介
  • 四、ArrayList的使用
    • 4.1 ArrayList的構(gòu)造
    • 4.2 ArrayList常見操作
    • 4.3 ArrayList的遍歷
  • 五、ArrayList的擴容機制
  • 總結(jié)

和政網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,和政網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為和政上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的和政做網(wǎng)站的公司定做!
前言

以實踐為線索,逐步深入數(shù)據(jù)結(jié)構(gòu)和算法,提升編程能力和思維能力。


一、線性表

線性表是n個具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表有順序表、鏈表、棧、隊列…

線性表在邏輯上是線性結(jié)構(gòu),也就是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲時,通常以數(shù)組和鏈式結(jié)構(gòu)的形式存儲。

二、順序表

順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲。在數(shù)組上完成增刪改查。

三、ArrayList的簡介

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

【說明】

  1. ArrayList是以泛型方式實現(xiàn)的,使用時必須要先實例化
  2. ArrayList實現(xiàn)了RandomAccess接口,表明ArrayList支持隨機訪問
  3. ArrayList實現(xiàn)了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList實現(xiàn)了serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是線程安全的,在單線程下可以使用,在多線程中可以選擇Vector或者CopyOnWriteArrayList
  6. ArrayList底層是一段連續(xù)的空間,并且可以動態(tài)擴展,是一個動態(tài)類型的順序表
四、ArrayList的使用 4.1 ArrayList的構(gòu)造

無參構(gòu)造:

ArrayList()

利用其他Collection構(gòu)建ArrayList:

ArrayList(Collectionc)		

指定順序表初始化容量:

ArrayList(int initialCapacity)

代碼實例:

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

ArrayList實現(xiàn)了List接口,可以使用List中的方法,常用的方法已在上一篇文章介紹。詳情請見 Java中的List接口。

代碼實例:

public static void main(String[] args) {Listlist = 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)成一個新的SubList返回,但是和ArrayList共用一個elementData數(shù)組
	Listret = list.subList(0, 4);
	System.out.println(ret);
	
	list.clear();
	System.out.println(list.size());
}
4.3 ArrayList的遍歷

ArrayList可以使用三種方式進行遍歷:for循環(huán)、foreach(增強for循環(huán))、使用迭代器。

代碼實例:

public static void main(String[] args) {Listlist = 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();
	
	//使用迭代器
	Iteratorit = list.listIterator();
	while(it.hasNext()){System.out.print(it.next() + " ");
	}
	System.out.println();
}

注意:

  1. ArrayList最常使用的遍歷方式是for循環(huán)和foreach
  2. 迭代器是設(shè)計模式的一種
五、ArrayList的擴容機制

ArrayList是一個動態(tài)類型的順序表,即:在插入元素的過程中會自動擴容。

以下是ArrayList源碼中擴容方式:

Object[] elementData; // 存放元素的空間
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 默認空間
private static final int DEFAULT_CAPACITY = 10; // 默認容量大小

public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!
	elementData[size++] = e;
	return true;
}

private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);
	}
	return minCapacity;
}

private void ensureExplicitCapacity(int minCapacity) {modCount++;
	// overflow-conscious code
	if (minCapacity - elementData.length >0)
		grow(minCapacity);
}

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

private void grow(int minCapacity) {// 獲取舊空間大小
	int oldCapacity = elementData.length;
	
	// 預計按照1.5倍方式擴容
	int newCapacity = oldCapacity + (oldCapacity >>1);
	
	// 如果用戶需要擴容大小 超過 原空間1.5倍,按照用戶所需大小擴容
	if (newCapacity - minCapacity< 0)
		newCapacity = minCapacity;
		
		// 如果需要擴容大小超過MAX_ARRAY_SIZE,重新計算容量大小
	if (newCapacity - MAX_ARRAY_SIZE >0)
		newCapacity = hugeCapacity(minCapacity);
		
		// 調(diào)用copyOf擴容
	elementData = Arrays.copyOf(elementData, newCapacity);
}

private static int hugeCapacity(int minCapacity) {// 如果minCapacity小于0,拋出OutOfMemoryError異常
	if (minCapacity< 0)
		throw new OutOfMemoryError();
	return (minCapacity >MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}
總結(jié)

以上就是今天要講的內(nèi)容,本文介紹了順序表和ArrayList的使用,這是數(shù)據(jù)結(jié)構(gòu)和算法中重要的知識內(nèi)容,在學習過程中,我們要多實踐、多敲代碼。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站欄目:Java中的ArrayList和順序表-創(chuàng)新互聯(lián)
URL鏈接:http://bm7419.com/article0/dscjoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站收錄網(wǎng)站導航、虛擬主機電子商務(wù)、手機網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司