.NET与Java,因这两种技术的相似性,总是会让人拿来做比较,并且总有人想让二者一分高下,最后得出孰优孰劣的结论。由于本人先用.NET,后转Java,现在.NET与Java二者并用,所以对二者间的差异颇有体会,胸中之词,不吐不快。

CLR VS JavaVM。虚拟机的概念让Java/C#这些比C/C++更为高级的语言成为现实。Java虚拟机的确是划时代之作,在功能、性能、跨平台等各个方面都非常强大。后来微软.NET中的CLR必然是借鉴了Java虚拟机的诸多优点,但CLR并未超越JavaVM,在跨平台等方面还存在劣势(mono还不够实用),但是应该说在Windows下,CLR已经足够好用了。因此,在这一级别上二者应该是半斤八两,.NET半斤,Java八两。

C# VS Java。虽然C#推出要比Java晚很多,但是C#已经由模仿到发展,并实现了快速超越。.NET版本推陈出新,快速发展,而Java语言的发展则显得疲软无力。C#与Java都传承了C++的语言风格,但C#在语言级别加入了更多新特性:属性(property)、索引、委托等,这些新的语言特性让人在用C#写程序的时候感觉就像是在写说明书一样清晰简单,而Java至今仍不肯加入这些特性,为了实现相同的目的,Java程序员不得不使用一些开源包、一些编程约定、一些限制规则等拐弯抹角的实现简单的功能。或许有人对此不以为意,认为只要由方法可以实现的特性就没必要加入到语言中来。但是看一看.NET的每一次版本更新都会带来更加简洁的语法,更少的代码即可实现更多的逻辑,这不就是编程语言不断发展的意义所在么?在.NET2.0的时候,在Class里面写get/set属性已经够简单了,但到了.NET3.0以后的版本,连get/set属性的方法体以及私有变量都可以省略掉了,而在Java里面,就不得不遵守约定的get/set方法的命名格式,不断的检查方法名称是否正确,并编写大量的代码来维护这些get和set方法,即使这些代码是由编辑器自动构造的,你也不得不面对这些枯燥的重复代码以及代码维护的问题。此外,Java还有一个让人十分费解的设计。在C#中,一切类型都是类,使用int和使用Int32是完全一样的,而在Java中,使用int和Integer则完全不同,int是一种值,而Integer则是一种类型,最要命的是在很多时候两者之间不能自动转换,即使是手动转换也可能由于Integer类型等于null而导致转换失败,这个设计简直就是C++中空指针问题的延续,这样的设计问题比比皆是,虽然问题都很小,但使用起来十分不便,有时候都怀疑Java是否真的比C++更高级。时至今日,Java已经开始模仿C#了,Java语言后来的标注特性就是参考了.NET的属性(Attribute),而在Java7中即将到来的新特性在.NET中都能找到原型。Java语言已略显老态,以JVM为基础的Scala和Groovy等新兴语言大有替代Java的趋势。

.NETFramework类库VS开源Java库。作为主流的编程语言,肯定都离不开一整套类库支持来实现基础性的功能。不同的是.NET的类库一般都由微软提供,而Java的类库一般都由开源项目提供。当我们需要某一.NET类库时,常规的做法是查阅MSDN,查看微软提供的代码示例,然后模仿这些代码即可;而当我们需要一个Java类库时,一般的做法是到google或是开源社区搜索相关的开源项目,然后选择所需要的类库。至于两种方式哪一个更好则很难说,但使用微软的.NET类库通常更简单。虽然.NET也有开源类库,但大多数.NET程序员都不会意识到还需要第三方类库,微软提供的类库已经足够了。当选择开源类库的时候,我们可以自豪的说,我们不用受制于微软的技术压迫,但是实际历程可能是十分痛苦的。开源当然有其优点,但当为了一个功能,而面对数个Java开源项目会怎么样?你可以庆幸你有ABCD多个选项,但选择并不是件容易的事情。你不得不逐个的去学习研究每个开源类库的设计结构、应用方法,逐个评估每个开源类库的功能、性能,还有与需求之间的差距,除此之外,还要评估所选定的开源类库是否能够和其它类库一起工作,是否存在潜在的冲突等等。当需要很多类库、解决方案的时候,这种选择足以让人抓狂,这个时候你就会感叹,要是没有选择该多好。除此之外还有另外一个差异:类库风格与质量。由于微软的企业化和工程化程度很高,海量的.NET类库风格都能保持完全一致,让人感觉所有的代码都是一个人写出来的;而开源项目都是由各个社区自发开展的,设计风格千差万别,代码质量也良莠不齐,Eclipse里面有一个代码重构的插件,当使用此功能进行代码重构时,它甚至可以查找到配置文件中的类型引用并准确无误的重构该引用,让人惊叹是谁写出来如此鬼斧神工的强大功能;而同时又发现在dom4j类库中,一个很常用的方法竟然没有对参数做非空检查,导致四处抛出异常,真想把作者揪出来大骂一顿竟然会出现这么低级的错误。当然大部分的开源项目都是很不错的。凡事有利亦有弊,Java对程序员的折磨并非没有回报,就像C++程序员要比Java程序员牛一样,一般Java程序员在构架设计、模式设计以及对技术原理的理解上,都要比.NET程序员略胜一筹。微软的温室培育出来的大多数.NET程序员在面对苛刻复杂的问题时会显得乏力,而对Java程序员来说,狂风骤雨只是家常便饭而已。

