集合之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