java 1.5 新特性_Jdk1.5中的新特性 --泛型 (详细版)

本来只转载了个链接,和一个简单的使用程序,但昨天不小心看到有人批判jdk1.5,先说java要强制转型不好的问题没解决,

容器不能放基类型不好,接着说泛型没用。而恰恰Jdk1.5中解决了这些问题,所以感叹之余,把这篇文章改一下,详细的说说泛型。

一,Java中的泛型:

在Java中能使用到泛型的多是容器类,如各种list map set,因为Java是单根继承,所以容器里边可以放的

内容是任何Object,所以从意义上讲原本的设计才是泛型。但用过Java的人是否感觉每次转型很麻烦呢?

而且会有些错误,比如一个容器内放入了异质对象,强制转型的时候会出现cast异常。而这中错误在编译器是

无从发现的。所以jdk1.5中提供了泛型,这个泛型其实是向c++靠拢了.好,我们先看几个实例再细说原理。

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

1

4f1150b881333f12a311ae9ef34da474.png

实例A

2

4f1150b881333f12a311ae9ef34da474.pngArrayList

<

String

>

strList

=

new

ArrayList

<

String

>

();

3

4f1150b881333f12a311ae9ef34da474.pngstrList.add(

"

1

"

);

4

4f1150b881333f12a311ae9ef34da474.pngstrList.add(

"

2

"

);

5

4f1150b881333f12a311ae9ef34da474.pngstrList.add(

"

3

"

);

6

4f1150b881333f12a311ae9ef34da474.png

//

关键点(1) 注意下边这行,没有强制转型

7

4f1150b881333f12a311ae9ef34da474.png

String str

=

strList.get(

1

);

8

4f1150b881333f12a311ae9ef34da474.png

//

关键点(2)然後我们加入,这个时候你会发现编译器报错,错误在编译器被发现,错误当然是发现的越早越好

9

4f1150b881333f12a311ae9ef34da474.png

strList.add(

new

Object());

1

4f1150b881333f12a311ae9ef34da474.png

实例B

2

4f1150b881333f12a311ae9ef34da474.pngArrayList

<

Integer

>

iList

=

new

ArrayList

<

Integer

>

();

3

4f1150b881333f12a311ae9ef34da474.png

//

关键点(3) 注意直接把整数放入了集合中,而没有用Integer包裹

4

4f1150b881333f12a311ae9ef34da474.png

iList.add(

1

);

5

4f1150b881333f12a311ae9ef34da474.pngiList.add(

2

);

6

4f1150b881333f12a311ae9ef34da474.pngiList.add(

3

);

7

4f1150b881333f12a311ae9ef34da474.png

//

关键点(4)同样直接取出就是int

8

4f1150b881333f12a311ae9ef34da474.png

int

num

=

iList.get(

1

);

1

4f1150b881333f12a311ae9ef34da474.png

实例C

2

4f1150b881333f12a311ae9ef34da474.png

//

关键点(5)展示一下key-value的时候要怎么写,同时key和value也可以是基本类型了。

3

4f1150b881333f12a311ae9ef34da474.png

HashMap

<

Integer,Integer

>

map

=

new

HashMap

<

Integer,Integer

>

();

4

4f1150b881333f12a311ae9ef34da474.pngmap.put(

1

,

11

);

5

4f1150b881333f12a311ae9ef34da474.pngmap.put(

2

,

22

);

6

4f1150b881333f12a311ae9ef34da474.pngmap.put(

3

,

33

);

7

4f1150b881333f12a311ae9ef34da474.png

int

inum

=

map.get(

1

);

8

4f1150b881333f12a311ae9ef34da474.png

三,看完了实例了,详细来说说为什么吧

首先jdk1.5中的泛型,第一个解决的问题,就是Java中很多不必要的强制转型了,具体的实现,我们以ArrayList

为例,下边是ArrayList中的片断代码:

1

