package cooom;

import org.junit.Test;

import java.util.*;

/**
 *
 * 泛型的使用
 * 1.jdk 5.0新增的特性
 * 2.在集合中使用泛型:
 *  总结:
 *   a.集合接口或集合类在jdk5.0是都修改为带泛型的结构
 *   b.在实例化集合类是,可以指明举例的泛型类型
 *   c.指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法,构造器属性等)使用到类的泛型的位置,
 *   都指定为实例化时泛型的类型 比如add(E e)----- >实例化以后add(Integer e)
 *   d.注意点:泛型的类型必须是一个类,不能是基本数据类型,需要用到基本数据类型的时候用包装类替换
 *   e.如果实例化时没有指明泛型的类型,默认泛型为java.lang.Object类型
 *
 * @author 冀帅
 * @date 2020/8/13-12:06
 */
public class GenericTest {
    //在集合中使用泛型之前的情况:
    @Test
    public  void  test1(){
        ArrayList list = new ArrayList();
        //需求:存放学生的成绩
        list.add(78);
        list.add(76);
        list.add(89);
        list.add(88);
        //问题一:类型不安全(没有限制存放数据的类型)
        list.add("Tom");

        for (Object score : list) {//取出来放到score里面
            //问题二:强转时,可能出现类型转换异常(ClassCastException)。
            int stuScore = (Integer) score;//Object转成Integer ,在自动拆箱
            System.out.println(stuScore);//ClassCastException
        }

    }       
    //在集合中使用泛型的情况:以ArrayList为例
    @Test
    public  void  test2(){
        //不能用int, 因为add()里是Object类型,int不属于。int默认值为0,Integer的默认值为NULL
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(78);
        list.add(87);
        list.add(99);
        list.add(65);
//        在编译时就进行类型检查,保证数据安全
//        list.add("Tom"); 编译错误
//        方式一遍历
//        for (Integer score : list) {
//            int stuScore = score;//不用再强转了
//            System.out.println(stuScore);
//
//        }


//        方式二遍历
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
    //在集合中使用泛型的情况:以HashMap为例
    @Test
    public  void  test3(){
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("Tom",87);
        map.put("Jerry",87);
        map.put("Jack",67);
//        遍历方式一:遍历键
//        Set<String> set = map.keySet();
//        Iterator<String> iterator = set.iterator();
//        while (iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
        //        遍历方式二:遍历键和值
//        Set<Map.Entry<String, Integer>> set = map.entrySet();
//        Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
//        while (iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
        //        遍历方式三:遍历键和值
        Set<String> set = map.keySet();
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String key = iterator.next();//拿到键
            Integer value = map.get(key);
            System.out.println(key+"---"+value);
        }

    }
}