最近由于工作需要开始使用Java。NET,我是2012年开始玩beta版的,那时候熟悉VB6,天真地以为以后VB.NET会很流行。事实证明,这只是一厢情愿。有了C#,你要VB.NET做什么?不论是胜宇还是何胜亮……玩了半天的语言,根本就不能说精通一门语言,赵姐夫就是大牛。我只是一个粉丝。回到正题,满园里关于NET和JAVA优劣的帖子数不胜数,我们没有资格。1.IDEVS是世界上最好的IDE。这是无可争辩的。尽管Eclipse有点弱,但它做得很好。Eclipse相对于VS动辄8、9G的数字要小很多,我用的是J2EE版的Eclipse,解压后300M+,免安装。VS固然庞大,但是对于提高开发效率有着无可比拟的优势。for(inti=0;i<5;i++)对于{}这样的代码,我在Eclipse中一个字符一个字符地输入。对于VS,输入for后,只需按两次Tab。当然,在代码重构方面,Eclipse比原生VS的操作要多很多。(对于VS2015来说,重构也很给力,有被ReSharp附体的感觉)对于IDE来说,还是大小和功能的问题。对于脑子比手还快的同学来说,Eclipse是一种折磨。如果有Java高手,请告诉我如何加速。还有一点就是Eclipse默认的字体对中文不友好,而VS好很多。2.泛型泛型是Java中的一个插槽。擦除致死。以下技术问题如有不妥之处,敬请指出。C#的泛型根据不同的类型参数生成不同的新匿名类,而Java只是在编译阶段,假装有泛型的概念。ArrayListc=newArrayList();c.删除(1);c.remove((对象)1);现在关注上面的代码。对于列表,要删除元素,C#会有一个Remove和一个RemoveAt,前者表示删除指定元素,后者表示删除指定下标的元素。然后,如果你写c.remove(1);在代码中,Java的动作是删除下标为1的元素。。这里主要的问题是Java在设计的时候没有考虑删除下标或者直接删除这两个需求,所以没有区分RemoveAt和Remove。当然,在Remove(Integer)的时候,会产生歧义,为了消除歧义,就需要将Integer或者其他泛型强行变成Object。在C#中,由于有RemoveAt方法和完整的泛型支持,Remove方法后面可以直接跟着要Remove的东西。这里有一点需要注意。3基本类型inta=1;Int32b=2;int和Int32在C#中是同一种类型(当然都是值类型,存储在栈中)C#ViaCLR也说过了,int是Int32的别名。(如果这个想法有误,希望大家指出)Listt=newList();Listm=newList();所以在C#中可以这样写。在Java中,int和Integer是有区别的:int代表基本类型,Integer代表类。对于泛型,只能使用Integer。我不是很清楚这里的区别。存数字好像是个简单的东西,没办法用。ArrayListc=newArrayList();因此,在Java中,类型参数T似乎没有C#那么灵活。4、Java没有Struct的概念。本质上,Class和Struct在业务上是相似的。只不过Class在堆上,Struct在栈上。一种是按引用传递,另一种是按值传递。一般来说,轻结构,贫血模型,我喜欢用Struct,重结构,血腥模型,我喜欢用Class。Java,不好意思,没有Struct,解决办法是Class,或者innerClass。.为什么Struct不能用Java实现,不知道是设计上的还是技术上的问题。5.Java枚举这并不是抱怨Java枚举的功能,而是Enum是一个依赖于JDK版本的东西。只需要JDK1.5或以上版本。如果你的项目JDK版本太低,En??um不支持。所有框架都应该支持C#中的枚举。(现在找不到NET2.0之前的Framework了,验证不了1.0,1.1,内存是支持的。)为什么说这个问题?我曾经带学生做过。实验中在Eclipse中新建一个项目,并没有选择JDK版本,使用默认的低版本JDK。那么,呵呵,Enum这么简单的东西,编译不过。不善于学习。..Enum的值本质上是一个数字,Enum是一个结构体。什么是Java的枚举?6.StringStringA="你好";字符串B="你好";System.Console.WriteLine(A==B);System.Console.ReadLine();在C#中是正确的。在Java中也是如此。(Java中A和B的地址指向同一个地方?C#字符串驻留。)Stringa=newstring('a',10);Stringb=newstring('a',10);Console.WriteLine(a==b);控制台.ReadLine();在C#中也是如此,比较地址,由于NET神秘的字符串驻留机制,实际上两个String指向同一个地方。StringA=newString("你好");StringB=newString("你好");布尔C=(A==B);这里是False,Java真的比较了两个地址,两个地址是不同的。如果你真的想比较,使用BooleanC=(A.equals(B));谁来谈谈Java的字符串机制。7.Market和Future做了很多人力资源工作,感觉NET在国内没有Java流行。在日本,NET有项目,但大部分都是Java。NET和Java的高手人数差不多,但Java占了中低层的大多数,原因是就业需要。一个真正的高手,应该对.NET和Java都非常熟练。算法业务是重点,语言只是工具。不要在回复中讨论语言质量,我们没有资格。欢迎指出技术问题和缺陷,或补充一些我没有列出的差异。