16(01)總結List的子類,ArrayList,Vector,LinkedList
(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());
}
}
}