经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲。。。

一般C#多用于业务系统的开发,快速实现,微软官方的各种封装,各种语法糖,使得c#在语义语法层面上更人性化,开发思路更专注于业务逻辑,对技术的实现并不需要关心的很细(当然这是指初级的入门程度),不过也带来的一些缺陷,当表面上的功夫不能满足的时候,.net程序员就不得不去了解微软封装起来的东西,所以我认识的.net程序员几乎人手一个以上反编译器,好在微软几乎从不混淆代码。。。;这一方面java刚好相反,语义个别时候还是有些别扭的,而且对技术实现需要一定的关心,重学数据结构就不说了,现在连线性代数都开始重新学习了,有些算法真心不学闹不明白,不过java也从另外一个方面降低了这方面的技术门槛,得益于整套的javaee规范,java有大量的开源框架,这些框架只要遵循了规范,程序员可以很轻松的使用不同的框架减少工作量。.net现在也开始在这方面努力了,只是目前只看到了owin的规范,还完全不成体系。

然后说程序的执行:.net程序的执行是以程序集为单位的,只有程序集的loader,加载过程参考我之前的一篇随笔 ,于是也有友元这种控制访问的方式,类是在程序集加载时已经加载了,像找不到类这种异常是在程序集加载时报的,c#的反射也是先从程序集开始的,过程可以参考:https://msdn.microsoft.com/zh-cn/library/f7ykdhsy.aspx;java的执行是以class为单位的,加载字节流到方法区,连接,验证,准备,解析,直到初始化等一系列过程,只有执行到需要这个类了才会加载它,找不到类的异常是在实际使用时才报出来的,java反射的性能虽然因为包括了一些动态类型JVM无法对这些代码进行优化,性能也会差一点,但实际的完整加载流程与正常new的加载流程差不多,区别可能只是步骤拆开了一些。。。,至于“由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。”这种情况,倒是都差不多。java的进程每一都会启动一个jvm实例来执行,程序执行完jvm会退出,而.Net是clr中以应用程序域来装载程序集进行隔离的。倒是都是用即时编译器来执行编译结果的。

编译层面上,一个是字节码指令,一个是IL中间语言,IL作为中间语言会强大一些,比如支持多继承什么什么的,在这一层面上.Net根据CPU架构等会进行了一定的代码优化,另外.Net的AOP中静态织入也是基于IL进行的。

垃圾回收:一般来说垃圾回收都是分代的,不过java的增量回收还有个纯按slot分的,分代的方式也略有不同,由于clr头有元数据的存在就不像java那样还需要方法区,所以.Net有0,1,2三个代,而jvm只有young和old外加一个方法区。回收算法和定制性上反正是一贯的一个尽量开放一个尽量封闭,.Net似乎只提供了工作站或服务器的模式选项,算法上是以根为基础的引用跟踪,三个代的大小.Net会自动根据当前模式及回收频率等自动进行调整的,不得不说相对于java要进行各种jvm调优来说省心是省得多了,大对象也是直接进入最后一代,85000;java的回收算法有引用计算器,标记,复制,标记-复制混合等可自选自配,可分代选择并行还是并发回收,可以调节各代大小比例,也可以调节e区大小,有多少个s区,各种实用比例,方法区大小等等,线上有时候是需要通过命令查看一些内存情况并且对jvm的各种参数进行调优的,这么大一块庞大内容.Net是全自动的,基本上想调也没什么办法可调。

异常处理:异常处理的话,一个是java有error这种东西,另外就是java的代码中在可能抛出异常的部分都需要显式的进行处理或者抛出。

多线程:语法上的相对来说java比较原生吧,.Net基本上现在都是Task这种形式了,比如说闭锁这种东西,.Net里表现为taskFactory.ContinueWhenAll这类,差异非常大,不列举了。.Net有委托这种结构也不太需要runable,可取消的两边倒是差不多,至于带返回值的,也就是实现方式略有不同没啥好说的。线程池的话,java里Executor提供了强大丰富的线程池可用,线程池也可以实例化使用;.Net线程池就非常的坑不要直接使用,这是个clr层面唯一的池,就是说在这一个版本的clr上所有的应用是公用这一个池的,可能你分了100个线程的大小,你一个都得不到,目前官方似乎也只有LimitedConcurrencyLevelTaskScheduler可以安全的充当线程池使用。另外,比如c#中long在32位系统中是非线程安全的,但在64位中是线程安全的;java中都是线程不安全的,因为java的栈是32位的,jvm会把long分为高32位和低32位,double同理。

泛型方面 忘了哪看过一篇博客说泛型和面向对象是冲突的,估计作者没接触过C#(似乎scala也支持,但是我不熟)的逆变和协变,更细的发现有篇博客说的很详细,我就不抄了http://blog.csdn.net/nabila/article/details/8133245

以上是我觉得比较典型的区别,我接触java时间不长,最近也在不断看书,我会及时补充的,不过再怎么说这也就是个概括,并不可能很细的,细致的部分我倒是也整理了些,不过比较乱,等我再深入些再回头整理了再说。。。

