集合Collection的子介面——List包括List下 的三個子介面
一. List 的一些功能
import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* * void add(int index,Object element) //在指定索引位置新增元素 Object remove(int index) //刪除指定索引的元素,返回刪除的元素 Object get(int index) //獲取指定索引的元素 Object set(int index,Object element) //修改指定索引的元素,返回修改前的元素 ListIterator listIterator() //List特有的一種迭代器 */ public class ListDemo { public static void main(String[] args) { List l = new ArrayList(); l.add("hello"); l.add("world"); l.add("java"); // l.add("javaee"); // l.add("haha"); //void add(int index,Object element) //在指定索引位置新增元素 //l.add(1, "javaee"); //java.lang.IndexOutOfBoundsException //l.add(11,"haha"); //Object remove(int index) //刪除指定索引的元素 // System.out.println("remove:"+l.remove(2)); // System.out.println("remove:"+l.remove(3)); //java.lang.IndexOutOfBoundsException //System.out.println("remove:"+l.remove(11)); //Object get(int index) //獲取指定索引的元素 // System.out.println("get:"+l.get(1)); // System.out.println("get:"+l.get(3)); //java.lang.IndexOutOfBoundsException //System.out.println("get:"+l.get(11)); //Object set(int index,Object element) //修改指定索引的元素,返回修改前的元素 System.out.println("set:"+l.set(1, "world11")); System.out.println("set:"+l.set(1, "world")); System.out.println("l:"+l); // Iterator it = l.iterator(); // while(it.hasNext()){ // String s = (String)it.next(); // System.out.println(s); // } } }
二.List 字串的遍歷
(1)可以用Collection中的Iterator it = l.iterator();這個方法去遍歷、
import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* * List儲存字串並遍歷 */ public class ListDemo { public static void main(String[] args) { List l = new ArrayList(); l.add("hello"); l.add("world"); l.add("java"); System.out.println("l:"+l); Iterator it = l.iterator(); while(it.hasNext()){ String s = (String)it.next(); System.out.println(s); } } }
(2)List的for迴圈遍歷方式。通過get()方法和size()方法實現的
/* * List的for迴圈遍歷方式。通過get()方法和size()方法實現的 */ import java.util.ArrayList; import java.util.List; public class ListDemo2 { public static void main(String[] args) { List l = new ArrayList(); l.add("hello"); l.add("world"); l.add("java"); l.add("javaee"); l.add("haha"); System.out.println(l.get(0)); System.out.println(l.get(1)); System.out.println(l.get(2)); System.out.println(l.get(3)); System.out.println(l.get(4)); //System.out.println(l.get(5)); System.out.println("----------------"); // for(int i=0;i<5;i++){ // System.out.println(l.get(i)); // } //List的for迴圈遍歷方式。通過get()方法和size()方法實現的 for(int i=0;i<l.size();i++){ System.out.println(l.get(i)); } } }
(3)List特有的迭代器
三.List特有的迭代器
有獨特的功能相比較Coolection 中的 就是可以倒序輸出 有兩個注意點
(1)必須進行正序遍歷後才可以逆序
(2)逆序呼叫的那個用的是同一個用來接收的介面的那個 不可以在新建一個來接受 然後呼叫。
這個地方是看指標的 逆序需要判斷箭頭前有沒有東西
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
* List特有的迭代器
* ListIterator listIterator()
*/
public class ListDemo {
public static void main(String[] args) {
List l = new ArrayList();
l.add("hello");
l.add("world");
l.add("java");
ListIterator li = l.listIterator(); //返回子類物件
// while(li.hasNext()){
// String s = (String)li.next();
// System.out.println(s);
// }
System.out.println("----------------------");
// System.out.println("previous:"+li.previous());
// System.out.println("previous:"+li.previous());
// System.out.println("previous:"+li.previous());
while(li.hasPrevious()){
System.out.println("previous:"+li.previous());
}
System.out.println("----------------------");
Iterator it = l.iterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s);
}
}
}
四.遇見world新增東西 的那個案例import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/*
* 需求:判斷集合中是否有"world",如果有就新增"javaee"
*
* java.util.ConcurrentModificationException
* 當方法檢測到物件的併發修改,但不允許這種修改時,丟擲此異常。
* 產生的原因:
* 迭代器是依賴於集合而存在的,在判斷成功後,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫併發修改異常。
* 其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
* 如何解決呢?
* 解決:
* 方案1:
* 用迭代器遍歷,用迭代器修改
* 元素是跟在剛才迭代的元素後面的。
* 方案2:
* 用for迴圈遍歷,用集合修改
* 元素在最後新增的。
*/
public class ListDemo2 {
public static void main(String[] args) {
List l = new ArrayList();
l.add("hello");
l.add("world");
l.add("java");
// ListIterator lit = l.listIterator();
// while(lit.hasNext()){
// String s = (String)lit.next();
// if(s.equals("world")){
// l.add("javaee");
// }
// }
// ListIterator lit = l.listIterator();
// while(lit.hasNext()){
// String s = (String)lit.next();
// if(s.equals("world")){
// lit.add("javaee");
// }
// }
//l:[hello, world, javaee, java]
for(int i=0;i<l.size();i++){
String s = (String)l.get(i);
if(s.equals("world")){
l.add("javaee");
}
}
//l:[hello, world, java, javaee]
System.out.println("l:"+l);
}
}
這兩種辦法還不太一樣 迭代器弄得直接在後面跟著新增 因為是看指標的 走到哪裡加到哪裡
for 集合這個 add是直接載入在後面的 碰見一個world就在最後加一個
(1)迭代器遍歷 就用迭代器修改
(2)集合遍歷就用集合修改
五.學生案例
記住要重寫tostring
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/*
* 需求:用集合儲存學生,把成績60分以下的刪除
*/
public class ListTest {
public static void main(String[] args) {
List l = new ArrayList();
Student s1 = new Student("張一",80);
Student s2 = new Student("張二",90);
Student s3 = new Student("張三",70);
Student s4 = new Student("張四",40);
Student s5 = new Student("張五",30);
Student s6 = new Student("張六",50);
Student s7 = new Student("張七",56);
Student s8 = new Student("張八",68);
l.add(s1);
l.add(s2);
l.add(s3);
l.add(s4);
l.add(s5);
l.add(s6);
l.add(s7);
l.add(s8);
System.out.println("l:"+l);
ListIterator lit = l.listIterator();
while(lit.hasNext()){
Student s = (Student)lit.next();
if(s.getCj() < 60){
lit.remove();
}
}
System.out.println("l:"+l);
}
}
public class Student {
private String name;
private int cj;
public Student() {
super();
}
public Student(String name, int cj) {
super();
this.name = name;
this.cj = cj;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCj() {
return cj;
}
public void setCj(int cj) {
this.cj = cj;
}
@Override
public String toString() {
return "Student [name=" + name + ", cj=" + cj + "]";
}
}
六.List的三個實現類 子類
(1)LinkedList類
import java.util.LinkedList;
/*
* LinkedList類概述
底層資料結構是連結串列,查詢慢,增刪快
執行緒不安全,效率高
LinkedList類特有功能
public void addFirst(Object e)
addLast(Object e)
public Object getFirst()
getLast()
public Object removeFirst()
public Object removeLast()
*/
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList lk = new LinkedList();
lk.add("hello");
lk.add("world");
lk.add("java");
// lk.addFirst("haha");
// lk.addLast("javaee");
//
// System.out.println("getFirst:"+lk.getFirst());
// System.out.println("getLast:"+lk.getLast());
//
// System.out.println("removeFirst:"+lk.removeFirst());
// System.out.println("removeLast:"+lk.removeLast());
System.out.println("pool:"+lk.poll());
System.out.println("pool:"+lk.poll());
System.out.println("pool:"+lk.poll());
System.out.println("lk:"+lk);
}
}
(2)Vector類
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
/*
* Vector類概述
底層資料結構是陣列,查詢快,增刪慢
執行緒安全,效率低
Vector類特有功能
public void addElement(Object obj) //add()
public Object elementAt(int index) //get()
public Enumeration elements() //迭代器
*/
public class VectorDemo {
public static void main(String[] args) {
Vector v = new Vector();
v.addElement("hello");
v.addElement("world");
v.addElement("java");
System.out.println("v:"+v);
Enumeration e = v.elements();
while(e.hasMoreElements()){
String s = (String)e.nextElement();
System.out.println(s);
}
System.out.println("----------------");
Iterator it = v.iterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s);
}
System.out.println("--------------");
for(int i=0;i<v.size();i++){
String s = (String)v.get(i);
System.out.println(s);
}
}
}
(3) ArrayList類
import java.util.ArrayList;
import java.util.ListIterator;
/*
* ArrayList類概述
底層資料結構是陣列,查詢快,增刪慢
執行緒不安全,效率高
構造方法:
ArrayList()
ArrayList(Collection c)
案例:
儲存字串,並遍歷
*/
public class ArrayListDemo {
public static void main(String[] args) {
//List l = new ArrayList();
ArrayList al = new ArrayList();
al.add("hello");
al.add("world");
al.add("java");
// ListIterator li = al.listIterator();
// while(li.hasNext()){
// String s = (String)li.next();
// System.out.println(s);
// }
ArrayList al2 = new ArrayList(al);
System.out.println("al2:"+al2);
}
}
七.ArrayList類案例
(1)去除重複的字串 兩種方式
一種是建立個集合一種是equals方法比較 需要注意的是String中重寫了equals方法和tostring方法
import java.util.ArrayList;
/*
* 去除集合中字串的重複值(字串的內容相同)
*/
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("hello");
al.add("world");
al.add("java");
al.add("javaee");
al.add("haha");
al.add("world");
al.add("java");
al.add("javaee");
al.add("haha");
al.add("haha");
al.add("world");
//定義一個新的集合
ArrayList al2 = new ArrayList();
//遍歷需要去重複的集合
for(int i=0;i<al.size();i++){
String s = (String)al.get(i);
//判斷新集合裡面是否包含此元素,如果不包含就新增到新集合中
if(!al2.contains(s)){
al2.add(s);
}
}
System.out.println("al2:"+al2);
}
}
import java.util.ArrayList;
/*
* 去除集合中字串的重複值(字串的內容相同)
要求:不建立新集合
*/
public class ArrayListTest1 {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("hello");
al.add("world");
al.add("java");
al.add("javaee");
al.add("haha");
al.add("world");
al.add("java");
al.add("javaee");
al.add("haha");
al.add("haha");
al.add("world");
for(int i=0;i<al.size()-1;i++){
for(int j = i+1;j<al.size();j++){
String s = (String)al.get(i);
String s1 = (String)al.get(j);
if(s.equals(s1)){
al.remove(j);
j--;
}
}
}
System.out.println("al:"+al);
}
}
(2)學生 去除重複的案例 需要去重寫equals方法和tostring方法才能行 要不然全部原樣輸出
import java.util.ArrayList;
import java.util.ListIterator;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList s = new ArrayList();
Student c1 = new Student("張1",21);
Student c2 = new Student("張2",22);
Student c3 = new Student("張3",23);
Student c4 = new Student("張4",24);
Student c5 = new Student("張1",21);
Student c6 = new Student("張5",25);
Student c7 = new Student("張3",23);
Student c8 = new Student("張3",23);
Student c9 = new Student("張2",22);
s.add(c1);
s.add(c2);
s.add(c3);
s.add(c4);
s.add(c5);
s.add(c6);
s.add(c7);
s.add(c8);
s.add(c9);
s.add(c1);
for(int i=0;i<s.size()-1;i++){
for(int j = i+1;j<s.size();j++){
Student m = (Student)s.get(i);
Student n = (Student)s.get(j);
if(m.equals(n)){
s.remove(j);
j--;
}
}
}
System.out.println(s);
}
}
public class Student {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
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 "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@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;
}
}
(2)上面是用的for迴圈比較 equals
這裡再用兩個集合 一個是空的沒有就加 也要重寫那兩個方法
import java.util.ArrayList;
import java.util.ListIterator;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList s = new ArrayList();
Student c1 = new Student("張1",21);
Student c2 = new Student("張2",22);
Student c3 = new Student("張3",23);
Student c4 = new Student("張4",24);
Student c5 = new Student("張1",21);
Student c6 = new Student("張5",25);
Student c7 = new Student("張3",23);
Student c8 = new Student("張3",23);
Student c9 = new Student("張2",22);
s.add(c1);
s.add(c2);
s.add(c3);
s.add(c4);
s.add(c5);
s.add(c6);
s.add(c7);
s.add(c8);
s.add(c9);
s.add(c1);
ArrayList s1 = new ArrayList();
for(int i = 0;i<s.size();i++){
Student x = (Student)(s.get(i));
if(!s1.contains(x)){
s1.add(x);
}
}
System.out.println(s1);
}
}
八.List:(面試題List的子類特點)
ArrayList:
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector:
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
LinkedList:
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。
List有三個兒子,我們到底使用誰呢?
看需求(情況)。
要安全嗎?
要:Vector(即使要安全,也不用這個了,後面有替代的)
不要:ArrayList或者LinkedList
查詢多:ArrayList
增刪多:LinkedList
如果你什麼都不懂,就用ArrayList。