1) I/O:這個東西其實比較沒什麼意義,不過java的流概念跟C#的流概念其實都差不多,繼承體系都差不多,只是Java中是Input,Output,而C#中是Read和Write.其實各自支持類中的方法名大部分都相同.當然,C# 除了流支持外,還兼容原來的一些文件讀寫.
2)序列化:對象的序列化兩者都有支持,做法都差不多,當然,C# 中除了二進制序列化外,還可以序列化成XML格式(Java中有不有還有待更進一步了解).序列化的用途其實也差不多(主要是RMI).
3)反射機制:兩者的反射機制差不多,當然,在這個方面C#的要完善一些,還加入了元屬性(Attribute)的概念(Java中有不有類似的東西,學到目前還沒發現,Java中的注解在C#中應該是///表達的東西).C#的反射內在機制我比較了解,Java的就不是很了解。但這種東西在Delphi中很早就有類似實現,只是沒有現在的C#這樣完善。當然,delphi還是欠缺些,而Java和C#都足夠用。
4)多線程:這個其實是與語言無關的東東,不過在Java和C#中基本的實現方法還是差不多,類名都一樣,只是方法名一個是run,一個叫Execute.Java中可以用Runable接口來簡化線程的創建,C# 中是用方法和委托(包括Lamda表達式)來完成同樣的工作.C#中的線程池(嚴格講這屬於框架而不是語言),後台任務之類的可以看作是一些二次封裝的東西,沒有對比的價值.
5)代碼注入:C#和Java都是基於中間語言(C#的IL,Java的字節碼),因此在實現代碼注入上都比較方便,因此Spring中的面向方面的實現方法在C#中也很容易實現(可以參考我前面的博文).
6)重載:雙方都支持方法的重載,而且規則基本差不多.為了簡化這種重載C#中可以用參數缺省和params關鍵字來減少方法的個數,比如public void DoF(params object[] pms),調用的時候可以是DoF(p1),也可以是DoF(p1,p2...)等,這個在Java中是使用"..."來定義的:public void DoF(Object...pms).Java不支持參數缺省,參數缺省有其方便性,但不是必需(Delphi中很早就支持)。
7)委托和事件:這是帶有函數指針,回調方法等味道的東東,找了一下,在Java中沒有類似的概念,如果需要實現類似的東西,需要用到設計模式,比如觀察者,代理等。C#,Delphi都有這個東西,這其實還是個非常好用的東西。我覺得Java完全可以借鑒升級一下(我查了一下,Java確實沒有類似的東西,當然,也可能是我孤陋寡聞),Java沒有這個可能是源於對純面向對象語言的追求和對指針濫用的某種不安。
補充:經過查閱資料,Java中也有回調函數的實現,但實際上,這不是真正意義上的回調函數,只是一種模擬類似功能的東西.因為其傳入的其實不是方法,而是類.從這個角度來看,我前面說的關於Java沒有委托和事件的原因,估計是對的.
8)逆變和協變:其實只要是面向對象編程,存在繼承就有這兩種情況(方法的參數和返回值)。但大家只要把握一個原則:老子能用的地方兒子也能用,反之則不然。
總結:如果你對數據結構,操作系統,算法,面向對象編程等比較了解,其實相互轉換還是比較容易的。做為苦B的程序員,完全沒有必要為語言的排名而糾結,學習語言要有凌駕於語言層面之上的意識。