1. 程式人生 > 其它 >16(01)總結List的子類,ArrayList,Vector,LinkedList

16(01)總結List的子類,ArrayList,Vector,LinkedList

1:List的子類(掌握)

(1)List的子類特點

ArrayList:

底層資料結構是陣列,查詢快,增刪慢

執行緒不安全,效率高

Vector:

底層資料結構是陣列,查詢快,增刪慢

執行緒安全,效率低

LinkedList:

底層資料結構是連結串列,查詢慢,增刪快

執行緒不安全,效率高

(2)ArrayList

A:沒有特有功能需要學習

B:案例

a:ArrayList儲存字串並遍歷

package cn.itcast_01;
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;
 }
}
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * 案例:
 *  使用List的任何子類儲存字串
 * 
 * ArrayList的使用。 
 *  儲存字串並遍歷
 */
public class ArrayListDemo {
 public static void main(String[] args) {
 // 建立集合物件
 ArrayList array = new ArrayList();
 // 建立元素物件,並新增元素
 array.add("hello");
 array.add("world");
 array.add("java");
 // 遍歷
 Iterator it = array.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 System.out.println(s);
 }
 System.out.println("-----------");
 for (int x = 0; x < array.size(); x++) {
 String s = (String) array.get(x);
 System.out.println(s);
 }
 }
}
 b:ArrayList儲存自定義物件並遍歷
package cn.itcast_01;
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;
 }
}
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * ArrayList儲存自定義物件並遍歷
 */
public class ArrayListDemo2 {
 public static void main(String[] args) {
 // 建立集合物件
 ArrayList array = new ArrayList();
 // 建立學生物件
 Student s1 = new Student("武松", 30);
 Student s2 = new Student("魯智深", 40);
 Student s3 = new Student("林沖", 36);
 Student s4 = new Student("楊志", 38);
 // 新增元素
 array.add(s1);
 array.add(s2);
 array.add(s3);
 array.add(s4);
 // 遍歷
 Iterator it = array.iterator();
 while (it.hasNext()) {
 Student s = (Student) it.next();
 System.out.println(s.getName() + "---" + s.getAge());
 }
 System.out.println("----------------");
 for (int x = 0; x < array.size(); x++) {
 // ClassCastException 注意,千萬要搞清楚型別
 // String s = (String) array.get(x);
 // System.out.println(s);
 Student s = (Student) array.get(x);
 System.out.println(s.getName() + "---" + s.getAge());
 }
 }
}

(3)Vector

A:有特有功能

a:新增

public void addElement(E obj) -- add()新增元素

b:獲取

public E elementAt(int index) -- get()獲取index 索引處對應的元素

public Enumeration<E> elements() -- iterator()遍歷Vector集合的方式,類似於迭代器

B:案例

a:Vector儲存字串並遍歷

b:Vector儲存自定義物件並遍歷

package cn.itcast_02;
import java.util.Enumeration;
import java.util.Vector;
/*
 * Vector的特有功能:
 * 1:新增功能
 *  public void addElement(Object obj) -- add()
 * 2:獲取功能
 *  public Object elementAt(int index) --  get()
 *  public Enumeration elements() -- Iterator iterator()
 *  boolean hasMoreElements() hasNext()
 *  Object nextElement() next()
 * 
 * JDK升級的原因:
 *  A:安全
 *  B:效率
 *  C:簡化書寫
 */
public class VectorDemo {
 public static void main(String[] args) {
 // 建立集合物件
 Vector v = new Vector();
 // 新增功能
 v.addElement("hello");
 v.addElement("world");
 v.addElement("java");
 // 遍歷
 for (int x = 0; x < v.size(); x++) {
 String s = (String) v.elementAt(x);
 System.out.println(s);
 }
 System.out.println("------------------");
 Enumeration en = v.elements(); // 返回的是實現類的物件
 while (en.hasMoreElements()) {
 String s = (String) en.nextElement();
 System.out.println(s);
 }
 }
}

(4)LinkedList A:有特有功能 a:新增 addFirst() addLast() b:刪除 removeFirst() removeLast()

c:獲取