VisualStudio VS  Eclipse。虽然记事本也可以编程,但我相信肯定没有人会这么做,编辑器对于开发的重要性就不做讨论了。Eclipse并不是Java开发的唯一选择,但Eclipse是颇具代表性的主流开发工具。VisualStudio 秉承了Windows家族的一贯风格:高度集成、简单易用。Eclipse也秉承了开源家族的一贯风格:功能强大,无所不能,但操作却不甚友好。VS的用户很少会意识到还需要更多的插件更多的功能,也很少花太多时间去学习VS的使用方法;而Eclipse的用户如果不会配置插件不会修改各种配置几乎无法使用Eclipse,而且要花费不少时间来学习如何使用Eclipse,还是稍有难度的。但是说到功能,那就说到Eclipse的强项了,通过添加各种插件,Eclipse几乎无所不能,甚至可以改造成C++、php、.NET的开发环境。Eclipse作为Java的IDE在代码编辑重构方面尤其优秀,在代码调试时可以实现边修改边调试的代码热交换,在这些功能上,VS难以望其项背。Eclipse的大多数界面操作都是异步进行的,尤其是在编译上,速度优势十分明显,而VS总会在编译时出现假死,编译速度很慢,当项目很多时让人难以忍受。

行业应用与厂商支持。微软有一整套完整的软件生态系统,只要使用微软的产品,那么一切问题都由微软包办了。但微软不是万能的,微软包办的只能是一部分问题,在微软不可企及的领域,就是IBM、HP、Oracle等各大软件商的天下。由于微软产品的定位,微软的软件生态体系比较接近于终端用户,因此在行业应用上就更靠近中低端,而在大型应用项目中经常会见到Java的身影。因此在大型应用和软硬件厂商支持上,Java的确比.NET更流行。目前如此,以后会如何发展尚未可知。

纵观.NET与Java的技术体系,会发现二者有颇多相似,也有很多差异,最本质的差异应该是软件开发思想上的差异,它们二者分别代表的是商业软件体系与开源软件体系,它们的差异也正是这两大体系阵营的差异。商业软件以服务客户为首要目标,在必要时宁可牺牲性能也要保证用户的良好体验;而开源软件以解决问题为首要目标,在任何时候,软件的功能、性能、适应度都是最为重要的,用户的感受则其次。(客户花钱买服务,当然有权吹毛求疵;用户免费使用别人的服务,当然要心存感激。)

.NET与Java就像是两兄弟,性格迥异,各有所长,只有在特定的环境下才会存在一种最优解,单纯讨论二者孰优孰劣,没有什么意义。当洞悉了语言背后的技术真想你就会发现,什么都是浮云,语言仅仅是工具而已。更高层次的解决方案设计、构架设计、项目控制等才是软件开发的真谛!

