聊一下C#开发者如何过渡到JAVA 开发者

作者:   出处:互联网   2015-07-02 23:43:19   阅读:2

由于工作需要,最近也开始倒腾Java了.NET的话,从2015年测试版开始玩的,那个时候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 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使用起来都应该很熟练的,算法业务才是重点,语言只是工具。


 

千万别在回复里面讨论语言的好坏,们没有资格。


 

欢迎指出技术上的问题和硬伤,或者补充一些没有列举的区别。

Copyright© 2006-2015 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 渝ICP备12000264号 法律顾问:元炳律师事务所
客服软件
live chat