`
luofeng113
  • 浏览: 19784 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

Jdk1.5中的新特性 --泛型

阅读更多
一,Java中的泛型:
在Java中能使用到泛型的多是容器类,如各种list map set,因为Java是单根继承,所以容器里边可以放的
内容是任何Object,所以从意义上讲原本的设计才是泛型。但用过Java的人是否感觉每次转型很麻烦呢?
而且会有些错误,比如一个容器内放入了异质对象,强制转型的时候会出现cast异常。而这中错误在编译器是
无从发现的。所以jdk1.5中提供了泛型,这个泛型其实是向c++靠拢了.好,我们先看几个实例再细说原理。

二,泛型的用法:(多个实例)


1  实例A
2 ArrayList < String >  strList  =   new  ArrayList < String > ();
3 strList.add( " 1 " );
4 strList.add( " 2 " );
5 strList.add( " 3 " );
6  // 关键点(1) 注意下边这行,没有强制转型
7  String str  =  strList.get( 1 );
8  // 关键点(2)然後我们加入,这个时候你会发现编译器报错,错误在编译器被发现,错误当然是发现的越早越好
9  strList.add( new  Object());
1  实例B
2 ArrayList < Integer >  iList  =   new  ArrayList < Integer > ();
3  // 关键点(3) 注意直接把整数放入了集合中,而没有用Integer包裹
4  iList.add( 1 );
5 iList.add( 2 );
6 iList.add( 3 );
7  // 关键点(4)同样直接取出就是int
8  int  num  =  iList.get( 1 );
1  实例C
2  // 关键点(5)展示一下key-value的时候要怎么写,同时key和value也可以是基本类型了。
3  HashMap < Integer,Integer >  map  =   new  HashMap < Integer,Integer > ();
4 map.put( 1 ,  11 );
5 map.put( 2 ,  22 );
6 map.put( 3 ,  33 );
7  int  inum  =  map.get( 1 );

三,看完了实例了,详细来说说为什么吧
首先jdk1.5中的泛型,第一个解决的问题,就是Java中很多不必要的强制转型了,具体的实现,我们以ArrayList
为例,下边是ArrayList中的片断代码:

1ArrayList类的定义,这里加入了<E>
2public class ArrayList<E> extends AbstractList<E>
3        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
4
5//get方法,返回不再是Object 而是E
6public E get(int index) {
7    RangeCheck(index);
8    return elementData[index];
9}
10//add方法,参数不再是Object 而是E
11public boolean add(E o) {
12    ensureCapacity(size + 1);  // Increments modCount!!
13    elementData[size++] = o;
14    return true;
15}
16

四,Boxing 和UnBoxing
看到上边的关键点(3)和(4)是否感觉惊奇呢,因为Java中烦人的除了强制转型,另一个就是基础类型了
放入容器的时候要包装,取出了还要转回。Jdk1.5中解决了这个问题.如上边的使用方法

五,泛型的生命周期(使用注意事项)
如果我们试着把ArrayList<String> list的内容序列化,然後再读取出来,在使用的过程中会发现出错,
为什么呢?用Stream读取一下回来的数据,你会发现<String>不见了,list变成了普通的ArrayList,而不是
参数化型别的ArrayList了,为什么会这样呢 ?见下边的比较

六,C++的泛型和Java的泛型
在泛型的实现上,C++和Java有着很大的不同,
Java是擦拭法实现的
C++是膨胀法实现的
因为Java原本实现就是泛型的,现在加入型别,其实是"窄化",所以采用擦拭法,在实现上,其实是封装了原本的
ArrayList,这样的话,对于下边这些情况,Java的实现类只有一个。



1ArrayList<Integer>  .;   public class ArrayList
2ArrayList<String>  ..;   --同上--
3ArrayList<Double>  ..;   --同上--
4而C++采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现,实现类有多个
5list<int> li;                class list; //int 版本
6list<string> ls;             class list; //string 版本
7list<double> ld;             class list; //double 版本   
这就造成了,在序列化后,Java不能分清楚原来的ArrayList是
ArrayList<Integer>还是ArrayList

七,题外话,在很多东西的实现上C++和Java有很多不同
例如运算符的问题i=i++问题,详细看这里
例如在C++中能很好实现的double-checked locking单态模式,在Java中几乎很难实现 详细看这里
还有就是上边提到的泛型实现上。


八,Jdk 1.5加入了不少新东西,有些能很大的提高开发质量,例如Jdk1.4 ,Jdk.15中StringBuffer的不同
因为从1。4转入1。5不久,所以慢慢会发一些在1。5的使用过程中发现的东西。

在JDK1.5中加入了泛型,能帮助我们简化代码,能解决不少问题,那JDK1.5中是如何实现的呢 ?
JDK1.5中泛型的实现是擦拭法实现的,不同与c++中的泛型。说擦拭法可能有点难理解,所以从下边的角度理解一下:
我们写一个程序  1 package com.jdk15;
2
3 import java.util.ArrayList;
4
5 public class Generic {
6     public static void main(String[] args){
7         ArrayList<String> list = new ArrayList<String>();
8         list.add("a");
9         list.add("b");
10         String str = list.get(0);
11     }
12 }编译成.class的文件
然后用Jad反编译后的结果:
1 // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
2 // Jad home page: http://www.kpdus.com/jad.html
3 // Decompiler options: packimports(3)
4 // Source File Name:   Generic.java
5
6 package com.jdk15;
7
8 import java.util.ArrayList;
9
10 public class Generic
11 {
12
13     public Generic()
14     {
15     }
16
17     public static void main(String args[])
18     {
19         ArrayList list = new ArrayList();
20         list.add("a");
21         list.add("b");
22         String str = (String)list.get(0);
23     }
24 }
25 看到这个是否明白了吗 ?
在JDK1.5中,只是在编译期作了下手脚,就是在你编译之前,自动补充了转型,然后编译实现的。
所以JDK1.5中的泛型只简化了代码的编写,并没有提高性能的原因。因为转型并没有去掉。


最后,我们还可以自己写类似ArrayList这样的泛型类,至于如何自定义泛型类,泛型方法请参见候捷先生的文章

分享到:
评论

相关推荐

    详细介绍JDK1.5的各种新特性

    以下是JDK1.5中的主要新特性及其详细解释: 1. **泛型(Generics)**:泛型是JDK1.5引入的最大变革之一。它允许在类、接口和方法中使用类型参数,提高了代码的类型安全性和重用性。泛型帮助程序员在编译时检查类型...

    jdk1.5x64位 windows版.zip

    综上所述,JDK1.5是Java发展历程中的一个重要里程碑,它的特性改进了编程体验,提升了代码质量和运行效率。而64位Windows版的JDK1.5,则是针对Windows用户的一种优化选择,满足了开发者在64位环境下的需求。文件"jdk...

    JDK1.5新特性

    2. **泛型**:泛型是1.5最重要的新特性之一,它允许在类、接口和方法中使用类型参数,增强了类型安全性和代码重用性。泛型可以限制集合元素的类型,避免了类型转换错误。 3. **枚举类(enum)**:之前的Java中,...

    JDK1.5新特性泛型_深入研究.doc

    ### JDK1.5新特性泛型深入研究 #### 一、引言 随着软件工程的发展,类型安全成为了程序设计中的一个重要考量因素。Java作为一种广泛使用的编程语言,在其发展历程中不断引入新的特性以满足日益增长的需求。JDK1.5...

    jdk1.5 windows版本 64位

    它于2004年9月30日正式发布,引入了许多新的特性,如自动内存管理的增强(例如泛型、枚举、变量类型推断、增强的for循环),对XML支持的加强,新的日期/时间API,以及改进的反射机制。这些特性显著提升了Java编程的...

    jdk1.5新特性

    ### JDK 1.5 新特性详解 #### 泛型编程 **定义与作用:** 泛型编程是 Java 1.5 引入的一项重要特性,它允许开发者在编译时进行类型安全检查,从而避免了运行时可能出现的类型转换异常。通过在编译阶段检查类型安全...

    jdk1.5的新特性泛型的实例代码

    Java开发工具包(JDK)1.5引入了一项重大改进,那就是泛型(Generics)。泛型是Java编程语言中的一个关键特性,它允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。通过泛型,...

    linux系统jdk1.5下载

    JDK1.5引入了一些重要的特性,如增强的for循环(foreach)、匿名内部类的改进、枚举类型以及泛型的初步支持。这些特性对Java编程产生了深远影响,提升了代码的可读性和安全性。 然而,由于JDK1.5已不再受官方支持,...

    Java-jdk1.5安装包

    JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...

    jdk1.5(jdk-1_5_0_08-windows-i586-p.exe)

    泛型是JDK 1.5引入的最重要的特性之一,允许开发者在类、接口和方法中使用类型参数,提高了代码的类型安全性和可读性,减少了强制类型转换的需要。 2. **枚举(Enums)** JDK 1.5引入了枚举类型,使得定义常量...

    JDK1.5-1.6-1.7新特性

    在Java的JDK 1.5到1.7版本中,引入了一系列的新特性,极大地提升了开发效率和代码的可读性。以下是对这些新特性的详细介绍: 1. **自动装箱与拆箱**: 自动装箱允许基本类型与对应的包装类之间进行无缝转换。在JDK...

    javajdk1.5安装与配置环境变量(最新).txt

    JDK 1.5(也称为Java SE 5.0)是Sun Microsystems公司于2004年发布的版本,该版本引入了许多重要的改进和特性,如泛型、枚举类型、可变参数方法等。 #### 二、JDK 1.5 的安装步骤 1. **下载JDK 1.5**: - 访问...

    JDK1.5的32位和64位安装包

    总结来说,JDK1.5是Java发展历程中的一个重要节点,它的泛型、自动装箱/拆箱、枚举、变长参数和增强for循环等特性极大地提升了开发效率和代码质量。同时,了解不同操作系统对应的JDK版本是进行Java开发的基础知识。...

    jdk1.5新特性关于动态参数,泛型等

    在 JDK 1.5 中,Java 语言引入了一系列重要的新特性,极大地提升了代码的可读性、安全性以及效率。以下是对这些新特性的详细解析: 1. 泛型(Generics) 泛型是 JDK 1.5 最重要的改进之一,它允许在定义集合类时...

    jdk1.5后的特性.rar

    枚举是 JDK 1.5 中引入的另一种新特性,用于替代传统的常量类,提供了一种更安全、更强大的方式来定义固定数量的值。枚举类型可以包含方法、变量,甚至实现接口。 - **声明枚举**:使用 `enum` 关键字定义枚举,如 ...

    JDK1.5中文帮助文档

    这个“JDK1.5中文帮助文档”是官方英文文档的中文译本,为中文用户提供了详细的解释和易于理解的指导,旨在帮助开发者更好地理解和利用JDK 1.5的新功能。** 1. **泛型(Generics)** 泛型是JDK 1.5引入的最显著的...

    JDK1.5,JDK1.5

    泛型是JDK1.5最重要的特性之一,它允许在类、接口和方法声明中使用类型参数,以实现数据类型的参数化。泛型提高了代码的类型安全性和可读性,减少了类型转换的需要,并允许编译器检查类型错误。 2. **自动装箱与...

    java JDK1.5---32位和64位

    1. **泛型(Generics)**:这是JDK 1.5最重要的特性之一,允许在类、接口和方法中声明参数化类型,从而提高了代码的类型安全性和重用性。泛型有助于减少类型转换的错误,并在编译时期就能发现潜在的问题。 2. **...

    JDK1.5-1.6-1.7之新特性总结-1

    在Java的发展历程中,JDK 1.5到1.7版本引入了许多重要的新特性,极大地提升了开发效率和代码质量。下面将详细讲解这些版本中的关键特性。 **1. 自动装箱与拆箱** 自动装箱是JDK 1.5引入的一个重要特性,它使得基本...

    jdk1.5中文帮助文档

    这份《JDK 1.5中文帮助文档》包含了所有这些特性的详细解释,以及API的完整参考,是开发者学习和查阅Java 1.5特性的必备资料。无论你是初学者还是经验丰富的开发者,都可以从中受益匪浅,提高编程效率,编写出更加...

Global site tag (gtag.js) - Google Analytics