关于Java的批评

Java试图通过新的方式解决软件编写的复杂性。很多人认为Java语言做到了它承诺的一切 。但是Java并不是一门完美的语言。

并不是所有的工程和环境需要企业级别的复杂性,比如一个简单的个人网站或者独自编程 的程式师所写的程式。这些程式师会发现Java的复杂管理对于自己要做的程式来说过于强大 了。

一些人觉得Java在面向物件上面做的没有Ruby和Smalltalk纯粹。但是最新出现的用Java 实现的语言Groovy解决了这些问题。

作为一种已经建立的新技术,Java显然综合了很多语言的特性,比如C++、C语言、Python 等等。一些对于Java的评论认为Java的不变性在动摇。

语言问题

有些程式师不喜欢原始类型(primitive type)和类(class)的分离,尤其是那些曾经使用 过Smalltalk和Ruby的程式师。

Java的代码相对于其他的代码来说过于冗长,这与它的轻便化声明相违背。

Java是一种单层继承的语言。这也导致了程式师在试图使用多重继承时候的不便,而很多 语言都可以使用这个特性。但是Java可以使用接口类,把多重继承可能导致的风险减少到最 小。

Java不支持运算符重载,这是为了防止运算符重载使得代码的功能变的不清晰。但是用 Java实现的语言Groovy可以进行运算符重载。

过去Java对于文本的操作和其他语言,比如Perl和PHP相比差的较多,但Java在1.4版本时 候引入了正则表达式。

准确地说,JAVA不是平台无关的,它本身就是一个平台。

类库问题

使用Swing平台编写的带有GUI(图形用户接口)的程式和其他原始程式非常不同。选用 AWT工具包编写程式的程式师看到的都是原始接口,而且也无法获得先进的GUI编程支援,如 果使用的话,就要提供每个平台上面所需的API,这将是一项庞大的工程。Swing则是完全用 Java语言所写的程式,避免了接口元素重复的问题,只使用所有平台都支持的最基本的绘图 机制。但是很多用户不知道如何在Java风格和Windows风格之间进行转换,结果造成了Java程 式的接口在很多程式中非常特殊。苹果电脑已经提供了优化过的Java运行时程式,包含了Mac OS X的经典Aqua接口风格。

性能问题

由于Java编译器和虚拟机的不同对Java代码的性能影响比语言本身的影响大的多,所以统 一讨论Java的程式的性能经常是有误导性的。据IBM的资料,在同样的硬件上2001年时的IBM JDK版本的性能是1996年的JDK版本的十倍左右。见IBM东京研究院的资料: http://www.is.titech.ac.jp/ppl2004/proceedings/ishizaki_slides.pdf 而即使是在同一 时期,不同公司的JDK和JRE的性能也不一样,比如SUN、IBM、BEA等公司都有自己开发的JDK 和JRE。

Java语言的一些特性不可避免的有额外的性能代价,例如阵列范围检查、运行时类型检查 等等。Java程式的性能还会因为不同的动态复杂性和垃圾处理机制使用的多少而各有不同。 如果JVM的实现比较优化的话,那么这些功能甚至可以增加内存分配的性能。这和总是使用 STL或者托管C++的程式的情况类似。

尽管如此,仍然有许多人认为Java的性能低。这部分归因于Sun公司最初的JVM实现使用未 优化的解释机制来执行字节码。一些新版本的JVM使用Just-In-Time(JIT)编译器,在加载字 节码的时候将其编译成针对运行环境的本地代码来实现一些本地编译器的优化特性。Just- In-Time机制和本地编译的性能比较仍旧是一个有争议的话题。JIT编译需要很多时间,对于 运行时间不长或者代码很多的大型程式并不适宜。但是不算JIT编译阶段的话,程式的运行性 能在很多JVM下可以和本地编译的程式一争短长,甚至在一些计算比较密集的数值计算领域也 是这样。目前,Java已经使用更先进的HotSpot技术来代替JIT技术,Java的性能有了更进一 步的提升。另外,在使用-server选项运行java程式时,也可以对java进行更深入的优化,比 如在运行时将调用较多的方法内联(inline)到程式中来提高运行速度,这就是所谓的“动态 优化”,而本地编译器是无法做到这一点的;这也是一些java代码比对应用C/C++等语言编写 的本地代码运行的更快的原因之一。微软的.NET平台也使用JIT编译器,所以也有类似问题。 Java的设计目的主要是安全性和可携性,所以对于一些特性,比如对硬件架构和内存位址访 问的直接访问都被去除了。如果需要间接调用这些底层功能的话,就需要使用JNI(Java本地 接口)来调用本地代码,而间接访问意味着频繁调用这些特性时性能损失会很大,微软 的.NET平台也有这样的问题。所以到目前为止,性能敏感的代码,例如驱动程式和3D视频游 戏,还是大多使用本地编译,甚至直接以不直接支援面向物件的C语言或机器码编写。但最近 已经有了许多用纯Java编写的3D游戏,其效果与用C语言编写的不相上下,例如“合金战士” (英文名:Chrome)。这主要是因为新版的Java 3D技术已经能像C++一样调用硬件加速,也就 是使用显卡来加速,无论是C++还是Java语言写的3D游戏都是使用显卡及GPU来处理,从而使 得CPU可以专注于其他方面的工作。

