Java学习笔记 14 - 集合、Iterator、foreach、泛型

本文主要内容
1、集合
2、Iterator迭代器
3、增强for循环
4、泛型

01 集合

A:集合概述
集合,是java中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
数组的长度是固定的。集合的长度是可变的。
集合中存储的元素必须是引用类型数据

B:集合继承关系
1、ArrayList
ArrayList类继承抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口。Collection接口为最顶层集合接口。
源代码:

      interface List extends Collection {
      }
      public class ArrayList extends AbstractList implements List{
      }

2、集合继承体系
Collecton接口常用的子接口有:List接口、Set接口
List接口常用的子类有:ArrayList类、LinkedList类
Set接口常用的子类有:HashSet类、LinkedHashSet类

C:集合Collection
Collection接口中的方法,是集合中所有实现类必须拥有的方法
Java中三种长度表现形式
数组.length 属性 返回值 int
字符串.length() 方法,返回值int
集合.size()方法, 返回值int
集合Collection的方法
1) Object[] toArray() 集合中的元素,转成一个数组中的元素, 集合转成数组
返回是一个存储对象的数组, 数组存储的数据类型是Object

    eg:
    private static void function() {
        Collection coll = new ArrayList();
        coll.add("abc");
        coll.add("itcast");
        coll.add("itheima");
        coll.add("money");
        coll.add("123");
        
        Object[] objs = coll.toArray();
        for(int i = 0 ; i < objs.length ; i++){
          System.out.println(objs[i]);
        }
    }
  1. boolean contains(Object o) 判断对象是否存在于集合中,对象存在返回true
    方法参数是Object类型
eg:
    private static void function() {
        Collection coll = new ArrayList();
        coll.add("abc");
        coll.add("itcast");
        coll.add("itheima");
        coll.add("money");
        coll.add("123");
        
        boolean b = coll.contains("itcast");
        System.out.println(b);
    }
  1. void clear() 清空集合中的所有元素,集合容器本身依然存在

     eg:
     public static void function(){
         //接口多态的方式调用
         Collection coll = new ArrayList();
         coll.add("abc");
         coll.add("bcd");
         System.out.println(coll);       
         coll.clear();   
         System.out.println(coll);
       }
     }
    
  2. boolean remove(Object o)移除集合中指定的元素

     eg:
     private static void function(){
       Collection coll = new ArrayList();
       coll.add("abc");
       coll.add("money");
       coll.add("itcast");
       coll.add("itheima");
       coll.add("money");
       coll.add("123");  
       System.out.println(coll);
       
       boolean b = coll.remove("money");
       System.out.println(b);
       System.out.println(coll);
     }
    
02 迭代器Iterator

集合的类型有很多种,取出集合中的元素,可用一种通用的获取方式来完成。
获取方式(即 迭代Iterator):在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续判断,如果还有就再取出来。直到把集合中的所有元素全部取出。

A:抽象方法
boolean hasNext() 判断集合中还有没有可以被取出的元素,如果有返回true
next() 取出集合中的下一个元素
使用Iterator接口,先要获取该接口的实现类对象
使用ArrayList集合的对象 :Iterator it =array.iterator(),运行结果就是Iterator接口的实现类的对象

B:执行过程

   while(it.hasNext()) {
        System.out.println(it.next());
   }
   
   //cursor记录的索引值不等于集合的长度返回true,否则返回false
     public boolean hasNext() {       
       return cursor != size; //cursor初值为0
                       
    }

    //next()方法作用:
    //①返回cursor指向的当前元素 
    //②cursor++
    public Object next() {            
             int i = cursor; 
             cursor = i + 1;  
             return  elementData[lastRet = i]; 
         }
   另外,for循环迭代写法:
    for (Iterator it2 = coll.iterator(); it2.hasNext();  ) {
     System.out.println(it2.next());
   } 

