Java API ——Collection集合类 & Iterator接口
对象数组举例:
学生类:
package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } 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 itcast01; /** * Created by gao on 15-12-9. */ /* * 我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。 * 学生:Student * 成员变量:name,age * 构造方法:无参,带参 * 成员方法:getXxx()/setXxx() * 存储学生的数组?自己想想应该是什么样子的? * 分析: * A:创建学生类。 * B:创建学生数组(对象数组)。 * C:创建5个学生对象,并赋值。 * D:把C步骤的元素,放到数组中。 * E:遍历学生数组。 */ public class ObjectArrayDemo01 { public static void main(String[] args) { // 创建学生数组(对象数组)。 Student[] students = new Student[5]; // 创建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++) { //System.out.println(students[x]);//没有重写toString方法,打印地址值 Student s = students[x]; System.out.println(s.getName()+"---"+s.getAge()); } } }
输出结果:
林青霞---27
风清扬---30
刘意---30
赵雅芝---60
王力宏---35
对象数组的内存图解:
1、API - 集合类
1) 集合类概述
· 为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
· 数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
· 集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
· 集合的由来:
我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,有哪些是容器类型的呢?数组和StringBuffer。但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。
· 数组和集合的区别?
A:长度区别
数组的长度固定
集合长度可变
B:内容不同
数组存储的是同一种类型的元素
而集合可以存储不同类型的元素
C:元素的数据类型问题
数组可以存储基本数据类型,也可以存储引用数据类型
集合只能存储引用类型
刚说过集合是存储多个元素的,但是呢,存储多个元素我们也是有不同需求的:比如说,我要这多个元素中不能有相同的元素,再比如说,我要这多个元素按照某种规则排序一下。针对不同的需求,Java就提供了不同的集合类,这样呢,Java就提供了很多个集合类。这多个集合类的数据结构不同,结构不同不重要的,重要的是你要能够存储东西,并且还要能够使用这些东西,比如说判断,获取等。既然这样,那么,这多个集合类是有共性的内容的,我们把这些集合类的共性内容不断的向上提取,最终就能形成集合的继承体系结构。
数据结构:数据的存储方式。
· 集合的继承体系图解:
2、 Collection 集合类:
是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。
3、Collection的功能概述:
A:添加功能
boolean add(Object obj):添加一个元素
boolean addAll(Collection c):添加一个集合的元素(添加所有)
B:删除功能
void clear():移除所有元素
boolean remove(Object o):移除一个元素
boolean removeAll(Collection c):移除一个集合的元素(只有包含一个就行)
C:判断功能
boolean contains(Object o):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)
boolean isEmpty():判断集合是否为空(元素为空)
D:获取功能
Iterator<E> iterator()(重点)
E:长度功能
int size():元素的个数
面试题:数组有没有length()方法呢?(有)字符串有没有length()方法呢?(有)集合有没有length()方法呢?(没有)
F:交集功能
boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
G:把集合转换为数组
Object[] toArray()
测试类1:(不带All的方法)
package collectiondemo; import java.util.ArrayList; import java.util.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 CollectionDemo01 { 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")); //remove:true // System.out.println("remove:"+c.remove("javaee")); //remove:false // boolean contains(Object o):判断集合中是否包含指定的元素 // System.out.println("contains:"+c.contains("hello")); //contains:true // System.out.println("contains:"+c.contains("android")); //contains:false // boolean isEmpty():判断集合是否为空 System.out.println("isEmpty:"+c.isEmpty()); //isEmpty:false //int size():元素的个数 System.out.println("size:"+c.size()); //size:3 System.out.println("c:"+c); //c:[hello, world, java] } }
测试类2:(带All的方法)
package collectiondemo; import java.util.ArrayList; import java.util.Collection; /** * Created by gao on 15-12-9. */ public class CollectionDemo02 { 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):添加一个集合的元素(添加c2集合中的所有元素,可重复) // System.out.println("addAll:"+c1.addAll(c2)); //addAll:true // System.out.println("c1:"+c1); //c1:[abc1, abc2, abc3, abc4, abc4, abc5, abc6, abc7] // System.out.println("c2:"+c2); //c2:[abc4, abc5, abc6, abc7] //boolean removeAll(Collection c):移除一个集合的元素(只要移除c中的一个元素就算成功) // System.out.println("removeAll:"+c1.removeAll(c2)); //removeAll:true // System.out.println("c1:"+c1); //c1:[abc1, abc2, abc3] // System.out.println("c2:"+c2); //c2:[abc4, abc5, abc6, abc7] //boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(只有包含c的所有元素才算成功) // System.out.println("containsAll:"+c1.containsAll(c2)); //containsAll:false // System.out.println("c1:"+c1); //c1:[abc1, abc2, abc3, abc4] // System.out.println("c2:"+c2); //c2:[abc4, abc5, abc6, abc7] //boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢? //假设有两个集合A,B。 //A对B做交集,最终的结果保存在A中,B不变。 //返回值表示的是A是否发生过改变。 // System.out.println("retainAll:"+c1.retainAll(c2)); //retainAll:true;c1发生了改变 // System.out.println("c1:"+c1); //c1:[abc4] // System.out.println("c2:"+c2); //c2:[abc4, abc5, abc6, abc7] System.out.println("retainAll:"+c1.retainAll(c2)); //retainAll:false;c1没有发生改变 System.out.println("c1:"+c1); //c1:[abc1, abc2, abc3, abc4] System.out.println("c2:"+c2); //c2:[abc1, abc2, abc3, abc4, abc5, abc6, abc7] } }
测试类3:普通遍历
package collectiondemo; import java.util.ArrayList; import java.util.Collection; /** * Created by gao on 15-12-9. */ /* * 集合的遍历。其实就是依次获取集合中的每一个元素。 * * Object[] toArray():把集合转成数组,可以实现集合的遍历 */ public class CollectionDemo03 { 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()); } } }
遍历应用:
Student类:
package collectiondemo02; /** * Created by gao on 15-12-9. */ public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } 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 collectiondemo02; import java.util.ArrayList; import java.util.Collection; /** * Created by gao on 15-12-9. */ 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[] objects = c.toArray(); //遍历数组 for(int x = 0; x < objects.length; x++){ Student s = (Student) objects[x]; System.out.println(s.getName()+"-->"+s.getAge()); } } }
4、Iterator接口:Iterator
1)Iterator接口概述
对 collection 进行迭代的迭代器
依赖于集合而存在
2) Iterator接口成员方法
boolean hasNext()
E next()
package collectiondemo03; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * Created by gao on 15-12-14. */ /* * Iterator iterator():迭代器,集合的专用遍历方式 * Object next():获取元素,并移动到下一个位置。 * NoSuchElementException:没有这样的元素,因为你已经找到最后了。 * boolean hasNext():如果仍有元素可以迭代,则返回 true。( */ public class CollectionDemo01 { 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(); // 实际返回的肯定是子类对象,这里是多态 // 判断是否有下一个元素,有就获取,没有就不搭理它 while(it.hasNext()){ String s = (String) it.next(); System.out.println(s); } } }
输出结果:
hello
world
java
测试类1:Iterator
引入学生类Student,
测试类:
package collectiondemo03; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * Created by gao on 15-12-14. */ /* * 练习:用集合存储5个学生对象,并把学生对象进行遍历。用迭代器遍历。 * * 注意: * A:自己的类名不要和我们学习的要使用的API中的类名相同。 * B:复制代码的时候,很容易把那个类所在的包也导入过来,容易出现不能理解的问题。 */ /* * 问题1:能用while循环写这个程序,我能不能用for循环呢? * 问题2:不要多次使用it.next()方法,因为每次使用都是访问一个对象。 */ public class CollectionTest01 { 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()); } //for改写,不过我们习惯用while // for (Iterator it = c.iterator(); it.hasNext(); ) { // Student s = (Student) it.next(); // System.out.println(s.getName() + "---" + s.getAge()); // } } }
输出结果:
Student{name='林青霞', age=27}
Student{name='风清扬', age=30}
Student{name='令狐冲', age=33}
Student{name='武鑫', age=25}
Student{name='刘晓曲', age=22}
5、集合遍历Iterator类总结:
迭代器的源码结构:
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); }