以實踐為線索,逐步深入數(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接口,具體框架圖如下:
【說明】
無參構(gòu)造:
ArrayList()
利用其他Collection構(gòu)建ArrayList:
ArrayList(Collection extends E>c)
指定順序表初始化容量:
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();
}
注意:
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)
猜你還喜歡下面的內(nèi)容