Java基礎(01)-15總結物件陣列,集合Collection,集合List
(1)陣列既可以儲存基本資料型別,也可以儲存引用型別。它儲存引用型別的時候的陣列就叫物件陣列。
(2)案例:
用陣列儲存5個學生物件,並遍歷陣列。
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()); } } }
2:集合(Collection)(掌握)
(1)集合的由來?
我們學習的是Java -- 面向物件 -- 操作很多物件 -- 儲存 -- 容器(陣列和StringBuffer) -- 陣列
而陣列的長度固定,所以不適合做變化的需求,Java就提供了集合供我們使用。
(集合的由來:
我們學習的語言是面向物件的語言,name既然是面向物件的語言,那麼對事物的描述都是用過物件進行體現的,那麼為了方便的操作多個物件
那麼我們就需要將多個物件儲存起來,那麼既然要儲存多個物件,我們就需要找一個容器型別的變數進行儲存。那麼我們都學過哪些容器型別的變數呢?
陣列(物件陣列),字串緩衝區,而我們的陣列滿足不了我們的)
(2)集合和陣列的區別?
A:長度區別
陣列固定
集合可變
B:內容區別(儲存資料型別區別)
陣列可以是基本型別,也可以是引用型別
集合只能是引用型別
C:元素內容區別
陣列只能儲存同一種類型
集合可以儲存不同型別(其實集合一般儲存的也是同一種類型)
(3)集合的繼承體系結構?
由於需求不同,Java就提供了不同的集合類。這多個集合類的資料結構不同,但是它們都是要提供儲存和遍歷功能的,
我們把它們的共性不斷的向上提取,最終就形成了集合的繼承體系結構圖。
Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet
(4)Collection的功能概述(自己補齊)
A:新增功能
B:刪除功能
C:判斷功能
D:獲取功能
E:長度功能
F:交集(瞭解)
G:把集合轉陣列(瞭解)
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又是什麼意思呢?
A對B取交集,獲取到的交集元素儲存到A中去了;返回的boolean值表示的意思是集合A是否發生變化發生變化是true否則是false。
*/
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);
}
}
(5)Collection集合的遍歷
A:把集合轉陣列(瞭解)
B:迭代器(集合專用方式)
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());
}
}
}
C: 案例:Collection集合儲存自定義物件,把集合轉換成陣列在遍歷
package cn.itcast_02;(1)
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;(2)
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());
}
}
}
(6)迭代器
A:是集合的獲取元素的方式。
B:是依賴於集合而存在的。
C:迭代器的原理和原始碼。
a:為什麼定義為了一個介面而不是實現類?
假如我們把迭代器定義成一個類,我們就需要給出具體的方法的實現。而我們都知道不同的集合的資料結構不同,就是說資料儲存方式不同;那麼既然儲存方式不同,獲取方式能相同嗎?
不能相同,所以我們的獲取元素的方法能給出具體的實現嗎?
不能給出具體的實現。所以這個方法就應該定義為抽象方法。那麼我們就可以把這個迭代器的類定義為抽象類,可以實現,為什麼
b:看了看迭代器的內部類實現。
package cn.itcast_03;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
* Iterator iterator():迭代器,集合的專用遍歷方式
* Object next():獲取元素,並移動到下一個位置。
* NoSuchElementException:沒有這樣的元素,因為你已經找到最後了。
* boolean hasNext():如果仍有元素可以迭代,則返回 true。(
*/
public class IteratorDemo {
public static void main(String[] args) {
// 建立集合物件
Collection c = new ArrayList();
// 建立並新增元素
// String s = "hello";
// c.add(s);
c.add("hello");
c.add("world");
c.add("java");
// Iterator iterator():迭代器,集合的專用遍歷方式
Iterator it = c.iterator(); // 實際返回的肯定是子類物件,這裡是多型
// Object obj = it.next();
// System.out.println(obj);
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// 最後一個不應該寫,所以,我們應該在每次獲取前,如果有一個判斷就好了
// 判斷是否有下一個元素,有就獲取,沒有就不搭理它
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// 最終版程式碼 獲取元素
while (it.hasNext()) {
// System.out.println(it.next());
String s = (String) it.next();
System.out.println(s);
}
}
}
迭代器原始碼:
public interface Inteator {
boolean hasNext();
Object next();
}
public interface Iterable {
Iterator iterator();
}
public interface Collection extends Iterable {
Iterator iterator();
}
public interface List extends Collection {
Iterator iterator();
}
public class ArrayList implements List {
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext() {}
public Object next(){}
}
}
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator(); //new Itr();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
(7)Collection集合的案例(遍歷方式 迭代器) 【重點**********】
集合的操作步驟:
A:建立集合物件
B:建立元素物件
C:把元素新增到集合
D:遍歷集合
A:儲存字串並遍歷
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
//建立集合物件
Collection c = new ArrayList();
//建立並新增元素
c.add("hello");
c.add("world");
c.add("java");
//遍歷集合
Iterator it = c.iterator();
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}
}
}
B:儲存自定義物件並遍歷
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//getXxx()/setXxx()
}
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
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("劉意",30);
Student s4 = new Student("武鑫",25);
Student s5 = new Student("劉曉曲",16);
//新增元素
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
c.add(s5);
//遍歷集合
Iterator it = c.iterator();
while(it.hasNext()) {
Student s = (Student)it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
}
}
package cn.itcast_03;(一)
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_03;(二)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
* 練習:用集合儲存5個學生物件,並把學生物件進行遍歷。用迭代器遍歷。
*
* 注意:
* A:自己的類名不要和我們學習的要使用的API中的類名相同。
* B:複製程式碼的時候,很容易把那個類所在的包也匯入過來,容易出現不能理解的問題。
*/
public class IteratorTest {
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);
// 遍歷
Iterator it = c.iterator();
while (it.hasNext()) {
// System.out.println(it.next());
Student s = (Student) it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
package cn.itcast_03;(三)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
* 問題1:能用while迴圈寫這個程式,我能不能用for迴圈呢?
* 問題2:不要多次使用it.next()方法,因為每次使用都是訪問一個物件。
*/
public class IteratorTest2 {
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);
// 遍歷
Iterator it = c.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "---" + s.getAge());
// NoSuchElementException 不要多次使用it.next()方法
// System.out.println(((Student) it.next()).getName() + "---"
// + ((Student) it.next()).getAge());
}
// System.out.println("----------------------------------");
// for迴圈改寫
// for(Iterator it = c.iterator();it.hasNext();){
// Student s = (Student) it.next();
// System.out.println(s.getName() + "---" + s.getAge());
// }
}
}