经常有人问这种问题,用了些时间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. JavaScript与java语法区别

    网页中各种技术的作用 感谢大佬:https://blog.csdn.net/RookiexiaoMu_a/article/details/89052768 HTML 制作网页的结构 CSS 美化网页 ...

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

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

  8. C++和java的区别

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

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

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

随机推荐

  1. 使用原生JS实现一个风箱式的demo,并封装了一个运动框架

    声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的 ...

  2. POJ2528Mayor's posters(离散化 + 线段树)

    题目链接: 题意:给定一些高度都相同的海报去贴,问最后能看见几张海报 The picture below illustrates the case of the sample input. { 8,9 ...

  3. vuejs入门小demo-搜索大全

    这个demo非常适合入门的同学,不再是简单的todolist.用到的知识点有组件通信,过渡效果,vue-rsource,还有一些基本的vue指令. 先放一张截图: 是不是感觉高端大气上档次呢,演示地址 ...

  4. hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10

    题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结 ...

  5. 没做过编译器就是被人欺——从一道变态的i++题猜编译器的行为(表达式从左往右扫描,同一变量相互影响)

    首先不要被人蒙了,如果是这样,根本编译不过: int i=1; int b=i+++++i; printf("%d %d\n", b ,i); Mingw报错:error: lva ...

  6. OD: Vulnerability Detection

    终于看完第二篇漏洞利用原理高级篇,内容虽然看懂了,但深入理解不够,这部分内容以后还要不断强化. 第三篇是漏洞挖掘技术,篇首的话中,提到程序的不可计算性(图灵机的停机问题).希伯尔数学纲领的失败,结尾说 ...

  7. cocos2dx 3.x Value、Vector和Map意识

    1. Value cocos2d::Value 这包括一个非常大的数字原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外 加s ...

  8. django2.0解决跨域问题

    跨域问题一:(cors跨域问题) 解决方法: 1.安装 django-cors-headers 2.修改 setting.py INSTALLED_APPS = [ ... 'corsheaders' ...

  9. 经典Python进阶文档 真的很棒

    https://docs.pythontab.com/interpy/args_kwargs/README/

  10. python+unittest+requests+HTMLRunner编写接口自动化测试集

    问题描述:搭建接口测试框架,执行用例请求多个不同请求方式的接口 实现步骤: ① 创建配置文件config.ini,写入部分公用参数,如接口的基本url.测试报告文件路径.测试数据文件路径等配置项 [D ...