4f1150b881333f12a311ae9ef34da474.pngArrayList类的定义,这里加入了24f1150b881333f12a311ae9ef34da474.pngpublicclassArrayListextendsAbstractList34f1150b881333f12a311ae9ef34da474.pngimplementsList, RandomAccess, Cloneable, java.io.Serializable44f1150b881333f12a311ae9ef34da474.png54f1150b881333f12a311ae9ef34da474.png//get方法,返回不再是Object 而是E61fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicE get(intindex)9b8a8a44dd1c74ae49c20a7cd451974e.png{7d18c02628675d0a2c816449d98bda930.png    RangeCheck(index);8d18c02628675d0a2c816449d98bda930.pngreturnelementData[index];98f1ba5b45633e9678d1db480c16cae3f.png}104f1150b881333f12a311ae9ef34da474.png//add方法,参数不再是Object 而是E111fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicbooleanadd(E o)9b8a8a44dd1c74ae49c20a7cd451974e.png{12d18c02628675d0a2c816449d98bda930.png    ensureCapacity(size+1);//Increments modCount!!13d18c02628675d0a2c816449d98bda930.pngelementData[size++]=o;14d18c02628675d0a2c816449d98bda930.pngreturntrue;158f1ba5b45633e9678d1db480c16cae3f.png}164f1150b881333f12a311ae9ef34da474.png

四,Boxing 和UnBoxing

看到上边的关键点(3)和(4)是否感觉惊奇呢,因为Java中烦人的除了强制转型,另一个就是基础类型了

放入容器的时候要包装,取出了还要转回。Jdk1.5中解决了这个问题.如上边的使用方法

五,泛型的生命周期(使用注意事项)

如果我们试着把ArrayList list的内容序列化,然後再读取出来,在使用的过程中会发现出错,

为什么呢?用Stream读取一下回来的数据,你会发现不见了,list变成了普通的ArrayList,而不是

参数化型别的ArrayList了,为什么会这样呢 ?见下边的比较

六,C++的泛型和Java的泛型

在泛型的实现上,C++和Java有着很大的不同,

Java是擦拭法实现的

C++是膨胀法实现的

因为Java原本实现就是泛型的,现在加入型别,其实是"窄化",所以采用擦拭法,在实现上,其实是封装了原本的

ArrayList,这样的话,对于下边这些情况,Java的实现类只有一个。

1

4f1150b881333f12a311ae9ef34da474.pngArrayList9b8a8a44dd1c74ae49c20a7cd451974e.png.;publicclassArrayList24f1150b881333f12a311ae9ef34da474.pngArrayList9b8a8a44dd1c74ae49c20a7cd451974e.png..;--同上--34f1150b881333f12a311ae9ef34da474.pngArrayList9b8a8a44dd1c74ae49c20a7cd451974e.png..;--同上--44f1150b881333f12a311ae9ef34da474.png而C++采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现,实现类有多个54f1150b881333f12a311ae9ef34da474.pnglistli;classlist;//int 版本64f1150b881333f12a311ae9ef34da474.pnglistls;classlist;//string 版本74f1150b881333f12a311ae9ef34da474.pnglistld;classlist;//double 版本

这就造成了,在序列化后,Java不能分清楚原来的ArrayList是

ArrayList还是ArrayList

七,题外话,在很多东西的实现上C++和Java有很多不同

例如运算符的问题i=i++问题,详细看这里

例如在C++中能很好实现的double-checked locking单态模式,在Java中几乎很难实现 详细看这里

还有就是上边提到的泛型实现上。

八,Jdk 1.5加入了不少新东西,有些能很大的提高开发质量,例如Jdk1.4 ,Jdk.15中StringBuffer的不同

因为从1。4转入1。5不久,所以慢慢会发一些在1。5的使用过程中发现的东西。

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

本文大部份内容来自候捷写的jdk1.5泛型的文章http://jjhou.csdn.net/javatwo-2004-gp-in-jdk15.pdf  向他致敬。

posted on 2006-11-08 11:04 dreamstone 阅读(5283) 评论(7)  编辑  收藏 所属分类: jdk相关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值