1. 程式人生 > >集合Collection的子介面——List包括List下 的三個子介面

集合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。