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