泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
比较JDK版本,JDK 1.5中新增的语言特性:
1.枚举(增加了一个关键字enum);
2.变参(方法参数数量可以不固定多少);
3.泛型;
4.自动拆装箱(基本类型与包装类型可以混用);
5.foreach循环(方便地用于遍历数组和集合);
6.静态导入(可以在使用静态方法前不加类名);
7.注释(采用@前缀,这个基本上是为了简化J2EE而准备的,在JavaEE5中的EJB3、JPA等中随处可以看到它的身影)。
在JVM、基本类库、SDK工具和硬件平台支持上都有很多的提高,这个JDK版本的出现可以说是Java中的一次飞越。
具体的解释下:
1.自动包装和解包(Autoboxing and unboxing)
代码示例
往一个ArrayList中加入一个整数,1.5版本以前的版本写法是:
List list = new ArrayList();
list.add( new Integer( 10 ) );
而在1.5版本中可以写为:
list.add( 10 );
因为,在1.5版本中,对一个整数进行包装,使之成为一个Integer对象(即包装,boxing),然后加入到一个ArrayList中的做法被认为是没有必要的,反之,解包(unboxing)的做法也是没有必要的,这样的代码只是增加了程序的文本长度而已,所以1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer,long/Long,float/Float的相应包装/解包操作都进行了支持,从而使代码变得简单。
2.更优化的循环语句(The inhanced for loop)
代码示例
一个典型的遍历数组的循环语句,1.5版本以前的写法是:
for ( Iterator iterator = list.iterator(); iterator.hasNext(); )
{
Integer n = (Integer)iterator.next();
...
}//for
而在1.5版本中可以写为:
for ( Integer n : list )
{
...
}//for
显然1.5版本的写法比以前是大大简化了,但是在需要修改集合,比如删除其中元素时不能采用这种写法。之所以Java1.5版本没有象C#那样干脆定义一个foreach关键词,主要是因为SUN认为增加一个专门的关键词成本太高了(too costly)。但1.4版本中就曾经增加了assert关键词,1.5版本中也新增加了enum关键词,因此这一解释恐怕并不那么令人信服。
3.参数可变的方法和printf
代码示例
当不能确定一个方法的入口参数的个数时,以往版本的Java中,通常的做法是将多个参数放在一个数组或者对象集合中作为参数来传递,1.5版本以前的写法是:
int sum(Integer[] numbers)
{
int nSum = 0;
for(int i: numbers)
nSum += i;
return nSum;
}
...
//在别处调用该方法
sum(new Integer[] {12,13,20});
而在1.5版本中可以写为:
int sum(Integer... numbers)
{
int nSum = 0;
for(int i: numbers)
nSum += i;
return nSum;
}
...
//在别处调用该方法
sum(12,13,20);
显然,1.5版本的写法更为简易,也更为直观,尤其是方法的调用语句,不仅简化很多,而且更符合通常的思维方式,更易于理解。
1.5版本自身就有一个应用该特征的典型例子,即C风格的格式化输出方法——printf。
代码示例
输出一个加法算式,1.5版本以前的写法是:
int x = 5;
int y = 7;
int nSum = x + y;
System.out.println(x + " + " + y + " = " + nSum);
而在1.5版本中可以写为:
System.out.printf("%d + %d = %d\n", x, y, nSum);
以上两种写法的输出结构是一样的,即“5 + 7 = 12”。
这种改变不仅仅是形式上的,printf还可以提供更为灵活、强大的输出功能,比如限定按照两位整数的形式输出,可以写为“System.out.printf("%02d + %02d = %02d\n", x, y, nSum);”,输出结果将是“05 + 07 = 12”。
4.枚举
代码示例
构建一个表示色彩的枚举,并赋值,在1.5版本中可以写为:
public enum MyColor{ Red, Yellow, Blue }
MyColor color = MyColor.Red;
for ( MyColor mycolor : MyColor.values() )
System.out.println( mycolor );
以往的Java版本中没有enum关键词,1.5版本中终于加入了进来,这确实是一个令人高兴的改进。此外,enum还提供了一个名为values()的静态方法,用以返回枚举的所有值的集合。所以,以上程序的输出结果是把“Red”、“Yellow”、“Blue”分行输出。
而enum提供的静态方法valueOf()则将以字符串的形式返回某一个具体枚举元素的值,比如“MyColor.valueOf(“Red”)”会返回“Color.Red”。静态方法name()则返回某一个具体枚举元素的名字,比如“MyColor.Red.name()”会返回“Red”。类似的方法还有不少。此外,enum自身还可以有构造方法。
5.静态引用
代码示例
当我们要获取一个随即数时,1.5版本以前的写法是:
import java.lang.Math; //程序开头处
...
double x = Math.random();
而在1.5版本中可以写为:
import static java.lang.Math.random; //程序开头处
…
double x = random();
静态引用使我们可以象调用本地方法一样调用一个引入的方法,当我们需要引入同一个类的多个方法时,只需写为“import static java.lang.Math.*”即可。这样的引用方式对于枚举也同样有效。
分享到:
相关推荐
泛型是Java编程语言中的一个重要特性,它在2004年随着JDK 5.0的发布而引入。这个特性极大地增强了类型安全,并减少了在编写代码时的冗余。在"泛型完整代码.zip"这个压缩包中,包含的是与泛型相关的Java代码示例,很...
Java作为一门广泛使用的编程语言,其面试题涵盖了各种核心概念和技术。这份名为“Java最常见的200+面试题:面试必备(附详解答案).zip”的压缩包文件,显然是为准备Java开发者面试的人群精心准备的资源。它包含了...
Java 面试题及答案 Java 是一种广泛使用的编程语言,Java 面试中常见的问题有很多,今天我们来讨论 JDK 和 JRE 的区别、==和 equals 的区别等问题。 JDK 和 JRE 的区别 JDK(Java Development Kit)是 Java 开发...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时期就能捕获类型错误,...
* JDK、JRE、JVM之间的区别 * hashCode()与equals()之间的关系 * String、StringBuffer、StringBuilder的区别 * 泛型中extends和super的区别 * ==和equals方法的区别 * 重载和重写的区别 二、Java集合框架 * List...
### 黑马面试题总结 #### 一、进程与线程状态 **知识点:** - **进程与线程的区别:** - **进程**:是系统进行资源分配和调度的基本单位,每个进程都有独立的代码和数据空间(程序上下文)。 - **线程**:是...
·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...
·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...
### 第三部分面试题 #### 47. collection和collections的区别 - `Collection`:接口,是Java集合框架的基础接口之一。 - `Collections`:工具类,提供了一系列静态方法用于操作集合。 #### 48. list,set,map是否...
Java面试题是每个Java开发者在求职过程中必须面对的挑战,尤其在西安这样的技术密集型城市,竞争尤为激烈。本资料集包含了丰富的Java面试题、西安地区常见面试问题以及SQL相关题目,旨在帮助求职者全面准备,顺利...
Java 面试题解析 Java 是一种广泛使用的高级编程语言,由 Sun Microsystems 公司开发,现隶属于 Oracle 公司。Java 语言具有平台独立性、对象oriented、分布式、多线程、动态加载等特点。 1. Java 基础知识 * ...
以下是一些基于“120个Java经典面试题和答案”可能涉及的关键知识点: 1. **Java基础**: - 数据类型:了解基本和引用数据类型,以及它们的区别。 - 变量:声明、初始化和作用域。 - 流程控制:if-else、switch...
Java面试题是每一位希望在软件工程领域,尤其是外企求职的开发者都需要准备的重要内容。这份资源集合了多种Java相关的面试问题,旨在帮助应聘者全面掌握并理解Java编程语言的关键概念和技术。以下是一些可能出现在...
本资料“【电子版】Java校招面试题库(附答案与解析)java篇.zip”提供了一套完整的Java面试题集,帮助应聘者更好地准备面试。 1. **Java基础知识** - 类与对象:理解面向对象编程的基本概念,如封装、继承、多态...
本文档总结了 20 道 Java 面试题和答案,涵盖了 Java 基础知识、Java 和 C++ 的区别、Java 泛型、类型擦除、通配符、equals 和 == 的区别、final 关键字的作用等重要知识点。 JDK 和 JRE 的区别 JDK(Java ...
- Java版本:JDK与JRE的区别,Java SE、Java EE和Java ME的应用场景。 - 类与对象:封装、继承、多态的基本概念及其在实际编程中的应用。 - 数据类型:了解基本数据类型和引用数据类型,以及它们的区别。 2. **...
知识点/面试题总结 : (必看 ): Java 基础常见知识点&面试题总结(上) Java 基础常见知识点&面试题总结(中) Java 基础常见知识点&面试题总结(下) 重要知识点详解 : 为什么 Java 中只有值传递? Java 序列化详解 ...
在准备2022年的Java面试时,了解和掌握这些常见问题至关重要。下面是对这些问题的详细解答,旨在帮助你深入理解和应用Java相关的编程概念、框架和最佳实践。 1. **Java常用集合及特点**: - ArrayList:动态数组,...
在给定的内容中,我们可以看到提到了大量的知识点,这些内容覆盖了Java基础和Android面试题的核心主题。以下是根据文件内容整理出的知识点: Java基础知识: 1. Java集合框架:涉及ArrayList、LinkedList、HashMap...
2. 集合框架:List(ArrayList、LinkedList)、Set(HashSet、TreeSet)、Map(HashMap、TreeMap)的使用和原理,以及它们之间的区别。 3. 多线程:线程的创建方式、同步机制(synchronized、Lock)、并发工具类(如...