C:集合迭代中的转型
集合中存储是对象的地址。
jdk1.5版本以后集合可以存储基本类型.
集合存储基本类型时,会自动装箱(向上转型:将基本类型提升到基本类型的包装类对象)。取出时,会自动拆箱(向下转型:将基本类型包装类对象转化为基本类型)

 Collection coll = new ArrayList();
 coll.add("abc");
 coll.add("aabbcc");
 coll.add("shitcast");
 Iterator it = coll.iterator();
 while (it.hasNext()) {
 //由于元素被存放进集合后全部被提升为Object类型
 //当需要使用子类对象特有方法时,需要向下转型
  String str = (String) it.next();
  System.out.println(str.length());
 }

 Iterator接口可以使用<>来控制迭代元素的类型
 Collection coll = new ArrayList();
 coll.add("abc");
 coll.add("aabbcc");
 coll.add("shitcast");
 Iterator it = coll.iterator();
 while (it.hasNext()) {
  String str =  it.next(); 
 //当使用Iterator控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
  System.out.println(str.length());
 }
03 增强for循环

JDK1.5以后出现新的接口 java.lang.Iterable,其作用是实现增强for循环。Collection接口继承Iterable
增强for循环格式:
for( 数据类型 变量名 : 数组或者集合 ){
sop(变量);
}
增强for循环的使用,可以减少代码量同时方便了对容器的遍历。但是这种遍历方式没有索引,所以不能操作某个指定的元素

04集合的泛型

A:泛型概述
JDK1.5以后为了保证程序的安全性,出现泛型。
泛型,指明了集合中存储数据的类型 <数据类型>
集合可以存放任意对象,对象存储到集合后,会被提升成Object类型。取出每一个对象,并且进行相应的操作,必须采用类型转换。

泛型只在编译时存在,编译后就被擦除,所以在编译之前可以限制集合的类型
例如:ArrayList al=new ArrayList();
编译后:ArrayList al=new ArrayList();

B:泛型类
定义格式:修饰符 class 类名<代表泛型的变量> { }

 eg:
ArrayList list = new ArrayList();//变量E的值就是String类型
class ArrayList{ 
    public boolean add(String e){ }
    public String get(int index){  }
}

C:泛型的方法
定义格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
API中的ArrayList集合中的方法 public T[] toArray(T[] a){ }

例如:
      ArrayList list = new ArrayList();
      String[] arr = new String[100];
      String[] result = list.toArray(arr);
   此时,变量T的值就是String类型。变量T,可以与定义集合的泛型不同
   public  String[] toArray(String[] a){  } 

D:泛型的接口

 public interface List {
  abstract boolean add(E e);
 }
  
 实现类,先实现接口,不理会泛型
 public class ArrayList implements List{
 }
 调用者 : new ArrayList() 后期创建集合对象的时候,指定数据类型

 实现类,实现接口的同时,也指定了数据类型
 public class XXX implements List{
 }
    new XXX()

E:泛型的通配符
泛型的通配符:匹配所有的数据类型 ?

public static void iterator(Collection coll){
  Iterator it = coll.iterator();
  while(it.hasNext()){
    System.out.println(it.next());
  }
}

F:泛型的限定
场景:将的酒店员工,厨师,服务员,经理,分别存储到3个集合中
定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法

 import java.util.ArrayList;
 import java.util.Iterator;
 public class GenericTest {
public static void main(String[] args) {
  //创建3个集合对象
  ArrayList cs = new ArrayList();
  ArrayList fwy = new ArrayList();
  ArrayList jl = new ArrayList();
  
  //每个集合存储自己的元素
  cs.add(new ChuShi("张三", "后厨001"));
  cs.add(new ChuShi("李四", "后厨002"));
  
  fwy.add(new FuWuYuan("翠花", "服务部001"));
  fwy.add(new FuWuYuan("酸菜", "服务部002"));
  
  jl.add(new JingLi("小名", "董事会001", 123456789.32));
  jl.add(new JingLi("小强", "董事会002", 123456789.33));
  
  iterator(jl);
  iterator(fwy);
  iterator(cs);

}
/*
 * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 work
 * ? 通配符,迭代器it.next()方法取出来的是Object类型,怎么调用work方法
 * 强制转换:  it.next()=Object o ==> Employee
 * 方法参数: 控制,可以传递Employee对象,也可以传递Employee的子类的对象
 * 泛型的限定  本案例,父类固定Employee,但是子类可以无限?
 *   ? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象
 *   ? super   Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
 */
public static void iterator(ArrayList array){
   Iterator it = array.iterator();
   while(it.hasNext()){
     //获取出的next() 数据类型,是什么Employee
     Employee e = it.next();
     e.work();
   }
}

你可能感兴趣的:(Java学习笔记 14 - 集合、Iterator、foreach、泛型)