getFirst()

getLast()

B:案例

a:LinkedList儲存字串並遍歷

b:LinkedList儲存自定義物件並遍歷

package cn.itcast_03;

import java.util.LinkedList;
/*
 * LinkedList的特有功能:
 *  A:新增功能
 *  public void addFirst(Object e)
 *  public void addLast(Object e)
 *  B:獲取功能
 *  public Object getFirst()
 *  public Obejct getLast()
 *  C:刪除功能
 *  public Object removeFirst()
 *  public Object removeLast()
 */
public class LinkedListDemo {
 public static void main(String[] args) {
 // 建立集合物件
 LinkedList link = new LinkedList();
 // 新增元素
 link.add("hello");
 link.add("world");
 link.add("java");
 // public void addFirst(Object e)
 // link.addFirst("javaee");
 // public void addLast(Object e)
 // link.addLast("android");
 // public Object getFirst()
 // System.out.println("getFirst:" + link.getFirst());
 // public Obejct getLast()
 // System.out.println("getLast:" + link.getLast());
 // public Object removeFirst()
 System.out.println("removeFirst:" + link.removeFirst());
 // public Object removeLast()
 System.out.println("removeLast:" + link.removeLast());
 // 輸出物件名
 System.out.println("link:" + link);
 }
}

(5)案例:

A:去除集合中的多個字串的重複元素

如果字串的內容相同,即為重複元素

package cn.itcast_04;

import java.util.ArrayList;
import java.util.Iterator;
/*
 * ArrayList去除集合中字串的重複值(字串的內容相同)
 * 
 * 分析:
 *  A:建立集合物件
 *  B:新增多個字串元素(包含內容相同的)
 *  C:建立新集合
 *  D:遍歷舊集合,獲取得到每一個元素
 *  E:拿這個元素到新集合去找,看有沒有
 *  有:不搭理它
 *  沒有:就新增到新集合
 *  F:遍歷新集合
 */
public class ArrayListDemo {
 public static void main(String[] args) {
 // 建立集合物件
 ArrayList array = new ArrayList();
 // 新增多個字串元素(包含內容相同的)
 array.add("hello");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("java");
 array.add("world");
 // 建立新集合
 ArrayList newArray = new ArrayList();
 // 遍歷舊集合,獲取得到每一個元素
 Iterator it = array.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 // 拿這個元素到新集合去找,看有沒有
 if (!newArray.contains(s)) {
 newArray.add(s);
 }
 }
 // 遍歷新集合
 for (int x = 0; x < newArray.size(); x++) {
 String s = (String) newArray.get(x);
 System.out.println(s);
 }
 }
}
package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * 需求:ArrayList去除集合中字串的重複值(字串的內容相同)
 * 要求:不能建立新的集合,就在以前的集合上做。
 */
public class ArrayListDemo2 {
 public static void main(String[] args) {
 // 建立集合物件
 ArrayList array = new ArrayList();
 // 新增多個字串元素(包含內容相同的)
 array.add("hello");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("java");
 array.add("world");
 // 由選擇排序思想引入,我們就可以通過這種思想做這個題目
 // 拿0索引的依次和後面的比較,有就把後的幹掉
 // 同理,拿1索引...
 for (int x = 0; x < array.size() - 1; x++) {
 for (int y = x + 1; y < array.size(); y++) {
 if (array.get(x).equals(array.get(y))) {
 array.remove(y);
 y--;
 }
 }
 }
 // 遍歷集合
 Iterator it = array.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 System.out.println(s);
 }
 }
}

B:去除集合中的多個自定義物件的重複元素

如果自定義物件的成員變數值都相同,即為重複元素

