day15-----------集合框架(傳智視頻)

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;
	}

	// 成員方法
	// getXxx()/setXxx()
	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 + "]";
	}
}

package cn.itcast_01;

/*
 * 我有5個學生,請把這個5個學生的信息存儲到數組中,並遍歷數組,獲取獲得每個學生信息。
 *		 學生:Student
 *		 成員變量:name,age
 *		 構造方法:無參,帶參
 *		 成員方法:getXxx()/setXxx()
 *		 存儲學生的數組?本身想一想應該是什麼樣子的?
 * 分析:
 * 		A:建立學生類。
 * 		B:建立學生數組(對象數組)。
 * 		C:建立5個學生對象,並賦值。
 * 		D:把C步驟的元素,放到數組中。
 * 		E:遍歷學生數組。
 */
public class ObjectArrayDemo {
	public static void main(String[] args) {
		// 建立學生數組(對象數組)。
		Student[] students = new Student[5];
		// for (int x = 0; x < students.length; x++) {
		// System.out.println(students[x]);
		// }
		// System.out.println("---------------------");

		// 建立5個學生對象,並賦值。
		Student s1 = new Student("林青霞", 27);
		Student s2 = new Student("風清揚", 30);
		Student s3 = new Student("劉意", 30);
		Student s4 = new Student("趙雅芝", 60);
		Student s5 = new Student("王力宏", 35);

		// 把C步驟的元素,放到數組中。
		students[0] = s1;
		students[1] = s2;
		students[2] = s3;
		students[3] = s4;
		students[4] = s5;

		// 看到很類似,就想循環改
		// for (int x = 0; x < students.length; x++) {
		// students[x] = s + "" + (x + 1);
		// }
		// 這個是有問題的

		// 遍歷
		for (int x = 0; x < students.length; x++) {
			//System.out.println(students[x]);
			
			Student s = students[x];
			System.out.println(s.getName()+"---"+s.getAge());
		}
	}
}

對象數組的內存圖解java

集合的繼承體系圖解
android

package cn.itcast_01;

import java.util.ArrayList;
import java.util.Collection;

/*
 * 集合的由來:
 * 		咱們學習的是面嚮對象語言,而面嚮對象語言對事物的描述是經過對象體現的,爲了方便對多個對象進行操做,咱們就必須把這多個對象進行存儲。
 * 		而要想存儲多個對象,就不能是一個基本的變量,而應該是一個容器類型的變量,在咱們目前所學過的知識裏面,有哪些是容器類型的呢?
 * 		數組和StringBuffer。可是呢?StringBuffer的結果是一個字符串,不必定知足咱們的要求,因此咱們只能選擇數組,這就是對象數組。
 * 		而對象數組又不能適應變化的需求,由於數組的長度是固定的,這個時候,爲了適應變化的需求,Java就提供了集合類供咱們使用。
 * 
 * 數組和集合的區別?
 * 		A:長度區別
 * 			數組的長度固定
 * 			集合長度可變
 * 		B:內容不一樣
 * 			數組存儲的是同一種類型的元素
 * 			而集合能夠存儲不一樣類型的元素
 * 		C:元素的數據類型問題	
 * 			數組能夠存儲基本數據類型,也能夠存儲引用數據類型
 * 			集合只能存儲引用類型
 * 
 * 剛說過集合是存儲多個元的,可是呢,存儲多個元素咱們也是有不一樣需求的:好比說,我要這多個元素中不能有相同的元素,
 * 再好比說,我要這多個元素按照某種規則排序一下。針對不一樣的需求,Java就提供了不一樣的集合類,這樣呢,Java就提供了不少個集合類。
 * 這多個集合類的數據結構不一樣,結構不一樣不重要的,重要的是你要可以存儲東西,而且還要可以使用這些東西,好比說判斷,獲取等。
 * 既然這樣,那麼,這多個集合類是有共性的內容的,咱們把這些集合類的共性內容不斷的向上提取,最終就能造成集合的繼承體系結構。
 * 
 * 數據結構:數據的存儲方式。
 * 
 * Collection:是集合的頂層接口,它的子體系有重複的,有惟一的,有有序的,有無序的。(後面會慢慢的講解)
 * 
 * Collection的功能概述:
 * 1:添加功能
 * 		boolean add(Object obj):添加一個元素
 * 		boolean addAll(Collection c):添加一個集合的元素
 * 2:刪除功能
 * 		void clear():移除全部元素
 * 		boolean remove(Object o):移除一個元素
 * 		boolean removeAll(Collection c):移除一個集合的元素(是一個仍是全部)
 * 3:判斷功能
 * 		boolean contains(Object o):判斷集合中是否包含指定的元素
 * 		boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素(是一個仍是全部)
 * 		boolean isEmpty():判斷集合是否爲空
 * 4:獲取功能
 * 		Iterator<E> iterator()(重點)
 * 5:長度功能
 * 		int size():元素的個數
 * 		面試題:數組有沒有length()方法呢?字符串有沒有length()方法呢?集合有沒有length()方法呢?
 * 6:交集功能
 * 		boolean retainAll(Collection c):兩個集合都有的元素?思考元素去哪了,返回的boolean又是什麼意思呢?
 * 7:把集合轉換爲數組
 * 		Object[] toArray()
 */
