以實(shí)踐為線索,逐步深入數(shù)據(jù)結(jié)構(gòu)和算法,提升編程能力和思維能力。
線性表是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見(jiàn)的線性表有順序表、鏈表、棧、隊(duì)列…
線性表在邏輯上是線性結(jié)構(gòu),也就是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲(chǔ)時(shí),通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲(chǔ)。
二、順序表順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。在數(shù)組上完成增刪改查。
三、ArrayList的簡(jiǎn)介在集合框架中,ArrayList是一個(gè)普通的類(lèi),實(shí)現(xiàn)了List接口,具體框架圖如下:
【說(shuō)明】
無(wú)參構(gòu)造:
ArrayList()
利用其他Collection構(gòu)建ArrayList:
ArrayList(Collection extends E>c)
指定順序表初始化容量:
ArrayList(int initialCapacity)
代碼實(shí)例:
public static void main(String[] args) {// ArrayList創(chuàng)建,推薦寫(xiě)法
// 構(gòu)造一個(gè)空的列表
Listlist1 = new ArrayList<>();
// 構(gòu)造一個(gè)具有10個(gè)容量的列表
Listlist2 = new ArrayList<>(10);
list2.add(1);
list2.add(2);
list2.add(3);
// list2.add("hello"); // 編譯失敗,List已經(jīng)限定了,list2中只能存儲(chǔ)整形元素
// list3構(gòu)造好之后,與list中的元素一致
ArrayListlist3 = new ArrayList<>(list2);
// 避免省略類(lèi)型,否則:任意類(lèi)型的元素都可以存放,使用時(shí)將是一場(chǎng)災(zāi)難
List list4 = new ArrayList();
list4.add("111");
list4.add(100);
}
4.2 ArrayList常見(jiàn)操作ArrayList實(shí)現(xiàn)了List接口,可以使用List中的方法,常用的方法已在上一篇文章介紹。詳情請(qǐng)見(jiàn) Java中的List接口。
代碼實(shí)例:
public static void main(String[] args) {Listlist = new ArrayList<>();
list.add("JavaSE");
list.add("JavaWeb");
list.add("JavaEE");
list.add("JVM");
list.add("測(cè)試課程");
System.out.println(list);
// 獲取list中有效元素個(gè)數(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)一往后搬移一個(gè)位置
list.add(1, "Java數(shù)據(jù)結(jié)構(gòu)");
System.out.println(list);
// 刪除指定元素,找到了就刪除,該元素之后的元素統(tǒng)一往前搬移一個(gè)位置
list.remove("JVM");
System.out.println(list);
// 刪除list中index位置上的元素,注意index不要超過(guò)list中有效元素個(gè)數(shù),否則會(huì)拋出下標(biāo)越界異常
list.remove(list.size()-1);
System.out.println(list);
// 檢測(cè)list中是否包含指定元素,包含返回true,否則返回false
if(list.contains("測(cè)試課程")){list.add("測(cè)試課程");
}
// 查找指定元素第一次出現(xiàn)的位置:indexOf從前往后找,lastIndexOf從后往前找
list.add("JavaSE");
System.out.println(list.indexOf("JavaSE"));
System.out.println(list.lastIndexOf("JavaSE"));
// 使用list中[0, 4)之間的元素構(gòu)成一個(gè)新的SubList返回,但是和ArrayList共用一個(gè)elementData數(shù)組
Listret = list.subList(0, 4);
System.out.println(ret);
list.clear();
System.out.println(list.size());
}
4.3 ArrayList的遍歷ArrayList可以使用三種方式進(jìn)行遍歷:for循環(huán)、foreach(增強(qiáng)for循環(huán))、使用迭代器。
代碼實(shí)例:
public static void main(String[] args) {Listlist = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用下標(biāo)+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();
}
注意:
ArrayList是一個(gè)動(dòng)態(tài)類(lèi)型的順序表,即:在插入元素的過(guò)程中會(huì)自動(dòng)擴(kuò)容。
以下是ArrayList源碼中擴(kuò)容方式:
Object[] elementData; // 存放元素的空間
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 默認(rèn)空間
private static final int DEFAULT_CAPACITY = 10; // 默認(rèn)容量大小
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;
// 預(yù)計(jì)按照1.5倍方式擴(kuò)容
int newCapacity = oldCapacity + (oldCapacity >>1);
// 如果用戶需要擴(kuò)容大小 超過(guò) 原空間1.5倍,按照用戶所需大小擴(kuò)容
if (newCapacity - minCapacity< 0)
newCapacity = minCapacity;
// 如果需要擴(kuò)容大小超過(guò)MAX_ARRAY_SIZE,重新計(jì)算容量大小
if (newCapacity - MAX_ARRAY_SIZE >0)
newCapacity = hugeCapacity(minCapacity);
// 調(diào)用copyOf擴(kuò)容
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)和算法中重要的知識(shí)內(nèi)容,在學(xué)習(xí)過(guò)程中,我們要多實(shí)踐、多敲代碼。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:Java中的ArrayList和順序表-創(chuàng)新互聯(lián)
URL鏈接:http://www.rwnh.cn/article0/dscjoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站收錄、網(wǎng)站導(dǎo)航、虛擬主機(jī)、電子商務(wù)、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容