0129 集合 迭代器 增强for
1、集合
首先回顾一下ArrayList集合
public class Demo01 { public static void main(String[] args) { ArrayList<Person> arr=new ArrayList<Person>(); Person p=new Person("小红",18); Person p1=new Person("小黑",19); arr.add(p); arr.add(p1); for(int i=0;i<arr.size();i++){ System.out.println(arr.get(i)); } } }
集合的继承和实现关系图
由图可以看出,ArrayList类实现了List接口,而list接口又继承了Collection接口,也就是说ArrayList类已经将所有的方法重写。
list特点允许有重复元素,有序存储,有下标
set特点不允许存储重复元素,无序存储,无下标
由图可以看出Colletion是一个接口,所以不能创建对象,所以我们只能利用多态,父类引用变量指向子类对象的方式去创建集合对象,去调用方法。
集合中常用的成员方法
(1)add(E e);添加元素
(2)clear();清空集合
(3)contains(object obj);判断obj是否存在这个集合
(4)remove(object obj);将obj移出集合
(5)size();集合长度
(6)toArray();返回一个object类型的数组
例:代码展示
public class Demo02 { public static void main(String[] args) { Collection<Integer> col=new ArrayList<Integer>(); //添加元素 col.add(123); col.add(456); //删除 //col.remove(456); //清空 //col.clear(); //判断是否存在元素 boolean f=col.contains(456); System.out.println(f); //转为数组 Object[] brr=col.toArray(); System.out.println(Arrays.toString(brr)); } }
那么有了集合是不是就可以遍历了,那现在这个collection中没有get方法去访问下标,但是他的子类ArrayList有get方法,但是多态在调用方法时不可以直接调用子类的独有的方法,那么需要对象向下转型之后才可以调用子类独有的方法,代码展示
if(col instanceof ArrayList){ ArrayList<Integer> arr=(ArrayList<Integer>)col; for(int i=0;i<arr.size();i++){ System.out.println(arr.get(i)); } }
2、迭代器
由继承关系图我们总结出,继承collection的两个接口,并不是所有的子类都有下标的功能,那没有下标就不能遍历了吗?所以java提供了一种通用的遍历方法,叫迭代器,无论有没有下标我都能遍历和访问。
iterator迭代器,iterator是一个接口,接口很明显不能创建对象,那么没有对象就不能调用成员方法。要想调用迭代器中的方法,用到collection的一个超级父类iterable接口中的iterator(),这个方法的返回值就是一个iterator迭代器对象。那么说这个超级父类iterable也是个接口也不能创建对象,但是他有子类,他创建不了,他的子类可以创建。简单讲:创建一个collection子类对象,调用父类接口iterable中的iterator()方法,这时就获取了一个iterator对象,就可以用这个对象调用成员方法了
图解:
成员方法:
hasNext();返回值是布尔类型,返回值如果为true则说明还有元素,则继续迭代
next();返回值是泛型,泛型是创建对象时什么类型这个泛型就是什么类型
代码展示
public static void main(String[] args) { // TODO Auto-generated method stub Collection<String> col=new ArrayList<String>(); //存 col.add("hello"); col.add("你好"); //迭代 //获取迭代器对象 Iterator<String> it=col.iterator(); //判断下个元素是否有 while(it.hasNext()){ System.out.println(it.next); } }
3、增强for
增强for的底层就是一个迭代器
格式:for(你要遍历的元素的数据类型 变量名:要遍历的那个数据容器){ };
代码展示:
public class Demo04 { public static void main(String[] args) { Collection<Double> col=new ArrayList<Double>(); col.add(1.2); col.add(2.3); col.add(4.3); //增强for循环 //for(你要遍历集合的存储数据类型 变量名:集合的容器名字) for(double d:col){ System.out.println(d); } String[] arr={"b","c","f","e"}; for(String f:arr){ System.out.println(f); } } }