首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器、迭代器和泛型

容器、迭代器和泛型

作者头像
鹏-程-万-里
发布2019-09-27 14:30:57
4280
发布2019-09-27 14:30:57
举报

知识总结:

本周主要学习了容器、迭代器以及泛型:

一、对于容器的一些理解:

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类型。

关于容器、迭代器、以及泛型的知识点还有很多,需要我们深入其中才可以了解透彻,博主只是根据自己的学习情况,将其中一些比较有意思的点提出来,供大家分享,希望大家能够满意哈!有问题的话,可以留言哟!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小白成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档