public class CollectionDemo {
	public static void main(String[] args) {
		// 測試不帶All的方法

		// 建立集合對象
		// Collection c = new Collection(); //錯誤,由於接口不能實例化
		Collection c = new ArrayList();

		// boolean add(Object obj):添加一個元素
		// System.out.println("add:"+c.add("hello"));
		c.add("hello");
		c.add("world");
		c.add("java");

		// void clear():移除全部元素
		// c.clear();

		// boolean remove(Object o):移除一個元素
		// System.out.println("remove:" + c.remove("hello"));
		// System.out.println("remove:" + c.remove("javaee"));

		// boolean contains(Object o):判斷集合中是否包含指定的元素
		// System.out.println("contains:"+c.contains("hello"));
		// System.out.println("contains:"+c.contains("android"));

		// boolean isEmpty():判斷集合是否爲空
		// System.out.println("isEmpty:"+c.isEmpty());

		//int size():元素的個數
		System.out.println("size:"+c.size());
		
		System.out.println("c:" + c);
	}
}

package cn.itcast_01;

import java.util.ArrayList;
import java.util.Collection;

/*
 * boolean addAll(Collection c):添加一個集合的元素
 * boolean removeAll(Collection c):移除一個集合的元素(是一個仍是全部)
 * boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素(是一個仍是全部)
 * boolean retainAll(Collection c):兩個集合都有的元素?思考元素去哪了,返回的boolean又是什麼意思呢?
 */
public class CollectionDemo2 {
	public static void main(String[] args) {
		// 建立集合1
		Collection c1 = new ArrayList();
		c1.add("abc1");
		c1.add("abc2");
		c1.add("abc3");
		c1.add("abc4");

		// 建立集合2
		Collection c2 = new ArrayList();
//		c2.add("abc1");
//		c2.add("abc2");
//		c2.add("abc3");
//		c2.add("abc4");
		c2.add("abc5");
		c2.add("abc6");
		c2.add("abc7");

		// boolean addAll(Collection c):添加一個集合的元素
		// System.out.println("addAll:" + c1.addAll(c2));
		
		//boolean removeAll(Collection c):移除一個集合的元素(是一個仍是全部)
		//只要有一個元素被移除了,就返回true。
		//System.out.println("removeAll:"+c1.removeAll(c2));

		//boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素(是一個仍是全部)
		//只有包含全部的元素,才叫包含
		// System.out.println("containsAll:"+c1.containsAll(c2));
		
		//boolean retainAll(Collection c):兩個集合都有的元素?思考元素去哪了,返回的boolean又是什麼意思呢?
		//假設有兩個集合A,B。
		//A對B作交集,最終的結果保存在A中,B不變。
		//返回值表示的是A是否發生過改變。
		System.out.println("retainAll:"+c1.retainAll(c2));
		
		System.out.println("c1:" + c1);
		System.out.println("c2:" + c2);
	}
}

集合的遍歷之集合轉數組遍歷
面試

package cn.itcast_01;

import java.util.ArrayList;
import java.util.Collection;

/*
 * 集合的遍歷。其實就是依次獲取集合中的每個元素。
 * 
 * Object[] toArray():把集合轉成數組,能夠實現集合的遍歷
 */
public class CollectionDemo3 {
	public static void main(String[] args) {
		// 建立集合對象
		Collection c = new ArrayList();

		// 添加元素
		c.add("hello"); // Object obj = "hello"; 向上轉型
		c.add("world");
		c.add("java");

		// 遍歷
		// Object[] toArray():把集合轉成數組,能夠實現集合的遍歷
		Object[] objs = c.toArray();
		for (int x = 0; x < objs.length; x++) {
			// System.out.println(objs[x]);
			// 我知道元素是字符串,我在獲取到元素的的同時,還想知道元素的長度。
			// System.out.println(objs[x] + "---" + objs[x].length());
			// 上面的實現不了,緣由是Object中沒有length()方法
			// 咱們要想使用字符串的方法,就必須把元素還原成字符串
			// 向下轉型
			String s = (String) objs[x];
			System.out.println(s + "---" + s.length());
		}
	}
}

Collection 存儲自定義對象並遍歷案例
數組

package cn.itcast_02;

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;
	}

	// 成員方法
	// getXxx()/setXxx()
	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_02;

