专栏首页Java小白成长之路容器、迭代器和泛型

容器、迭代器和泛型

知识总结:

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

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

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

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

本文分享自微信公众号 - Java小白成长之路(Java_xiaobai),作者:鹏程万里

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 刷题第10篇:从完全平方到零钱兑换

    不难看出,这道题目的状态转移方程为:nums[n] = Math.min(nums[n],nums[n - i* i] + 1),我们可以使用迭代的方法,不断的...

    鹏-程-万-里
  • 第47次文章:cookie&session

    一次会话中包含多次请求和响应。 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。

    鹏-程-万-里
  • 第21次文章:工厂模式

    在我们GOFO23种设计模式中,上期着重介绍了创造型模式中的单例模式,这周我们着重介绍另一种创造型设计模式——工厂模式。

    鹏-程-万-里
  • Java高级特性之泛型

    枕边书
  • Docker的网络模式bridge、host、container other、overlay

    docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下5种网络模式: bridge模式:使用–net =bri...

    菲宇
  • 设计模式分类

         在《设计模式》这本书中列举并描述了23种设计模式,分为创建型模式、结构型模式和行为型模式。另外,近来这一清单又增加了一些类别,例如,并发型模式、线程池...

    猿人谷
  • 微服务API网关-Kong初探

    Kong是一个clould-native、快速的、可扩展的、分布式的微服务抽象层(也称为API网关、API中间件或在某些情况下称为服务网格)框架。更确切地说,K...

    KaliArch
  • EOS怎样删除钱包

    在使用Eos的keosd钱包软件时,如果要删除EOS中指定名称的钱包,最简单的办法是 直接删除钱包文件,不过在删除钱包之前,需要先停止钱包软件的运行。

    用户1408045
  • 关于初学Go语言的一些事

    最近在尝试用go语言(golang)开发项目,觉得go还挺不错,相较于Python来说,静态语言的优点就是写完代码就能检查出大多数的错误,有效的避免运行时出现的...

    the5fire
  • 13个最受欢迎的机器学习Python库

    人工智能的快速发展,让机器学习备受大家欢迎。今天给大家盘点一下最受欢迎的机器学习库(ML):

    人工智能的秘密

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动