1.List接口介紹
- List是有序的 Collection(也稱為序列)。此接口的用戶可以對列表中每個元素的
插入位置進行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪
問元素,并搜索列表中的元素。與 set 不同,列表通常允許重復(fù)的元素。
- List接口的特點:
1) 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33,那么集
合中元素的存儲就是按照11、22、33的順序完成的。
2)它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數(shù)組
的索引是一個道理)。
3)集合中可以有重復(fù)的元素,通過元素的equals方法,來比較是否為重復(fù)的元素。
- List接口的常用子類有:
1 ) ArrayList集合
2 ) LinkedList集合
3 ) Vector集合
1.1常用方法
| Modifier and Type | Method and Description |
|---|---|
boolean |
add(E e) 將指定的元素追加到此列表的末尾。 |
void |
add(int index, E element) 在此列表中的指定位置插入指定的元素。 |
void |
clear() 從列表中刪除所有元素。 |
boolean |
contains(Object o) 如果此列表包含指定的元素,則返回 true 。 |
E |
get(int index) 返回此列表中指定位置的元素。 |
boolean |
isEmpty() 如果此列表不包含元素,則返回 true 。 |
Iterator<E> |
iterator() 以正確的順序返回該列表中的元素的迭代器。 |
E |
remove(int index) 刪除該列表中指定位置的元素。 |
boolean |
remove(Object o) 從列表中刪除指定元素的第一個出現(xiàn)(如果存在)。 |
boolean |
removeAll(Collection<?> c) 從此列表中刪除指定集合中包含的所有元素。 |
E |
set(int index, E element) 用指定的元素替換此列表中指定位置的元素。 |
int |
size() 返回此列表中的元素數(shù)。 |
2.ArraysList
2.1介紹
ArrayList集合數(shù)據(jù)存儲的結(jié)構(gòu)是數(shù)組結(jié)構(gòu)。元素增刪慢,查找快,由于日常開
發(fā)中使用最多的功能為查詢數(shù)據(jù)、遍歷數(shù)據(jù),所以ArrayList是最常用的集合。
許多程序員開發(fā)時非常隨意地使用ArrayList完成任何需求,并不嚴謹,這種用
法是不提倡的。
2.2代碼示例
package Collection_list_map.list;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
class Teacher{
private String name;//老師姓名
private String no;//老師工號
public Teacher(String name, String no) {
this.name = name;
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", no='" + no + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
return Objects.equals(this.name, teacher.name) &&
Objects.equals(this.no, teacher.no);
}
}
public class ArraysList {
public static void main(String[] args) {
Teacher t1 = new Teacher("wcq","35");
Teacher t2 = new Teacher("kql","36");
Teacher t3 = new Teacher("hej","34");
Teacher t4 = new Teacher("wcq","35");
List<Teacher> list = new ArrayList<Teacher>();
list.add(t1);
list.add(t2);
list.add(t3);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
System.out.println(list.get(i));
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(list.get(1).toString());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
list.remove(2);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(list.isEmpty());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(list.contains(t1));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(list.contains(t4));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
list.clear();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
System.out.println("說明沒有數(shù)據(jù)");
}
}
運行結(jié)果:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Teacher{name='wcq', no='35'}
Teacher{name='wcq', no='35'}
Teacher{name='kql', no='36'}
Teacher{name='kql', no='36'}
Teacher{name='hej', no='34'}
Teacher{name='hej', no='34'}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Teacher{name='kql', no='36'}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Teacher{name='wcq', no='35'}
Teacher{name='kql', no='36'}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
false
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
true
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
true
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
說明沒有數(shù)據(jù)
2.3 底層結(jié)構(gòu)
- ArrayList底層的數(shù)據(jù)結(jié)構(gòu)使用的是數(shù)組。
這種數(shù)據(jù)結(jié)構(gòu)的特點是:
1)查找元素快:通過索引,可以快速訪問指定位置的元素
-
增刪元素慢:
2.1)指定索引位置增加元素:需要創(chuàng)建一個新數(shù)組,將指定新元素存儲在指定索引位置,再把原數(shù)組元素根據(jù)索引,復(fù)制到新數(shù)組對應(yīng)索引的位置。
2.2) 指定索引位置刪除元素:需要創(chuàng)建一個新數(shù)組,把原數(shù)組元素根據(jù)索引,復(fù)制到新數(shù)組對應(yīng)索引的位置,原數(shù)組中指定索引位置元素不復(fù)制到新數(shù)組中。
1659022528972.png
2.4contains方法檢查元素是否重復(fù)
ArrayList的contains方法判斷元素是否存在,判斷的原理如下:
ArrayList的contains方法被調(diào)用時,用傳入元素的equals方法依次與集合中的舊元素進行比較,根據(jù)返回的布爾值判斷是否有重復(fù)元素。此時,當(dāng)ArrayList存放自定義類型時,由于自定義類型在未重寫equals方法前,判斷是否重復(fù)的依據(jù)是地址值,所以如果想根據(jù)內(nèi)容判斷是否為重復(fù)元素,需要重寫元素的equals方法。
- Teacher類未重寫equals方法前,判斷集合中是否包含指定的老師
public static void main(String[] args) {
//1:創(chuàng)建兩個工號和姓名相同老師對象
Teacher t1 = new Teacher("02", "劉邦");
Teacher t2 = new Teacher("02", "劉邦");
//2:創(chuàng)建老師集合
List<Teacher> list =new ArrayList<Teacher>();
//3:向集合中添加t1老師
list.add(t1);
//4:判斷l(xiāng)ist集合中是否有t2老師
System.out.println(list.contains(t2));//結(jié)果是false
}
最后一行代碼 t2調(diào)用equals方法與list集合中的每一個對象比較,默認比較內(nèi)存地址編號。
- 在老師類中重新equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
return Objects.equals(this.name, teacher.name) &&
Objects.equals(this.no, teacher.no);
}
Teacher類重寫equals方法后,再次運行程序
public static void main(String[] args) {
//1:創(chuàng)建兩個工號和姓名相同老師對象
Teacher t1 = new Teacher("02", "劉邦");
Teacher t2 = new Teacher("02", "劉邦");
//2:創(chuàng)建老師集合
List<Teacher> list =new ArrayList<Teacher>();
//3:向集合中添加t1老師
list.add(t1);
//4:判斷l(xiāng)ist集合中是否有t2老師
System.out.println(list.contains(t2));//結(jié)果是true
}
最后一行 t2調(diào)用equals方法與list集合中的每一個對象比較,調(diào)用的是重寫后的equals方法。
3.Vector
Vector集合數(shù)據(jù)存儲的結(jié)構(gòu)是數(shù)組結(jié)構(gòu),為JDK中最早提供的集合。Vector中提
供了一個獨特的取出方式,就是枚舉Enumeration,它其實就是早期的迭代器。
此接口Enumeration的功能與 Iterator 接口的功能是類似的。Vector集合已被
ArrayList替代。枚舉Enumeration已被迭代器Iterator替代。
Vector與ArrayList不同的是Vector類是線程安全的,ArrayList是非線程安全的。
Vector的用法與ArrayList相同:
/**
* 使用Vector集合操作Teacher對象
*/
class Teacher {
private String name;//老師姓名
private String no;//老師工號
public Teacher(String name, String no) {
this.name = name;
this.no = no;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", no='" + no + '\'' +
'}';
}
}
public class Demo {
public static void main(String[] args) {
//1:創(chuàng)建三個老師對象
Teacher t1 = new Teacher("01", "朱元璋");
Teacher t2 = new Teacher("02", "劉邦");
Teacher t3 = new Teacher("03", "李自成");
//2:創(chuàng)建老師集合
List<Teacher> list = new Vector<>();
//3:向集合中添加老師
list.add(t1);
list.add(t2);
list.add(t3);
//4:迭代(遍歷)老師
System.out.println("======================");
show(list);
//5:從集合中獲取第一個老師
System.out.println("======================");
Teacher t = list.get(0);
System.out.println(t);
//6:刪除第一個老師
list.remove(0);
System.out.println("======================");
show(list);
//7:顯示集合中老師的人數(shù)
System.out.println(list.size());
//8:集合中有老師嗎
System.out.println(list.isEmpty());
//9:查找劉邦老師
System.out.println(list.contains(t2));
//10:逐一刪除集合中的數(shù)據(jù)
int last = list.size();
for (int i = 0; i < last; i++) {
list.remove(0);
}
//11:批量刪除
list.clear();
System.out.println("======================");
show(list);
}
private static void show(List<Teacher> list) {
Iterator<Teacher> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
4.LinkedList類
4.1介紹
LinkedList集合數(shù)據(jù)存儲的結(jié)構(gòu)是鏈表結(jié)構(gòu)。方便元素添加、刪除的集合。實際開發(fā)中對一個集合元素的添加與刪除經(jīng)常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
LinkedList類是List的子類,List中的方法LinkedList都是可以使用。在開發(fā)時,LinkedList集合也可以作為棧,隊列的結(jié)構(gòu)使用,LinkedList類為棧和隊列操作提供了相應(yīng)的方法。
4.2常用方法
| Modifier and Type | Method and Description |
|---|---|
boolean |
add(E e) 將指定的元素追加到此列表的末尾。 |
void |
add(int index, E element) 在此列表中的指定位置插入指定的元素。 |
void |
addFirst(E e) 在該列表開頭插入指定的元素。 |
void |
addLast(E e) 將指定的元素追加到此列表的末尾。 |
void |
clear() 從列表中刪除所有元素。 |
boolean |
contains(Object o) 如果此列表包含指定的元素,則返回 true 。 |
E |
get(int index) 返回此列表中指定位置的元素。 |
E |
getFirst() 返回此列表中的第一個元素。 |
E |
getLast() 返回此列表中的最后一個元素。 |
E |
pop() 從此列表表示的堆棧中彈出一個元素。 |
void |
push(E e) 將元素推送到由此列表表示的堆棧上。 |
E |
remove() 檢索并刪除此列表的頭(第一個元素)。 |
E |
remove(int index) 刪除該列表中指定位置的元素。 |
boolean |
remove(Object o) 從列表中刪除指定元素的第一個出現(xiàn)(如果存在)。 |
E |
removeFirst() 從此列表中刪除并返回第一個元素。 |
E |
removeLast() 從此列表中刪除并返回最后一個元素。 |
E |
set(int index, E element) 用指定的元素替換此列表中指定位置的元素。 |
int |
size() 返回此列表中的元素數(shù)。 |
Object[] |
toArray() 以正確的順序(從第一個到最后一個元素)返回一個包含此列表中所有元素的數(shù)組。 |
<T> T[] |
toArray(T[] a) 以正確的順序返回一個包含此列表中所有元素的數(shù)組(從第一個到最后一個元素); |
4.3代碼演示
List中的方法LinkedList都是可以使用,這里不再給出例子,請參考ArrayList類的代碼演示。
在這里給出LinkedList的特有操作方法。
public static void main(String[] args) {
//1:創(chuàng)建兩個工號和姓名相同老師對象
Teacher t1 = new Teacher("01", "朱元璋");
Teacher t2 = new Teacher("02", "劉邦");
Teacher t3 = new Teacher("03", "李自成");
//2:創(chuàng)建老師集合
LinkedList<Teacher> list =new LinkedList<>();
//添加元素
list.addFirst(t1);
list.addFirst(t2);
list.addLast(t3);
//獲取元素
System.out.println(list.getFirst());
System.out.println(list.getLast());
//刪除元素
System.out.println(list.removeFirst());
System.out.println(list.removeLast());
while(!list.isEmpty()){ //判斷集合是否為空
System.out.println(list.pop()); //彈出集合中的棧頂元素,棧頂元素從集合中被移除
}
}
4.4底層數(shù)據(jù)結(jié)構(gòu)
LinkedList底層的數(shù)據(jù)結(jié)構(gòu)使用的是鏈表。
這種數(shù)據(jù)結(jié)構(gòu)的特點是:
- 查找元素慢:想查找某個元素,需要通過連接的節(jié)點,依次向后查找指定元素
- 增刪元素快:增加元素,只需要修改連接下個元素的地址即可,所有元素?zé)o需移動位置
-
刪除元素快:只需要修改連接下個元素的地址即可,所有元素?zé)o需移動位置
1659097989359.png

