又到和大家分享的时刻java知识啦,哈哈!本期分享数组、集合和泛型。老套路从基础入手走起。

  数组:一组相同类型数据的集合,数组中的元素可以是任意类型(包括基本类型和引用类型)

  集合:一组能够存储和操作元素固定的数据,集中的元素不能存放基本数据类型,只能存对象的引用。但是在JDK1.5以后的版本当中,java增加了“自动装箱”和“自动拆箱”的机制,JVM会把基本类型数据包装成对应的包装类再存入集合,看起来集合能够存入基本数据类型,其实是不能的只是多了一个包装数据的过程。

  泛型:泛型==参数化类型。JDK1.5后的一项新特性,它的本质是参数化类型的应用,也就是说所操作的数据类型被 指定为一个参数,在用到的时候在指定具体的类型。

  开始用内存中的一个位置映射一个值,用“变量”来使用这个值。进一步发展成,用变量来引用一组值,数组诞生。后来有了集合,它是更强的数组,依赖object类。存入集合要经历装箱,转换成object类,拿出的时候再拆箱成之前的类型。在元素量大的时候,会导致性能下降。由于我们使用同一类型更方便操作,后来就产生了泛型,它可以把里面的元素转换成特定的类型,减少了拆装箱带来的困扰。

  我们知道接口、类和方法也都可以使用泛型去定义,以及相应的使用。是的,在具体使用时,可以分为泛型接口、泛型类和泛型方法。如下,我们看一个最简单的泛型类和方法定义:

  在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如T、E、K、V等形式的参数常用于表示泛型形参,由于接收来自外部使用时候传入的类型实参。那么对于不同传入的类型实参,生成的相应对象实例的类型是不是一样的呢?

  以上我们发现,在使用泛型类时,虽然传入了不同的泛型实参,但并没有真正意义上生成不同的类型,传入不同泛型实参的泛型类在内存上只有一个,即还是原来的最基本的类型(本实例中为Box),当然,在逻辑上我们可以理解成多个不同的泛型类型。

  究其原因,在于Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。

  对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。

  无论是变量、数组、集合、泛型都是一个容器,能盛放数据,只是“瓶口”不太一样。从盛放一个数据,同种类型的多个数我居,到不同种类的多个数据,容器的发展更加人性化,人类面向对象的思想也在不断的提高。相信未来在学习JAVA的时候,对容器的理解会更加的深入。