聊一下C#開發人員如何過渡到JAVA 開發人員

來源:互聯網
上載者:User

標籤:

由於工作需要,最近也開始倒騰Java了.NET的話,從2012年測試版開始玩的,那個時候VB6比較熟悉,還天真的以為VB.NET以後會很火,

事實證明,也只是一廂情願,有C#了,要VB.NET幹什麼?既生瑜,何生亮...

一門語言玩得久,也不能說對一門語言就精通了,裝配腦袋,趙姐夫才是大牛.我也只是一個愛好者罷了.

說回正題,園子裡面NET和JAVA好壞的文章已經無數了,這裡只是想說說Csharper轉Javaer的一些感受,無意評價語言優劣,我們沒有資格.

1.IDE

VS是宇宙第一IDE,這個是無可爭辯的,Eclipse雖然有些弱,但也做得不錯了.

相比VS動輒8,9個G的身材,Eclipse則小很多,我用的是J2EE版本的Eclipse,解壓後300M+,免安裝.

當然,VS龐大,但是對於提高開發效率,則有則無可比擬的優勢.

    for(int i=0;i<5;i++){            }

這樣的代碼,我在Eclipse裡面是一個字元一個字元輸入的,VS的話,打完 for 之後,兩下Tab就可以了。

當然在代碼重構這裡,Eclipse則可用的操作比原生的VS多很多。(VS2015的話,重構也很牛逼,ReSharp附體的感覺)

IDE的話,還是一分大小一分功能,對於腦子比手快的同學來說,Eclipse是一種折磨。如果有Java的高手,請教一下如何加快速度。

另外一點,Eclipse的預設字型,對中文不友好,VS則好很多。

2.泛型

泛型則是Java的一個槽點。擦除法害死人。

下面的技術問題,如果有覺得錯誤的地方,請一定指出。

C# 的泛型,根據不同的型別參數,產生不同的新的匿名類,Java則只是編譯階段,假裝有泛型的概念。

    ArrayList<Integer> c = new  ArrayList<Integer>();    c.remove(1);    c.remove((Object)1);

現在集中吐槽一下上面這段代碼。

一個列表的話,刪除元素,C#會有一個 Remove 和 一個RemoveAt,前者表示要刪除指定的元素,後者表示刪除指定下標的元素。

然後,如果你在代碼裡面寫 c.remove(1); Java的動作是刪除下標為1的元素。。

這裡主要的問題是,當初Java在設計的時候,沒有考慮到通過下標刪除或者直接刪除兩種需求,所以沒有將RemoveAt和Remove區別起來.

當然,這樣就造成了Remove(Integer)的時候,會出現歧異,為了消除歧義,又需要將Integer或者其他泛型型別強制轉為Object.

在C#裡面,由於具有RemoveAt方法,完整的泛型支援,所以Remove方法後面直接跟上要Remove的東西即可,這裡是需要注意的一個點.

3 基本類型

            int a = 1;            Int32 b = 2;

int 和 Int32,在C#裡面是同一個類型(當然都是實值型別,儲存在棧上面的)

C# Via CLR裡面也說過這件事情,int 是Int32的別名.(如果這個想法有錯誤,希望大家指出)

            List<int> t = new List<int>();            List<Int32> m = new List<int>();

所以在C#裡面這樣寫是可以的.

 

在Java裡面,int 和 Integer 可是涇渭分明:

int 表示基礎類型,Integer表示類,在泛型的時候,只能用Integer.

這裡的區別我不是很清楚,int 好像就是一個簡單的存放數位東西,也沒有什麼方法可以使用.

    ArrayList<Integer> c = new  ArrayList<Integer>();

所以,Java裡面,型別參數T 看上去也沒有C#靈活。

 

4.Java沒有Struct概念

本質上說Class和Struct在業務上差不多。只是 Class在堆上,Struct在棧上,一個是引用傳遞,一個是值傳遞。

一般來說,一個 輕的結構,貧血模型,我喜歡用Struct,一個 重的結構,充血模型,我喜歡用Class。

Java,很抱歉,沒有Struct,解決方案是Class,或者是內部Class。。

為什麼Struct不能在Java裡面實現,是設計使然,還是技術問題,我不知道。

 

5.Java的枚舉

這裡倒不是吐槽Java枚舉功能上的問題,而是,Enum這個玩藝,還要依賴於JDK版本的。

JDK1.5以上才行,如果你的工程JDK版本過低,Enum都不支援。

C#裡面的Enum應該是全Framework支援的,(現在都找不到NET2.0以前的Framework了,無法驗證1.0,1.1,記憶中是支援的。)

為什麼說到這個問題呢,有一次帶學生做實驗,Eclipse裡面建立了一個工程,也沒有選擇JDK版本,使用了預設的低版本的JDK,然後,呵呵,

Enum這麼簡單的東西,都編譯不過。學藝不精阿。。。

Enum的值,本質是一個數字,Enum則是一個結構,Java的Enum是什麼呢?

 6.字串

 

            String A = "Hello";            String B = "Hello";            System.Console.WriteLine(A == B);            System.Console.ReadLine();

 

C#裡面是True。Java裡面也是True。

(Java裡面A和B的地址指向同樣的地方?C#字串駐留了。)

 

            String a = new string(‘a‘, 10);            String b = new string(‘a‘, 10);            Console.WriteLine(a == b);            Console.ReadLine();

這個在C#裡面也是True,比較地址,由於NET的神秘的字串駐留機制,其實兩個String指向同樣的地方。

 

String A = new String("Hello");String B = new String("Hello");Boolean C = (A==B);

這裡是False,Java真正的比較了兩個地址,兩個地址是不同的。如果真的要比較,請用諸如 Boolean C = (A.equals(B)); 這樣的方法。

誰來說說Java 的字串機制。

 

7.市場和前途

做了很多人力資源的工作,感覺NET在國內沒有Java火。

日本的話,NET有項目,但是大部分還是Java。

NET和Java的頂尖高手人數差不多,但是中低水平的人,Java佔據大部分,理由還是就業需要。

真正的高手,NET和Java使用起來都應該很熟練的,演算法業務才是重點,語言只是工具。

 

千萬別在回複裡面討論語言的好壞,我們沒有資格。

歡迎指出技術上的問題和硬傷,或者補充一些我沒有列舉的區別。

 

聊一下C#開發人員如何過渡到JAVA 開發人員

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.