• 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);
    		}
    	}
    }
    

      

  • 相关阅读:
    cookie与session的区别
    基于TCP协议的网络编程
    springboot第一篇:springboot基础
    java中的正则表达式
    NIO
    io基础(字节流、字符流、转换流、缓冲字符流)
    基于UDP协议的网络编程
    es6.3学习笔记
    线程同步和线程通信
    java字符串各种编码
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14345782.html
Copyright © 2020-2023  润新知