面向物件-集合
什麼是集合
集合:就是用來存放資料的一個容器
陣列的不足:
1.長度是固定的,不能再去新增元素
Java提供集合類
它的長度是可以改變的
能儲存任意的物件
長度是隨著你的元素增加而增加的
陣列和集合的區別?
1.陣列能存基本資料型別,和引用型別
2.集合當中只能存放引用資料型別,直接放,也會幫你自動裝箱(把基本資料型別轉成物件)
集合當中只能存放物件
3.陣列長度是固定的,不能再去增長
集合長度是可以改變,根據元素的增長而增加
什麼時候使用陣列,什麼時候使用集合?
1.如果元素個數是固定,推薦使用陣列
2.如果元素不是固定,推薦使用集合

集合類繼承體系

Collection新增元素
1.集合當中存的都是物件,集合可以當成是陣列,不斷往後增加元素
2.Collection是一個介面型別,需要一個實現類進行建立繼承
3.新增基本資料型別,會幫你自動裝箱(把基本資料型別轉成物件)
4.List當中可以新增重複的元素,add方法新增元素,它的返回值都是true
所以在今後開發當中,不會接收結果
因為在set當中是不能新增重複元素的,如果新增就給你一個false
5.ArrayList當中覆蓋了toString的方法,直接可以列印結果
package 面向物件.集合; import java.util.ArrayList; import java.util.Collection; class Student{ String name; String age; @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } } public class CollectionDemo { public static void main(String[] args) { 多型寫法,面向介面程式設計執行時,表現出來的是子類特徵 集合當中存的都是物件 Collection c = new ArrayList();//可以當成是陣列,不斷往後增加元素 boolean b1 = c.add("abc"); boolean b2 = c.add(10);//會幫你自動裝箱(把基本資料型別轉成物件) boolean b3 = c.add(true); //boolean b2 = c.add(Integer.valueOf(10)); //boolean b3 = c.add(Boolean.valueOf(true)); Student s = new Student(); s.age="17"; s.name="zs"; boolean b4 = c.add(s); boolean b5 = c.add("abc");//List當中可以新增重複的元素 //List當中的add返回值都是true //所以在今後開發當中,不會接收結果 //因為在set當中是不能新增重複元素的,如果新增就給你一個false System.out.println(b1); System.out.println(b2); System.out.println(b3); System.out.println(b4); System.out.println(b5); System.out.println(c);//[abc, 10, true, 面向物件.集合.Student@15db9742, abc] //ArrayList當中覆蓋了toString的方法,直接可以列印結果 //[abc, 10, true, Student [name=zs, age=17], abc] student類當中覆蓋了toString的這個方法 } }
Collection常用方法
@SuppressWarnings({ "rawtypes", "unchecked" })//掃黃,main方法當中不再出現這些警告
Collection集合方法
public static void main(String[] args) { Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c2.add("c"); System.out.println(c2);//[a, b, c] 可以從集合當中移除指定的元素 c2.remove("a"); System.out.println(c2);//[b, c] 判斷一個集合是否為空,true,false System.out.println(c2.isEmpty());//false 獲取集合當中的長度(有幾個元素) System.out.println(c2.size());//size:2與陣列的length一樣 清空集合當中的所有內容 c2.clear(); System.out.println(c2);//[] }


Collection集合轉普通陣列
集合的遍歷:從集合當中一個一個取
元素
package 面向物件.集合; import java.util.ArrayList; import java.util.Collection; class Dog { private String name; public String getName() { return name; } Dog(String name) { this.name = name; } } public class CollectionDemo { @SuppressWarnings("rawtypes")//掃黃 public static void main(String[] args) { Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); System.out.println(c); 遍歷陣列 先把集合轉成陣列,使用toArray() 返回Object型別 獲取陣列中的每一個元素 Object[] arr = c.toArray(); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } Collection c2 = new ArrayList(); c2.add(new Dog("wc"));//新增狗物件 c2.add(new Dog("wc2")); c2.add(new Dog("wc3")); 並不能使用get方法arr2[i].getName() 因為陣列當中都是Object Object[] arr2 = c2.toArray(); 並不能使用get方法arr2[i].getName() 因為陣列當中都是Object 自動把陣列當中的元素向上轉型了,向根類轉型了,轉為萬物之主Object Object當中沒有辦法去呼叫具體型別當中的方法 for (int i = 0; i < arr2.length; i++) { Dog d = (Dog)arr2[i];向下轉型 System.out.println(d.getName()); } } }
Collection集合帶all常用方法
eclipse快捷鍵 Alt+Shift+R
Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c2.add("c"); c2.add("d"); System.out.println(c1);[a, b, c, d] 把c2的所有元素合併到c1當中 c1.addAll(c2); //c1.add(c2);是新增物件[a, b, c, d, [a, b, c, d]] System.out.println(c1);//[a, b, c, d, a, b, c, d]
Collection c3 = new ArrayList(); c3.add("a"); c3.add("b"); 從c1當中刪除兩個集合的交集removeAll c1.removeAll(c3); System.out.println(c1);//[a, b, c, d, a, b, c, d] ---->[c, d, c, d]
Collection c4 = new ArrayList(); c4.add("c"); c4.add("d"); 判斷呼叫的集合是否全部包含傳入的集合containsAll boolean res = c1.containsAll(c4); System.out.println(res);//true
Collection c5 = new ArrayList(); c5.add("c"); c5.add("d"); 取交集 retainAll 把交集的結果賦值給呼叫者, 有返回值boolean 如果呼叫的集合改變了,就返回true,c1沒改變就返回false boolean b = c1.retainAll(c5); System.out.println(c1);//[c, d, c, d] System.out.println(b);//false



Collection迭代器遍歷元素
迭代器(iterator)
集合當中的元素直接放到迭代器當中,迭代器當中有方法直接取出元素
@SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); //陣列遍歷 Object[] o = c.toArray(); for (Object object : o) { System.out.println(object); } 迭代器遍歷 Iterator it = c.iterator();// 放到Iterator內容會自動提升,Object 獲取迭代器當中的內容 Object obj = it.next();// 把當前遊標的內容取出來,當前的遊標往後走一位 System.out.println(obj);// a Object obj2 = it.next(); System.out.println(obj2);// b Object obj3 = it.next(); System.out.println(obj3);// c 判斷迭代器當中是否還有元素 如果有就返回true,沒有就返回false boolean res = it.hasNext(); System.out.println(res);// 遊標到了盡頭沒有元素了,false System.out.println("-------"); 1.先判斷有沒有元素,然後再執行下一步 while (it.hasNext()) { 2.如果有,取出元素 System.out.println(it.next());//把上面的程式碼註釋掉,然後會輸出 a,b,c } }
Collection迭代器遍歷自定義物件
class Cat { String name; Cat(String name) { this.name = name; } void show() { System.out.println(this.name); } } public class CollectionDemo1 { public static void main(String[] args) { 在每一個實現類當中都定義了自己的迭代方法 Collection c2 = new ArrayList(); c2.add(new Cat("mimi")); c2.add(new Cat("mm")); Iterator it2= c2.iterator();//迭代器遍歷,裡面的物件都會自動提升為Object型別 while(it2.hasNext()) { Cat cat = (Cat)it2.next();//向下轉型 cat.show(); //mimimm } } }