Java与.NET随笔的更多相关文章

  1. Java范型随笔

    最近在帝都好无聊啊, 排遣寂寞就只有让自己不要停下来,不断的思考了 QWQ; 最近做ndk, java有点忘了,突然看到了一些java范型方面的问题, 踌躇了一会, 想着想着,决定还是写个随笔记录下来 ...

  2. Java学习的随笔(3)接口

    首先是一段<Java编程思想>中,对接口的解释:“interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现.它允许创建者确定方法名.参数列表.返回类型,但是没有任何 ...

  3. Java学习的随笔(2)Java语言的三大特性

    1.面向对象的三大特性 面向对象的三大特性主要包括:继承.封装.多态 (1)继承:就是指子类(导出类)获得了基类的全部功能(所有的域和方法).  注:在子类中,想要调用基类的方法可以使用“super. ...

  4. Java学习的随笔(一)对象概念、this指针、权限修饰符

    最近在看<Java编程思想>,下面按照最近看书的顺序梳理一下心得,由于是初次学习,大部分心得是摘抄自书中: 1. Java中,每个变量都是一个对象. 在创建时首先在内存的堆栈中创建一个该对 ...

  5. Google Java 风格 阅读随笔

    官方文档:Google Java Style 中文翻译版:Google Java编程风格指南, Hawstein's Blog 可以先看官方文档,遇到不确定有疑问的,可以再对照翻译版本阅读,加深理解. ...

  6. 20130620—ant和java杂学随笔

    ant知识点: 1.使用属性定义相对路径的时候,一定要使用location,而不要去使用value  对于<property></property>中location和valu ...

  7. Java并发编程随笔

    死锁:两个线程互相等待对方释放锁才可以继续运行. 避免死锁的常见方法: 1.避免一个线程同时获取多个锁 2.避免一个线程在锁内同时占用多个资源,尽量保证一个锁只占用一个资源 3.尝试使用定时锁,使用l ...

  8. java程序员随笔

    之前坚持过一段时间的博客,不过后来因为一些琐事,也因为自己的懒惰,没坚持下来.一晃本科毕业到现在已经快9年了,本科毕业的时候经常想,自己十年之后会是什么样子,那时候筹措满志,心里的每一个答案,都离现在 ...

  9. 深入理解Java虚拟机之Java内存区域随笔

    1.java内存区域与内存溢出异常 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域:1.程序计数器,2.栈(虚拟机栈和本地方法栈 ),3.堆,4.方法区(包含 ...

随机推荐

  1. 【文件】读取一个文件夹下所有的jpg图片

    今天做视频处理的时候,发现给的视频是用jpg图片的形式给出的,名字的命名规律性不是很强.就想找一种通用的遍历文件夹下图片的方法. 开始在网上找到了下面这份代码,发现只能读取所有的文件夹,文件都被跳过了 ...

  2. yum安装时出现:Cannot retrieve metalink for repository: epel. Please verify its path and try again

    在CentOS 6.3 x86_64下安装php-mcrypt的时候出现了问题:Error: Cannot retrieve metalink for repository: epel. Please ...

  3. 20145213《Java程序设计》第三周学习总结

    20145213<Java程序设计>第三周学习总结 教材学习内容总结 正所谓距离产生美,上周我还倾心于Java表面的基础语法.其简单的流程结构,屈指可数的基本类型分类,早已烂熟于心的运算符 ...

  4. 使用rdesktop连接Windows远程桌面

    rdesktop 使用简单,windows也不和装什么服务端,是要把远程桌面共享打开就行了 安装 yum -y install rdesktop 具体使用方法要先打开终端,然后输入以下命令: rdes ...

  5. merge

    当两个DataFrame相加的时候,如果,其中一个不全则会相加产生NA,所以必须一次性将数据的索引索引确定下来,然后对所有数据重建索引然后,填充0,再相加.否则有数据的和没数据的相加结果都变为了NA, ...

  6. mysql 只导数据不含表结构

    mysqldump -t 数据库名 -uroot -p > xxx.sql

  7. C#的索引器

    using System; using System.Collections; using System.Collections.Generic; using System.IO; namespace ...

  8. 设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

    一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. ...

  9. Pyqt QTabWidget 简单的计算器集合

    今天我们简单介绍下QTabWidget,然后在加入Demo计算器 首先我先讲下文件的结构: 文件分四部分, 一部分是Ui设计文件, 一部分是由Ui生成的py文件, 一部分是 计算器的逻辑文件,  最后 ...

  10. SQL语法中的JOIN类型

    这个要弄明白哟..CROSS JOIN, NATURAL, INNER JOIN ,LEFT OUTER JOIN(LEFT JOIN) 等等....带LEFT,RIGHT的必为OUTER,所以OUT ...