import java.util.ArrayList;
import java.util.Collection;

/*
 * 練習:用集合存儲5個學生對象,並把學生對象進行遍歷。
 * 
 * 分析:
 * A:建立學生類
 * B:建立集合對象
 * C:建立學生對象
 * D:把學生添加到集合
 * E:把集合轉成數組
 * F:遍歷數組
 */
public class StudentDemo {
	public static void main(String[] args) {
		// 建立集合對象
		Collection c = new ArrayList();

		// 建立學生對象
		Student s1 = new Student("林青霞", 27);
		Student s2 = new Student("風清揚", 30);
		Student s3 = new Student("令狐沖", 33);
		Student s4 = new Student("武鑫", 25);
		Student s5 = new Student("劉曉曲", 22);

		// 把學生添加到集合
		c.add(s1);
		c.add(s2);
		c.add(s3);
		c.add(s4);
		c.add(s5);

		// 把集合轉成數組
		Object[] objs = c.toArray();
		// 遍歷數組
		for (int x = 0; x < objs.length; x++) {
			// System.out.println(objs[x]);

			Student s = (Student) objs[x];
			System.out.println(s.getName() + "---" + s.getAge());
		}
	}
}

迭代器
安全

package array;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class IteatorTest2 {

	public static void main(String[] args) {
		
		Collection c = new ArrayList();
		
		Student s1 = new Student("lisi",23);
		Student s2 = new Student("wangwu",24);
		Student s3 = new Student("zhaoliu",34);
		Student s4 = new Student("zhangsan",12);
		
		c.add(s1);
		c.add(s2);
		c.add(s3);
		c.add(s4);

		for(Iterator it = c.iterator();it.hasNext();){
			Student s = (Student)it.next();
			System.out.println(s.getName()+"--------"+s.getAge());
		}
	}

}

package cn.itcast_01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
 * List集合的特色:
 * 		有序(存儲和取出的元素一致),可重複的。
 */
public class ListDemo2 {
	public static void main(String[] args) {
		// 建立集合對象
		List list = new ArrayList();

		// 存儲元素
		list.add("hello");
		list.add("world");
		list.add("java");
		list.add("javaee");
		list.add("android");
		list.add("javaee");
		list.add("android");

		// 遍歷集合
		Iterator it = list.iterator();
		while (it.hasNext()) {
			String s = (String) it.next();
			System.out.println(s);
		}
	}
}

package cn.itcast_03;

import java.util.ArrayList;
import java.util.List;

/*
 * List集合的特有功能:
 * A:添加功能
 * 		void add(int index,Object element):在指定位置添加元素
 * B:獲取功能
 * 		Object get(int index):獲取指定位置的元素
 * C:列表迭代器
 * 		ListIterator listIterator():List集合特有的迭代器
 * D:刪除功能
 * 		Object remove(int index):根據索引刪除元素,返回被刪除的元素
 * E:修改功能
 * 		Object set(int index,Object element):根據索引修改元素,返回被修飾的元素
 */
public class ListDemo {
	public static void main(String[] args) {
		// 建立集合對象
		List list = new ArrayList();

		// 添加元素
		list.add("hello");
		list.add("world");
		list.add("java");

		// void add(int index,Object element):在指定位置添加元素
		// list.add(1, "android");//沒有問題
		// IndexOutOfBoundsException
		// list.add(11, "javaee");//有問題
		// list.add(3, "javaee"); //沒有問題
		// list.add(4, "javaee"); //有問題

		// Object get(int index):獲取指定位置的元素
		// System.out.println("get:" + list.get(1));
		// IndexOutOfBoundsException
		// System.out.println("get:" + list.get(11));

		// Object remove(int index):根據索引刪除元素,返回被刪除的元素
		// System.out.println("remove:" + list.remove(1));
		// IndexOutOfBoundsException
		// System.out.println("remove:" + list.remove(11));

		// Object set(int index,Object element):根據索引修改元素,返回被修飾的元素
		System.out.println("set:" + list.set(1, "javaee"));

		System.out.println("list:" + list);
	}
}

list集合的特有遍歷功能數據結構

package cn.itcast_03;

import java.util.ArrayList;
import java.util.List;

/*
 * List集合的特有遍歷功能:
 * 		size()和get()方法結合使用
 */
