南哥帶你玩轉 Java 之 Java 集合--list
阿新 • • 發佈:2019-02-17
list
List 介面
List介面是一個有序的 Collection,使用此介面能夠精確的控制每個元素插入的位置,能夠通過索引
(元素在List中位置,類似於陣列的下標)來訪問List中的元素,第一個元素的索引為 0,而且允許有相同的元素。
List 介面例項儲存的是有序的,可以重複的元素。
List和陣列類似,可以動態增長,根據實際儲存的資料的長度自動增長List的長度。
查詢元素效率高,插入刪除效率低,因為會引起其他元素位置改變
<實現類有ArrayList,LinkedList,Vector> 。
ArrayList 和 LinkedList 的區別
ArrayList: 陣列實現
陣列實現特點:查詢快,增刪慢(參照 LinkedList)
查詢:直接使用角標查詢
增刪:需要把要新增的元素的位置,後面的元素全部移動一位
LinkedList:連結串列實現
連結串列實現特點:查詢慢,增刪快
查詢:判斷離頭近還是尾近,然後從頭或尾,一個個查詢,找到為止
增刪:將要插入/移除的元素的地址儲存/刪除,後面的元素不用進行任何操作
陣列查詢和連結串列查詢的區別
思考:
什麼時候使用 ArrayList?
查詢多的時候
什麼時候使用 LinkedList?
增刪多的時候
工作中一般使用什麼呢?
ArrayList
list 介面中常用方法
private static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 使用 list 中的新增方法 add(int index, Object object)
// 新增的角標就是後面元素所在的位置,不能越界
list.add(4, "x");
System.out.println(list);
// 通過角標獲取對應的元素
Object object = list.get(2);
System. out.println(object);
// 通過 get 方法進行遍歷
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// set 方法(不要越界)
list.set(0, "z");
System.out.println(list);
// 根據角標刪除(Object remove = list.remove(3);中 remove 返回的是被刪除的元素, list 剩下沒被刪除的元素)
list.remove(3);
System.out.println(list);
// 注意:刪除方法需要注意的
List list1 = new ArrayList();
list1.add(111);// 進行自動裝箱
list1.add(222);
list1.add(333);
// 刪除111元素
list1.remove(0);// 第一種方法
// 這裡刪除的時候,系統不會進行自動裝箱,按照角標傳入的方法
// 所以呼叫的是按角標刪除的方法,所以越界
// list.remove(111);// 錯誤方法
// 如果非要使用按元素刪除,需要手動裝箱
list1.remove(Integer.valueOf(111));// 第二種方法
System.out.println(list1);
}
發生併發修改異常
private static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 新增完四個元素,這時集合長度為4
// 使用迭代器遍歷時,長度必須是固定的,不可改變
// 獲取集合迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals("b")) {
// 發生異常 ConcurrentModificationException(併發修改異常)
// 注意:在迭代器遍歷的時候,不要直接使用集合做操作
list.add("oh-yes");// 相當於修改集合長度
// 如何解決
// 直接把要新增的元素讓迭代器新增
}
}
System.out.println(list);
}
解決併發修改異常
思路:讓迭代器去完成新增元素
private static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 取出 list 特有的迭代器
ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()) {
if (listIterator.next().equals("b")) {
// 讓迭代器向集合中新增元素
listIterator.add("Oh~Yes");
}
}
System.out.println(list);
// 注意:在迭代器中,進行對集合的新增或刪除,要使用迭代器中的方法,不能直接使用集合去操作
}
public static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
ListIterator listIterator = list.listIterator();
// 正向
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
listIterator = list.listIterator(list.size());
// 逆向
// hasPrevious 判斷前一個元素有沒有
while (listIterator.hasPrevious()) {
// 獲取前一個元素
System.out.println(listIterator.previous());
}
}
Vector(使用陣列來實現的,已經被 ArrayList 替代)
private static void fun5() {
// 建立一個 vector 集合,迭代器遍歷
Vector vector = new Vector();
// 新增元素
vector.addElement("a");
vector.addElement("b");
vector.addElement("c");
vector.addElement("d");
System.out.println(vector);
// 迭代器遍歷
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
// 輸出元素
System.out.println(elements.nextElement());
}
}
LinkedList
private static void fun6() {
LinkedList linkedList = new LinkedList();
// 使用 addFirst 方法新增
// linkedList.addFirst("a");
// linkedList.addFirst("b");
// linkedList.addFirst("c");
// linkedList.addFirst("d");
// 使用 addLast 方法新增
linkedList.addLast("a");
linkedList.addLast("b");
linkedList.addLast("c");
linkedList.addLast("d");
System.out.println(linkedList);
// 獲取頭尾元素
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
}
佇列和棧
佇列和棧
佇列的特點:先進先出
棧的特點:先進後出
使用 LinkedList 模擬棧結構
private static void fun1() {
LinkedList linkedList = new LinkedList();
// 新增元素A,B,C,D模擬進棧
linkedList.addLast("A");
linkedList.addLast("B");
linkedList.addLast("C");
linkedList.addLast("D");
System.out.println(linkedList);
// 模擬出棧
// 每次刪之前檢視一下這個集合是否為空的
while (!linkedList.isEmpty()) {
linkedList.removeLast();
System.out.println(linkedList);
}
}
ArrayList 去重
public static void fun2() {
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("b");
arrayList.add("b");
arrayList.add("c");
arrayList.add("c");
arrayList.add("c");
System.out.println(arrayList);
// 建立個新陣列
ArrayList arrayList1 = new ArrayList();
// 遍歷原陣列,取出每一個元素,比對是否存在於新陣列中,不存在則放入,存在就放棄
// 原陣列迭代器
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
// 判斷原陣列中元素是否存在於新陣列中
// 不存在就新增入新陣列中,否則放棄
Object next = iterator.next();// 不能呼叫兩次 next() 方法
if (!arrayList1.contains(next)) {
// 將元素新增到新陣列中
arrayList1.add(next);
}
}
System.out.println(arrayList1);
}
去除重複的學生
public static void fun3() {
ArrayList arrayList = new ArrayList();
// 六個學生的地址都不一樣,所以不是同一個物件
arrayList.add(new Student("鵬鵬", 18));
arrayList.add(new Student("鵬鵬", 18));
arrayList.add(new Student("水水", 17));
arrayList.add(new Student("水水", 17));
arrayList.add(new Student("茜茜", 16));
arrayList.add(new Student("茜茜", 16));
Iterator iterator = arrayList.iterator();
ArrayList arrayList2 = new ArrayList();
while (iterator.hasNext()) {
Object next = iterator.next();
Student student = (Student)next;
if (!arrayList2.contains(student)) {
arrayList2.add(student);
}
}
for (Object object : arrayList2) {
Student student = (Student)object;
System.out.println(student);
}
}
public class Student {
private String name;// 姓名
private int age;// 年齡
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "[姓名:" + name + ", 年齡:" + age + "]";
}
// 重寫 equals 方法
@Override
public boolean equals(Object obj) {
// 比較的是地址
// return super.equals(obj);
// 現在需求比對姓名和年齡
Student student = (Student)obj;
return this.name.equals(student.getName()) && this.age == student.getAge();
}
}