由于工作需要,最近也开始倒腾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使用起来都应该很熟练的,算法业务才是重点,语言只是工具。
千万别在回复里面讨论语言的好坏,我们没有资格。
欢迎指出技术上的问题和硬伤,或者补充一些我没有列举的区别。
- 27楼ZHIGANGWANG
- IntelliJ IDEA
- 26楼通用C#系统架构
- java各种开源的技术多,所以比较容易搭建巨型业务应用系统。
- 25楼Coin lee
- “真正的高手,NET和Java使用起来都应该很熟练的,算法业务才是重点,语言只是工具。”+1
- 24楼笑对当空
- 你是用工具生活 ,还是为了生活使用工具,我是后一种 所以无所谓
- 23楼Keanuo
- 好啊,我承认C#是没多重继承的,我用C++习惯了、
- 22楼阿超-
- 我本是做c++跟C#的,也有冲动转JAVA,尝试过一段时间,但是 发现IDE就是一个缺陷.如果JAVA的IDE跟VS一样强大了,那可能 JAVA真的是可以让C#的人回家种田了.
- 21楼Dr.Liu
- 喜欢.NET的语法糖
- 20楼zhangweiwen
- 引用String A = new String(quot;Helloquot;);,String B = new String(quot;Helloquot;);,Boolean C = (A==B);,这里是False,Java真正的比较了两个地址,两个地址是不同的。如果真的要比较,请用诸如 Boolean C = (A.equals(B)); 这样的方法。,,谁来说说Java 的字符串机制。,我点反对了。,因为关于字符串这里,C#和Java你都理解错了,C#为true不是因为字符串驻留机制,而是C#的String类能重载==操作符,实现值比较逻辑,而不是一般的地址引用比较。而java没有操作符重载,所以所有的==比较都是地址引用比较(同一性),java要比较值是否相同,要用equals方法。
- 19楼瓦尔登湖的一滴
- 用ecplise时,最下面时滚动条不能滚下去了,很不方便啊,有人知道能解决吗?
- 18楼cocosip
- 我觉得最大的原因还是ide,eclipse用起来太不习惯了。
- 17楼冲杀
- 撸主,C#不是字符串驻留了才可以使用 == 而是重写了操作符!!!晕哦!JAVA 要比较字符串是否相等,必须使用equals,==是比较的地址!,,为了保险起见,我还是反编译了C#的类库,C#的字符串==比较确实重写了操作符!!
- 16楼jiahuafu
- C#转JAVA,我今年搞了半年了,项目OK,http://www.cnblogs.com/jiahuafu/p/4578623.html,,c#转JAVA,在LINUX Ubutu上安装JDK,并运行JAVA程序,http://www.cnblogs.com/jiahuafu/p/4437181.html,,c#转java,第三个月,http://www.cnblogs.com/jiahuafu/p/4413702.html,,这段时间对c#和java的感受,http://www.cnblogs.com/jiahuafu/p/4290449.html
- 15楼冲杀
- eclipse是很难用!!!比sun以前自己开发的JAVA IDE差远了!!,eclipse卡爆了!!
- 14楼linkFly
- java和C#吧...也就楼上说的语法糖的问题而已,毕竟习惯了C#的甜。,至于ide上说多了真是泪,不要跟我谈什么ide只是工具,我没有你们那么有quot;逼格quot;,一款用的舒适优雅的ide提升的开发效率、对编码手感的影响不是1点2点的。说实话恰好ide的技术门槛在那里,开发这样一款跨平台ide不是你说做就能做的,所以eclipse存在的意义的不可否定的,它的经典、卓越和付出是无可挑剔的,但它相比其他ide确实挺一般的,而又很少有其他组织或个人自愿去开发一款新的(技术门槛、生态圈、人力物力等),所以eclipse的NB不是因为它NB,是没得选(特指今天的环境,我知道还有idea)。。。,,环绕eclipse和java,就是开源社区的尿性,我个人还是很喜欢开源,但现在的这些xxoo的开源项目真是有点恶心,动不动要你配置这个配置那个,然后还各种依赖其他的组件,你装个这个组件,尼玛还没用呢给你报错说它依赖另外一个组件,好的,你安装完毕然后那个组件又告诉你依赖什么和什么。,等你把依赖装好,然后告诉你还得配置这个,配置了之后还是有问题,然后查查资料又告诉你还得把另外一个组件怎么怎么配置。,这些开源项目尿性的简直不行了。,明明只是需要一个功能,结果你把人家一套组件各种配置玩会了。我们的本质是撸码打通业务给公司挣钱或打造一款卓越的项目,不是跟你们来玩配置的。,这点ms有些地方真心做的奈斯,就是把我们当做“傻X”来对待,不需要什么复杂的配置,甚至一个项目引用就给你搞定了所有的事情,一上来就给你来个全家桶套餐。,java和eclipse这些开源社区的思维就是:最小化提供,最大化配置,一上来就是躶体,你想要干活?先去玩配置吧。,ms的思维就是:最大化提供,最小化配置,一上来什么都有,但是臃肿。,,所以java和eclipse走项目成天要配置这个配置那个各种引用撸通插件/组件的关系还得学会配置插件。,C#呢,vs默认给你引全了,什么都提供给你,我默认就给你一个全家桶套餐,但是,如果你不需要那么你可以一个个剥离(特指MS逐渐放开自己,开源之后)。,,这两种思路,我个人非常认可和喜欢后者。主要不爽就是开源社区的什么都丢给你自己配置的心态,这种心态的项目拿来开源真是让人又喜又忧啊。。。
- Re: xmodygetz
- @linkFly,伸手:,我想要一个干净的vs,不需要做别的,只需要完成gyp的编译任务。
- Re: 馨辰
- @Keanuo,class A:B,C,D????,你在逗我?
- 12楼NNN3N
- 关于enum, Bing一下 quot;C# enum msdnquot; 就好.
- Re: codesnippet.info
- @NNN3N,没有1.0的文档,但是最下面的信息是,.NET Framework,受以下版本支持:4.5.2、4.5.1、4.5、4、3.5、3.0、2.0、1.1、1.0,,意思是1.0支持?
- 11楼花儿笑弯了腰
- 个人感觉更喜欢.NET 语法,如果Lamda Async 匿名 动态类型 扩展方法 等等,不过JAVA的世界成熟的方案比较多,可以看的更远 。
- 10楼通用C#系统架构
- 算法业务才是重点,语言只是工具。
- Re: arg
- @通用C#系统架构,现在还拿这句话出来说,真不适用了哦,大三大四的人说说还可以
- Re: MrNice
- @codesnippet.info,for 按两下tab
- 8楼胡萝卜星星
- Enum 1.1(VS2003)就有,1.0(VS2002)没用过,但90%可以确认有
- Re: 紫砂壶
- @掬一把月,全部ajax,不利于seo
- Re: 掬一把月
- @紫砂壶,你说的很在理...!,不过做系统啥的 还是很好的,用户体验非常棒...!
- 6楼gowk
- 我用.net已经把项目做完了,尼玛Java还在那里搞配置,研究框架,各种依赖,而我需要的仅仅是一个小小的功能而已,尼玛
- Re: 玻璃鱼儿
- @gowk,引用我用.net已经把项目做完了,尼玛Java还在那里搞配置,研究框架,各种依赖,而我需要的仅仅是一个小小的功能而已,尼玛,所以JAVA工资高,时间都花在折腾上了。
- 5楼驱魔师
- 看了楼主的吐槽,感觉楼主对java的一些基础知识还不是很清楚,指出一下(一点浅见,与楼主共勉,我最近也在转java的路上)。,1、Eclipse默认字体的问题:可以在“Preferencesgt;General”中进行设置,其实eclipse对中文已经支持很好了。,2、关于for 结构自动补完的功能,以及foreach、while、try..catch等,eclipse也是支持的:输入for以后按 Alt+/ 就能看到自动补完提示了;你如果嫌每次都按 Alt+/ 麻烦的话,也可以在Preferences设置一下就可以解决,网上有很多文章介绍怎么设置的。,3、java中的字符串分为字面量和字符串对象,它们存放的方式是不一样的,String字面量是集中存放在一个字符串池(栈)中的,因此 String A = quot;Helloquot;; String B = quot;Helloquot;; 这里A==B是返回true的;但是字符串对象比较的就是内存地址了。,4、java中没有Struct不是什么问题,因为可以用class来实现。,6、java中的泛型确实没有.Net用起来方便,.Net语法糖确实太好用了。
- 4楼mr.cui
- 不错不错,请继续深入探讨,可以归纳出几个角度来分析。
- 3楼冲杀
- 撸主怎么不吐槽下 方法重写机制!!!!
- 2楼xmodygetz
- 何必把10年前的版本拖出来鞭尸。,Java SE 5.0 (1.5.0)Tiger(老虎)2004-09-30
- 1楼yyww
- 过度一个月就够了,主要是习惯一下IDE,了解一下相关框架的用法就好。至于语言层面,没啥新鲜的,除了可悲的伪泛型,匿名接口实现什么的,有空可以了解一下Java的GC, JVM之类的。 ,,一般大企业才会愿意招聘一个架构经验和技术功底很扎实的,但是没有Java经验的人(内部转不算在内)。 薪水也会提高的。我当年.NET做到30K/month感觉到瓶颈了,涨不动了,跳槽可选择面也少;挑一个大公司的Java职位,直接就38K了,半年以后就41K
- Re: arg
- @yyww,让我去做java的架构我也会,让我去写代码我现在还不会。,我宁愿承认php是世界上最好的语言。php真就是语法和ide上的磨合,一个月搞定。,哥们真是神人也!!!!