package cn.itcast_04;
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 boolean equals(Object obj) {
 if (this == obj)
 return true;
 if (obj == null)
 return false;
 if (getClass() != obj.getClass())
 return false;
 Student other = (Student) obj;
 if (age != other.age)
 return false;
 if (name == null) {
 if (other.name != null)
 return false;
 } else if (!name.equals(other.name))
 return false;
 return true;
 }
}
package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * 需求:去除集合中自定義物件的重複值(物件的成員變數值都相同)
 * 
 * 我們按照和字串一樣的操作,發現出問題了。
 * 為什麼呢?
 *  我們必須思考哪裡會出問題?
 *  通過簡單的分析,我們知道問題出現在了判斷上。
 *  而這個判斷功能是集合自己提供的,所以我們如果想很清楚的知道它是如何判斷的,就應該去看原始碼。
 * contains()方法的底層依賴的是equals()方法。
 * 而我們的學生類中沒有equals()方法,這個時候,預設使用的是它父親Object的equals()方法
 * Object()的equals()預設比較的是地址值,所以,它們進去了。因為new的東西,地址值都不同。
 * 按照我們自己的需求,比較成員變數的值,重寫equals()即可。
 * 自動生成即可。
 */
public class ArrayListDemo3 {
 public static void main(String[] args) {
 // 建立集合物件
 ArrayList array = new ArrayList();
 // 建立學生物件
 Student s1 = new Student("林青霞", 27);
 Student s2 = new Student("林志玲", 40);
 Student s3 = new Student("鳳姐", 35);
 Student s4 = new Student("芙蓉姐姐", 18);
 Student s5 = new Student("翠花", 16);
 Student s6 = new Student("林青霞", 27);
 Student s7 = new Student("林青霞", 18);
 // 新增元素
 array.add(s1);
 array.add(s2);
 array.add(s3);
 array.add(s4);
 array.add(s5);
 array.add(s6);
 array.add(s7);
 // 建立新集合
 ArrayList newArray = new ArrayList();
 // 遍歷舊集合,獲取得到每一個元素
 Iterator it = array.iterator();
 while (it.hasNext()) {
 Student s = (Student) it.next();
 // 拿這個元素到新集合去找,看有沒有
 if (!newArray.contains(s)) {
 newArray.add(s);
 }
 }
 // 遍歷新集合
 for (int x = 0; x < newArray.size(); x++) {
 Student s = (Student) newArray.get(x);
 System.out.println(s.getName() + "---" + s.getAge());
 }
 }
}

C:用LinkedList模擬一個棧資料結構的集合類,並測試。(認真思考)

你要定義一個集合類,只不過內部可以使用LinkedList來實現。

package cn.itcast_05;
import java.util.Iterator;
import java.util.LinkedList;
/*
 *請用LinkedList模擬棧資料結構的集合,並測試
 *題目的意思是:
 * 你自己的定義一個集合類,在這個集合類內部可以使用LinkedList模擬。
 */
public class LinkedListDemo {
 public static void main(String[] args) {
 // A: LinkedList的特有新增功能addFirst()
 // B:棧的特點先進後出
 // 建立集合物件
 // LinkedList link = new LinkedList();
 //
 // // 新增元素
 // link.addFirst("hello");
 // link.addFirst("world");
 // link.addFirst("java");
 //
 // // 遍歷
 // Iterator it = link.iterator();
 // while (it.hasNext()) {
 // String s = (String) it.next();
 // System.out.println(s);
 // }
 //為什麼呢?
 }
}
package cn.itcast_05;
import java.util.LinkedList;
/**
 * 自定義的棧集合
 * 
 * @author 風清揚
 * @version V1.0
 */
public class MyStack {
 private LinkedList link;
 public MyStack() {
 link = new LinkedList();
 }
 public void add(Object obj) {
 link.addFirst(obj);
 }
 public Object get() {
 // return link.getFirst();
 return link.removeFirst();
 }
 public boolean isEmpty() {
 return link.isEmpty();
 }
}
package cn.itcast_05;
/*
 * MyStack的測試
 */
public class MyStackDemo {
 public static void main(String[] args) {
 // 建立集合物件
 MyStack ms = new MyStack();
 // 新增元素
 ms.add("hello");
 ms.add("world");
 ms.add("java");
 // System.out.println(ms.get());
 // System.out.println(ms.get());
 // System.out.println(ms.get());
 // NoSuchElementException
 // System.out.println(ms.get());
 while(!ms.isEmpty()){
 System.out.println(ms.get());
 }
 }
}