集合
集合是java中提供的一種容器,可以用來存儲多個數據。
注意:
①、集合只能存放對象。比如你存一個 int 型數據 1放入集合中,
其實它是自動轉換成 Integer 類后存入的,Java中每一種基本類型都有對應的引用類型。
②、集合存放的是多個對象的引用,對象本身還是放在堆內存中。
③、集合可以存放不同類型,不限數量的數據類型。
用ArrayList集合存儲int類型數組:
1 public static void main(String[] args) { 2 3 ArrayList<Integer> arr=new ArrayList<Integer>(); 4 arr.add(1); 5 arr.add(12); 6 arr.add(2); 7 for(int i=0;i<arr.size();i++){ 8 System.out.print(arr.get(i)+" "); 9 } 10 }
ArrayList集合存儲5個Person類型元素:
1 ArrayList<Person> arr=new ArrayList<Person>(); 2 arr.add(new Person("小豬佩奇",18)); 3 arr.add(new Person("喬治",17)); 4 arr.add(new Person("熊大",16)); 5 arr.add(new Person("熊二",15)); 6 for(int i=0;i<arr.size();i++){ 7 System.out.println(arr.get(i)); 8 }
集合的繼承實現關系
查看ArrayList類發現它繼承了抽象類AbstractList同時實現接口List,而List接口又繼承了Collection接口。
Collection接口為最頂層集合接口了。
Collection接口概述:
Collection接口是List接口和Set接口的父接口,通常情況下不被直接使用,不過Collection接口定義了一些通用的方法,
通過這些方法可以實現對集合的基本操作,因為List接口和Set接口繼承自Collection接口,
所以這些方法對List集合和Set集合是通用的。
Collection接口的基本方法:
創建集合的格式:
1 方式1:Collection<元素類型> 變量名 = new ArrayList<元素類型>(); 2 方式2:Collection 變量名 = new ArrayList();
方式1創建的集合,只能存儲<>中指定的元素類型,該方式為常用方式
方式2創建的集合,集合的元素類型默認為Object類型,即任何類型的元素都可以存儲。
代碼展示:
1 public static void main(String[] args) { 2 Collection<String> con=new ArrayList<String>(); 3 con.add("粉豬佩奇"); 4 con.add("巴啦啦小魔仙"); 5 con.add("全身變"); 6 con.add("烏卡拉"); 7 con.add("變身"); 8 boolean flag=con.contains("巴啦啦大魔仙"); 9 System.out.println(flag); 10 con.remove("變身"); 11 //con.clear(); 12 con.toArray(); 13 for(int i=0;i<con.size();i++){ 14 ArrayList<String> arr=(ArrayList<String>)con; 15 System.out.println(arr.get(i)); 16 } 17 }
Iterator迭代器
一、Iterator迭代器概述
java中提供了很多個集合,它們在存儲元素時,采用的存儲方式不同。我們要取出這些集合中的元素,可通過一種通用的獲取方式來完成。
Collection集合元素的通用獲取方式:在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,
如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。
Iterator接口的常用方法:
代碼展示:
1 public static void main(String[] args) { 2 ArrayList<Integer> arr=new ArrayList<Integer>(); 3 arr.add(1); 4 arr.add(12); 5 arr.add(2); 6 //1.獲取Iterator對象 7 //Iterator<Integer> it=arr.iterator(); 8 //while循環取出元素 9 /*while(it.hasNext()){ 10 System.out.println(it.next()); 11 }*/ 12 //for循環迭代 13 for(Iterator<Integer> it=arr.iterator();it.hasNext();){ 14 System.out.println(it.next()); 15 } 16 /*//2.判斷集合下一位是否有元素 17 boolean flag=it.hasNext(); 18 System.out.println(flag); 19 //3.獲取元素 20 System.out.println(it.next());*/ 21 22 }
圖解:
Iterator迭代方式的代碼體現:
1 //1,創建集合對象。 2 Collection<String> coll = new ArrayList<String>(); 3 coll.add("abc1"); 4 coll.add("abc2"); 5 coll.add("abc3"); 6 coll.add("abc4"); 7 8 //2.獲取容器的迭代器對象。通過iterator方法。 9 Iterator it = coll.iterator(); 10 11 //3,使用具體的迭代器對象獲取集合中的元素。參閱迭代器的方法 12 while(it.hasNext()){ 13 System.out.println(it.next()); 14 } 15 16 /* 17 迭代器for循環的形式的使用 18 for (Iterator it = coll.iterator(); it.hasNext(); ) { 19 System.out.println(it.next()); 20 }
集合元素的向下轉型
1 public static void main(String[] args) { 2 Collection<String> con=new ArrayList<String>(); 3 con.add("粉豬佩奇"); 4 con.add("巴啦啦小魔仙"); 5 con.add("全身變"); 6 con.add("烏卡拉"); 7 con.add("變身"); 8 Iterator<String> it=con.iterator(); 9 while(it.hasNext()){ 10 Object obj=it.next(); 11 String str=(String)obj;//如果不加泛型 需要向下轉型 12 System.out.println(str.length()); 13 } 14 }
增強for循環
格式:
for(元素的數據類型 變量 : Collection集合or數組){}
1 public static void main(String[] args) { 2 ArrayList<Integer> arr=new ArrayList<Integer>(); 3 arr.add(1); 4 arr.add(12); 5 arr.add(2); 6 //普通for 7 for(int i=0;i<arr.size();i++){ 8 arr.get(i); 9 } 10 //增強for(底層就是迭代器的原理) 11 //for(集合存儲類型 變量: 你要遍歷的集合名){ 12 //System.out.println(變量); 13 //} 14 for(Integer i:arr){ 15 System.out.println(i); 16 } 17 }
練習:
定義方法frequency統計集合中指定元素出現的次數,如"a" 3,"b" 2,"c" 1
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class text { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("a"); list.add("a"); list.add("a"); list.add("b"); list.add("b"); list.add("c"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); System.out.println(frequency(list, "a")); System.out.println(frequency(list, "b")); System.out.println(frequency(list, "c")); System.out.println(frequency(list, "d")); System.out.println(frequency(list, "xxx")); } public static int frequency(List<String> arr,String a){ int num=0; Iterator<String> it=arr.iterator(); while(it.hasNext()){ if(it.next()==a){ num+=1; } } return num; } }
2.某中學有若干學生(學生對象放在一個List中),每個學生有一個姓名屬性(String)、班級名稱屬性(String)和考試成績屬性(double)
某次考試結束后,每個學生都獲得了一個考試成績。遍歷list集合,並把學生對象的屬性打印出來。
public class person { private String name; private String class_name; private double score; public person(String name, String class_name, double score) { super(); this.name = name; this.class_name = class_name; this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClass_name() { return class_name; } public void setClass_name(String class_name) { this.class_name = class_name; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } //重寫toString public String toString() { return "姓名:" + name + "\t班級:" + class_name + "\t成績:" + score; } }
import java.util.ArrayList; public class student { public static void main(String[] args) { person p1=new person("勞拉","java01",100); person p2=new person("薩曼莎","java02",90); person p3=new person("約拿","java03",80); ArrayList<person> stu=new ArrayList<person>(); stu.add(p1); stu.add(p2); stu.add(p3); //循環打印 for(person i:stu){ System.out.println(i); } } }