关于Java的性能,可以参看以下文章:

http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html

http://www.matrix.org.cn/thread.shtml?topicId=16092&forumId=18

时间: 2024-09-17 04:26:55

关于Java的批评的相关文章

Java程序的性能优化StringBuffer与Vector

程序|性能|优化 ? Java使得复杂应用的开发变得相对简单.毫无疑问,它的这种易用性对Java的大范围流行功不可没.然而,这种易用性实际上是一把双刃剑.一个设计良好的Java程序,性能表现往往不如一个同样设计良好的C++程序.在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身.养成好的代码编写习惯非常重要,比如正确地.巧妙地运用java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能.下面我们就来具体地分析一下这方面的问题.

新一代Java技术即将出现

[日经BP社报道] Java技术自问世时光已经过去了9个年头.作为一名一直关注其成长的记者,曾经一段时间有过这样的想法:"Java技术已经成熟,是不是发展速度该放慢一些了呢".然而,这种想法错了.近来Java技术的进化相当显著.Java技术正在迎来"又一次革命"的风暴.这就是本文的结论. "又一次"指的是什么?"革命"指的又是什么?光看结论的话肯定是一头雾水.其实,笔者要讲的并不是变化这样一个事实,而是"促进变化的原

全栈工程师就是一棵歪脖子树

  一个故事 老张有一个林场,专门种植树木,待树木成材后销到城里做家具.林场里有不少杉树,长得都非常挺拔,偏偏不知怎的长了一棵歪脖子树,长得倒是郁郁葱葱,偏偏造型奇特,别的树都力争上油,可这棵歪脖子树不仅横着长,还长得颇为怪异.老张几次都想挖掉它当柴火烧,看它那怪异的造型又忍住了,心想等这批杉树成材,一起砍掉吧. 一到晚上夜深人静的时候,林场里就炸开了锅,杉树们极力取笑歪脖子树."你知道作为一棵树,我们的终极目标就是成为有用之材吗,你看旁边那个,可以做梁柱,小歪脖子,你丫能干啥啊?":

Java核心技术 卷Ⅰ 基础知识(原书第10版)

Java核心技术系列 Java核心技术 卷Ⅰ 基础知识 (原书第10版) Core Java Volume I-Fundamentals (10th Edition) [美] 凯S.霍斯特曼(Cay S. Horstmann) 著 周立新 陈 波 叶乃文 邝劲筠 杜永萍 译 图书在版编目(CIP)数据 Java核心技术 卷Ⅰ 基础知识(原书第10版) / (美)凯S. 霍斯特曼(Cay S. Horstmann)著:周立新等译. -北京:机械工业出版社,2016.8 (Java核心技术系列) 书

Java接口和抽象类实例分析

  本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类. 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体

Java性能的优化(上)(转)

性能|优化 Java在九十年代中期出现以后,在赢得赞叹的同时,也引来了一些批评.赢得的赞叹主要是Java的跨平台的操作性,即所谓的"Write Once,Run Anywhere".但由于Java的性能和运行效率同C相比,仍然有很大的差距,从而引来了很多的批评. 对于服务器端的应用程序,由于不大涉及到界面设计和程序的频繁重启,Java的性能问题看似不大明显,从而一些Java的技术,如JSP,Servlet,EJB等在服务器端编程方面得到了很大的应用,但实际上,Java的性能问题在服务器

Java 理论与实践: 关于异常的争论

关于在 Java 语言中使用异常的大多数建议都认为,在确信异常可以被捕获的任何情况下,应该优先使用检查型异常.语言设计(编译器强制您在方法签名中列出可能被抛出的所有检查型异常)以及早期关于样式和用法的著作都支持该建议.最近,几位著名的作者已经开始认为非检查型异常在优秀的 Java 类设计中有着比以前所认为的更为重要的地位.在本文中,Brian Goetz 考察了关于使用非检查型异常的优缺点. ??与 C++ 类似,Java 语言也提供异常的抛出和捕获.但是,与 C++ 不一样的是,Java 语言

java编写TCP方式的通信程序

程序   Java API中封装了大量的函数,供编写网络通信程序时使用.这使得java在网络方面具有强大的功能.用java编写TCP方式的通信程序比较简单,但也有一些问题需要注意. 以下为监听主程序,监听程序在发现客户端连接后,启动一个会话socket线程,以实现实时发送,接收信息和多客户端同时工作.import java.io.*;import java.lang.*;import java.net.ServerSocket;import java.net.Socket;//主程序一直处于监听

Java数据库程序中的存储过程设计

程序|存储过程|设计|数据|数据库 本文阐述了怎么使用DBMS存储过程.阐述了使用存储过程的基本的和高级特性,比如返回ResultSet.本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言),但是,并不要求你有任何存储过程的编程经历. 存储过程是指保存在数据库并在数据库端执行的程序.你可以使用特殊的语法在Java类中调用存储过程.在调用时,存储过程的名称及指定的参数通过JDBC连接发送给DBMS,执行存储过程并通过连接(如果有)返回结果