容器、迭代器和泛型
- 2019 年 10 月 8 日
- 筆記
知识总结:
本周主要学习了容器、迭代器以及泛型:
一、对于容器的一些理解:
ArrayList |
底层实现是数组,有序,可重复 |
---|---|
LinkedList |
底层实现是链表 |
Set |
底层实现是Map |
Map |
键值对,键不可以重复,值可以重复,但是后添加的值会覆盖前一次的值 |
二、迭代器:
关于迭代器的使用,一个容器的迭代器只能使用一次。但是老师上课教会了另一种方法,在构建类的时候,可以将自定义的迭代器进行封装为一个内部类,然后再构造相应的产生方法,这样就可以在自定义一个容器的时候,产生多个迭代器,而不必通过构造容器来使用迭代器。
三、关于泛型的一些总结和个人理解:
泛型在使用的时候主要是根据一对尖括号<>来进行的,使用泛型的主要优点是:安全和省心。用一段代码来进行解释这两个优点:
public class MyStuApp { public static void main(String[] args) { // MyStudent <int> stu = new MyStudent<int>();//自定类泛型不能为基本类型,比如此处的int MyStudent<Integer> stu = new MyStudent<Integer>(); //1、安全:类型检查 // stu.setJavase("优秀");//在泛型中已经声明了为Integer类型,所以此处编译报错 stu.setJavase(80);//此时只能存放Integer整型 //2、省心:自动转换类型 Integer score = stu.getJavase();//取出数据的时候,可以避免类型的混乱 } }
可以明显的看出,泛型就相当于是一个标签,在用户将数据丢入容器的时候,提前规定好可以存放的类型,在取出数据的时候就会是存放的类型。就好比,向一个壶里面装醋,如果提前在壶上打一个标签,代表这是醋,那么我们就不会在装入和取出的时候将其误以为是酱油,这就是泛型的一个作用。具体的一些可能出错的小细节,通过老师的总结,大概记录了一下:
1、在子类继承泛型父类的时候,子类所继承的泛型数量需要多于父类的泛型数量。但是如果父类已经实现了一个或多个具体的引用类型作为泛型,那么子类就可不必实现相应的泛型。
2、泛型没有数组和多态。在ArrayList类中,也使用了泛型,但是通过阅读JDK源码可以发现,ArrayList在实现过程中,使用的是一个Object[]数组,进行数组的底层实现。
3、关于泛型的擦除:泛型的擦除结合下面一段代码进行详解。
/*总结:当使用泛型擦除的时候,相当于是默认为一个Object类型,但是还会根据用户加进去的参数来确定是属于Object下面的哪一类, * 比如student是属于泛型擦除,在编译的时候不会进行类型检查,向其中添加的是100,会将student转化为Integer * 而如果将泛型设置为Object类型的话,那么无论传进去的参数是什么类型,编译器都会将其定义为Object类型,不会自动根据相应的类型来转化 * 所以泛型的擦除只是相当于Object类型,而不是等于Object类型*/ public class MyStuApp { public static void main(String[] args) { //擦除---->没有指定 泛型的具体类型,相当于使用的是Object类型 MyStudent student = new MyStudent(); student.setJavase(100);//100-->int-->Integer-->Object Object obj = student.getJavase(); test(student);//此处编译可以通过,因为student属于泛型擦除,所以在编译的时候不会进行类型检查 MyStudent<Object> student2 = new MyStudent<Object>();//此处直接将Mystudent的泛型改变为Object // test(student2);//编译的时候会进行类型检查不通过,因为student2是一个固定的Object类型,并不从属于下面的Integer类型 } public static void test(MyStudent<Integer> stu) { //此处将MyStudent加入泛型Integer,所以在使用的时候用的就是Integer类型,而不是Object } }
所以在使用泛型的擦除的时候,相当于我们拿了一个万能的箱子(Object),装进去的东西,这个万能箱会自动进行分类,而将泛型指定为这个万能箱(Object)的时候,编译时就会只看这个箱子的表面,而不会去关注其内涵——使用这个万能箱自动分类的功能。所以泛型的擦除仅仅是约等于Object类型,而并非是等于Object类型。
关于容器、迭代器、以及泛型的知识点还有很多,需要我们深入其中才可以了解透彻,博主只是根据自己的学习情况,将其中一些比较有意思的点提出来,供大家分享,希望大家能够满意哈!有问题的话,可以留言哟!