集合之Collection接口AND Iterator迭代器 AND 增强for AND 泛型

 

 

 

集合,集合是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接口为最顶层集合接口了。 采集,聚集

 set常用接口:

 

    Collection接口概述

 Collection接口是List接口和Set接口的父接口,通常情况下不被直接使用,不过Collection接口定义了一些通用的方法,

通过这些方法可以实现对集合的基本操作,因为List接口和Set接口继承自Collection接口,

所以这些方法对List集合和Set集合是通用的。

  Collection接口的基本方法

创建集合的格式:

1 方式1:Collection<元素类型> 变量名 = new ArrayList<元素类型>();
2 
3 方式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

 1 import java.util.ArrayList;
 2 import java.util.Iterator;
 3 import java.util.List;
 4 
 5 public class Demo01 {
 6     public static void main(String[] args) {
 7         List<String> list = new ArrayList<String>();    
 8         list.add("a");
 9         list.add("a");
10         list.add("a");
11         list.add("b");
12         list.add("b");
13         list.add("c");
14         list.add("d");
15         list.add("d");
16         list.add("d");
17         list.add("d");
18         list.add("d");
19         //调用方法并打印
20         System.out.println(friequency(list, "a"));    
21         System.out.println(friequency(list, "b"));    
22         System.out.println(friequency(list, "c"));    
23         System.out.println(friequency(list, "d"));    
24         System.out.println(friequency(list, "xxx"));    
25     }
26     public static int friequency(List<String> list,String str){
27         Iterator<String> it=list.iterator();
28         int in=0;
29         while(it.hasNext()){
30             if(it.next()==str){
31                 in++;
32             }
33         }
34         return in;
35     }
36 }

2.某中学有若干学生(学生对象放在一个List中),每个学生有一个姓名属性(String)、班级名称属性(String)和考试成绩属性(double)
某次考试结束后,每个学生都获得了一个考试成绩。遍历list集合,并把学生对象的属性打印出来。

 1 public class Stu {
 2     private String name;
 3     private String classname;
 4     private double score;
 5     public Stu(String name, String classname, double score) {
 6         super();
 7         this.name = name;
 8         this.classname = classname;
 9         this.score = score;
10     }
    //创建get/set方法
11 public String getName() { 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 public String getClassname() { 18 return classname; 19 } 20 public void setClassname(String classname) { 21 this.classname = classname; 22 } 23 public double getScore() { 24 return score; 25 } 26 public void setScore(double score) { 27 this.score = score; 28 } 29 //重写tostring()方法 30 public String toString() { 31 return "Stu [姓名为" + name + ", 班级名称为" + classname + ", 成绩为" + score + "]"; 32 } 33 } 34 35 import java.util.ArrayList; 36 37 public class Test { 38 39 public static void main(String[] args) { 40       //创建集合对象 41 ArrayList<Stu> arr=new ArrayList<Stu>(); 42 arr.add(new Stu("鲁班大师","小短腿班",89)); 43 arr.add(new Stu("王昭君","法师班",90)); 44 arr.add(new Stu("花木兰","刺客班",98));
       //遍历输出
45 for(Stu i:arr){ 46 System.out.println(i); 47 } 48 } 49 }

 

泛型:

泛型不进入.class文件!

 

限定泛型的上限:

格式:? extends E

 

限定泛型的下限:

格式:? super E

 

 
 
posted @ 2018-08-01 16:30  文昭  阅读(200)  评论(0编辑  收藏  举报