新闻中心> 文章详情

浅谈C#开发者如何过渡到Java开发者

2015年07月13日

  由于工作需要,最近也开始倒腾Java了.NET的话,从2012年测试版开始玩的,那个时候VB6比较熟悉,还天真的以为VB.NET以后会很火,事实证明,也只是一厢情愿,有C#了,要VB.NET干什么?既生瑜,何生亮...


  一门语言玩得久,也不能说对一门语言就精通了,装配脑袋,赵姐夫才是大牛.我也只是一个爱好者罢了.南京万和Java培训


  说回正题,园子里面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则好很多。南京万和Java培训


  2.泛型


  泛型则是Java的一个槽点。擦除法害死人。


  下面的技术问题,如果有觉得错误的地方,请一定指出。


  C# 的泛型,根据不同的类型参数,产生不同的新的匿名类,Java则只是编译阶段,假装有泛型的概念。

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


  现在集中吐槽一下上面这段代码。


  一个列表的话,删除元素,C#会有一个 Remove 和 一个RemoveAt,前者表示要删除指定的元素,后者表示删除指定下标的元素。


  然后,如果你在代码里面写 c.remove(1); Java的动作是删除下标为1的元素。。


  这里主要的问题是,当初Java在设计的时候,没有考虑到通过下标删除或者直接删除两种需求,所以没有将RemoveAt和Remove区别起来.


  当然,这样就造成了Remove(Integer)的时候,会出现歧异,为了消除歧义,又需要将Integer或者其他泛型类型强制转为Object.


  在C#里面,由于具有RemoveAt方法,完整的泛型支持,所以Remove方法后面直接跟上要Remove的东西即可,这里是需要注意的一个点.


  int 和 Int32,在C#里面是同一个类型(当然都是值类型,保存在栈上面的)


  C# Via CLR里面也说过这件事情,int 是Int32的别名.(如果这个想法有错误,希望大家指出)


  所以在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版本的。南京万和Java培训


  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培训


  谁来说说Java 的字符串机制。


  7.市场和前途


  做了很多人力资源的工作,感觉NET在国内没有Java火。


  日本的话,NET有项目,但是大部分还是Java。


  NET和Java的顶尖高手人数差不多,但是中低水平的人,Java占据大部分,理由还是就业需要。


  真正的高手,NET和Java使用起来都应该很熟练的,算法业务才是重点,语言只是工具。


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


  欢迎指出技术上的问题和硬伤,或者补充一些我没有列举的区别,江苏万和计算机培训中心


上一篇下一篇
按时发顺丰

技术交流群

Java大数据交流群560819979    加入
Python技术交流群595083299    加入
Oracle技术交流群595119011    加入
Web前端技术交流群604697610    加入
Huawei技术交流群482919361    加入
Redhat技术交流群587875348    加入
UI设计技术交流群511649801    加入
Cisco技术交流群596886705    加入
IT运维技术交流群605888381    加入