public class ListDemo2 {
	public static void main(String[] args) {
		// 建立集合對象
		List list = new ArrayList();

		// 添加元素
		list.add("hello");
		list.add("world");
		list.add("java");

		// Object get(int index):獲取指定位置的元素
		// System.out.println(list.get(0));
		// System.out.println(list.get(1));
		// System.out.println(list.get(2));
		// IndexOutOfBoundsException
		// System.out.println(list.get(3));

		// 用循環改進
		// for (int x = 0; x < 3; x++) {
		// System.out.println(list.get(x));
		// }
		// 若是元素過多,數起來就比較麻煩,因此咱們使用集合的一個長度功能:size()
		// 最終的遍歷方式就是:size()和get()
		for (int x = 0; x < list.size(); x++) {
			// System.out.println(list.get(x));

			String s = (String) list.get(x);
			System.out.println(s);
		}
	}
}

ListIterator的特有功能
併發

package cn.itcast_04;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
 * 列表迭代器:
 * 		ListIterator listIterator():List集合特有的迭代器
 * 		該迭代器繼承了Iterator迭代器,因此,就能夠直接使用hasNext()和next()方法。
 * 
 * 特有功能:
 * 		Object previous():獲取上一個元素
 * 		boolean hasPrevious():判斷是否有元素
 * 
 * 		注意:ListIterator能夠實現逆向遍歷,可是必須先正向遍歷,才能逆向遍歷,因此通常無心義,不使用。
 */
public class ListIteratorDemo {
	public static void main(String[] args) {
		// 建立List集合對象
		List list = new ArrayList();
		list.add("hello");
		list.add("world");
		list.add("java");

		// ListIterator listIterator()
		ListIterator lit = list.listIterator(); // 子類對象
		// while (lit.hasNext()) {
		// String s = (String) lit.next();
		// System.out.println(s);
		// }
		// System.out.println("-----------------");
		
		// System.out.println(lit.previous());
		// System.out.println(lit.previous());
		// System.out.println(lit.previous());
		// NoSuchElementException
		// System.out.println(lit.previous());

		while (lit.hasPrevious()) {
			String s = (String) lit.previous();
			System.out.println(s);
		}
		System.out.println("-----------------");

		// 迭代器
		Iterator it = list.iterator();
		while (it.hasNext()) {
			String s = (String) it.next();
			System.out.println(s);
		}
		System.out.println("-----------------");

	}
}

併發修改異常的產生緣由及解決方案
ide

package cn.itcast_04;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
 * 問題?
 * 		我有一個集合,以下,請問,我想判斷裏面有沒有"world"這個元素,若是有,我就添加一個"javaee"元素,請寫代碼實現。
 * 
 * ConcurrentModificationException:當方法檢測到對象的併發修改,但不容許這種修改時,拋出此異常。 
 * 產生的緣由:
 * 		迭代器是依賴於集合而存在的,在判斷成功後,集合的中新添加了元素,而迭代器殊不知道,因此就報錯了,這個錯叫併發修改異常。
 * 		其實這個問題描述的是:迭代器遍歷元素的時候,經過集合是不能修改元素的。
 * 如何解決呢?
 * 		A:迭代器迭代元素,迭代器修改元素
 * 			元素是跟在剛纔迭代的元素後面的。
 * 		B:集合遍歷元素,集合修改元素(普通for)
 * 			元素在最後添加的。
 */
public class ListIteratorDemo2 {
	public static void main(String[] args) {
		// 建立List集合對象
		List list = new ArrayList();
		// 添加元素
		list.add("hello");
		list.add("world");
		list.add("java");

		// 迭代器遍歷
		// Iterator it = list.iterator();
		// while (it.hasNext()) {
		// String s = (String) it.next();
		// if ("world".equals(s)) {
		// list.add("javaee");
		// }
		// }

		// 方式1:迭代器迭代元素,迭代器修改元素
		// 而Iterator迭代器卻沒有添加功能,因此咱們使用其子接口ListIterator
		// ListIterator lit = list.listIterator();
		// while (lit.hasNext()) {
		// String s = (String) lit.next();
		// if ("world".equals(s)) {
		// lit.add("javaee");
		// }
		// }

		// 方式2:集合遍歷元素,集合修改元素(普通for)
		for (int x = 0; x < list.size(); x++) {
			String s = (String) list.get(x);
			if ("world".equals(s)) {
				list.add("javaee");
			}
		}

		System.out.println("list:" + list);
	}
}

List:(面試題List的子類特色)
	ArrayList:
		底層數據結構是數組,查詢快,增刪慢。
		線程不安全,效率高。
	Vector:
		底層數據結構是數組,查詢快,增刪慢。
		線程安全,效率低。
	LinkedList:
		底層數據結構是鏈表,查詢慢,增刪快。
		線程不安全,效率高。
		
	List有三個兒子,咱們到底使用誰呢?
		看需求(狀況)。
		
	要安全嗎?
		要:Vector(即便要安全,也不用這個了,後面有替代的)
		不要:ArrayList或者LinkedList
			查詢多:ArrayList
			增刪多:LinkedList
			
	若是你什麼都不懂,就用ArrayList。
相關文章
相關標籤/搜索