参考除了在随笔中的链接外还有:

http://wayneye.com/Blog/Atomic-Operation-In-Csharp

c#与java的区别的更多相关文章

  1. java版本区别

    java版本区别 点我,点我,Eclipse几个版本号的区别(part1) 点我,点我,Eclipse几个版本号的区别(part2) 点我,点我,Eclipse几个版本号的区别(part3)

  2. JavaScript与Java的区别

    关于java和javascript的关系,我曾在一个论坛上看过这样一句话,java和javascript的关系,就好比雷锋和雷峰塔的关系,实在是经典! 因为名字的关系,总是有人误以为Javascrip ...

  3. 我来谈谈PHP和JAVA的区别

    这里的标题写的是谈谈PHP和JAVA的区别,其实是委婉的说法,其实别人是想听PHP好还是JAVA好!!! 从而从中找到存在感!!! 因为由于我是从多年的php开发转到java开发的.所以最,不时的有好 ...

  4. [转载][Groovy] Groovy与Java的区别(一)

    原文地址:[Groovy] Groovy与Java的区别(一)作者:langyizhao 因为Groovy可以用Java的所有功能(虽然JVM不同的时候可能会比较麻烦,比如在Android上),所以G ...

  5. php和java的区别

    php和java的区别 前几天有个大学的同学给我来电话,他是在培训java的,然后我们就讨论了一下关于php和java的优劣区别(我们的是初学者,所以下面发表的内容可能不会很精准到位,望体谅): 我们 ...

  6. C++ substr() 和 Java substring() 区别

    Java和C++中都有关于子字符串的操作,C++中是substr(),Java中是substring(),两者的用法上稍有些区别,首先针对只有一个参数的情况: s.substr(start) 和 s. ...

  7. C++和java的区别

    Java区别于C++ 表面看来两者最大的不同在于Java没有指针,或者说,Java满地都是指针.对于编程者而言Java的这种设计是安全且更易用的.说Java满地是指针的原因在于它把指针的功能隐藏了,其 ...

  8. C、C++、java的区别

    经常听到有人在抱怨这个语言哪里哪里 不好,那个语言又是如何的优秀.对于这样 的牢骚,我只是一笑而过. 就我而言,语言只是工具,没有好坏之 分.只要你采用相应的语言,完成对应的工 作,那你的目标就完成了 ...

  9. C++和java的区别和联系

    今晚,数院的一个兄弟借我Java课本,顺便问了一句“Java和C++到底有啥区别啊”.一下子有点问蒙了,“啊额.....运行平台不同....”  "一个在高层,一个在底层...." ...

随机推荐

  1. 自定义控件之 RadioList

    var RadioListObj = function (id, url) { this.URL = url;//radiobox source URL this.ID = id;//radioLis ...

  2. AX Dynamics 去中文字符长度:中文字符当2个字符处理

    static void jw_testStrByteLen(Args _args){    str _str = "A你好";                  System.Te ...

  3. Mcafee两个Mac版本之间的区别

    近期打算为Mac安装个杀毒软件,由于自己windows平台下用的是VSE,所以Mac平台也首选Mcafee家的东西了.到Mcafee官网下载点一看,有以下几个版本可以用在Mac上: 有点懵了,查看了一 ...

  4. 好项目烂架构的问题,四年coder的吐槽

    四年多码农,毕业后在一家小私企做前端:(初始asp.net,对oo有了比较深切的理解:处于对某空间的效仿,对前端技术架构理解的比较透彻): 在这家公司混了4个月之后跳出来想自己单干: 自己接了个小项目 ...

  5. this指针在不同情况下的指代

     说不同情况了吧,首先要分有几种情况使用this,然后再说分别指代什么 1)如果是一般标签下函数调用,this指代全局对象,也就是window对象或者document对象 2)如果在嵌套函数中被嵌套的 ...

  6. mysql 根据某个字段将多条记录的某个字段拼接成一个字段

    未合并情况 SELECT a.id, b.name AS "role" FROM sys_user a INNER JOIN sys_user_role c ON a.id=c.u ...

  7. float存储方式编程验证

    取出float在内存中的编码: void printFloatAsBinary(float f){ // 二进制的位数 const int bits = sizeof(f) * 8; // 将floa ...

  8. java中文拼音字母排序

    package com.yputil.util; import java.text.CollationKey;import java.text.Collator;import java.util.Ar ...

  9. 【构造】UVa 11387 The 3-Regular Graph

    Description 输入n,构造一个n个点的无向图,使得每个点的度数都为3.不能有重边和自环,输出图或确定无解. Solution 如果n为奇数,奇数*3=奇数,度数为奇,必无解. 考虑我们怎么构 ...

  10. 动态库 Framework

    framework的建立和生成 都比较简单.重点会放在第三块上面(指令集说明及合并) 1.framework target建立 1.1. command + shift + N 选取 ios -> ...