c#与java的区别
经常有人问这种问题,用了些时间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的区别的更多相关文章
- java版本区别
java版本区别 点我,点我,Eclipse几个版本号的区别(part1) 点我,点我,Eclipse几个版本号的区别(part2) 点我,点我,Eclipse几个版本号的区别(part3)
- JavaScript与Java的区别
关于java和javascript的关系,我曾在一个论坛上看过这样一句话,java和javascript的关系,就好比雷锋和雷峰塔的关系,实在是经典! 因为名字的关系,总是有人误以为Javascrip ...
- 我来谈谈PHP和JAVA的区别
这里的标题写的是谈谈PHP和JAVA的区别,其实是委婉的说法,其实别人是想听PHP好还是JAVA好!!! 从而从中找到存在感!!! 因为由于我是从多年的php开发转到java开发的.所以最,不时的有好 ...
- [转载][Groovy] Groovy与Java的区别(一)
原文地址:[Groovy] Groovy与Java的区别(一)作者:langyizhao 因为Groovy可以用Java的所有功能(虽然JVM不同的时候可能会比较麻烦,比如在Android上),所以G ...
- php和java的区别
php和java的区别 前几天有个大学的同学给我来电话,他是在培训java的,然后我们就讨论了一下关于php和java的优劣区别(我们的是初学者,所以下面发表的内容可能不会很精准到位,望体谅): 我们 ...
- JavaScript与java语法区别
网页中各种技术的作用 感谢大佬:https://blog.csdn.net/RookiexiaoMu_a/article/details/89052768 HTML 制作网页的结构 CSS 美化网页 ...
- C++ substr() 和 Java substring() 区别
Java和C++中都有关于子字符串的操作,C++中是substr(),Java中是substring(),两者的用法上稍有些区别,首先针对只有一个参数的情况: s.substr(start) 和 s. ...
- C++和java的区别
Java区别于C++ 表面看来两者最大的不同在于Java没有指针,或者说,Java满地都是指针.对于编程者而言Java的这种设计是安全且更易用的.说Java满地是指针的原因在于它把指针的功能隐藏了,其 ...
- C、C++、java的区别
经常听到有人在抱怨这个语言哪里哪里 不好,那个语言又是如何的优秀.对于这样 的牢骚,我只是一笑而过. 就我而言,语言只是工具,没有好坏之 分.只要你采用相应的语言,完成对应的工 作,那你的目标就完成了 ...
随机推荐
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- Linux下Nodejs安装(完整详细)
之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源码, ...
- Visual Studio 2012远程调试中遇到的问题
有的时候开发环境没问题的代码在生产环境中会某些开发环境无法重现的问题,或者需要对生产环境代码进行远程调试该怎么办? Vs已经提供给开发者远程调试的工具 下面简单讲讲该怎么用,前期准备:1.本地登录账户 ...
- Linux学习之文件操作
Linux,一起学习进步- mkdir The mkdir command is used to create directories.It works like this: mkdir命令是用 ...
- OpenCV人脸识别LBPH算法源码分析
1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...
- History API与浏览器历史堆栈管理
移动端开发在某些场景中有着特殊需求,如为了提高用户体验和加快响应速度,常常在部分工程采用SPA架构.传统的单页应用基于url的hash值进行路由,这种实现不存在兼容性问题,但是缺点也有--针对不支持o ...
- git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务
一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目 3.安装依赖包(进入到命令行) # 安装依赖包 $ ...
- jQuery2.x源码解析(缓存篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...
- H3 BPM让天下没有难用的流程之功能介绍
H3 BPM10.0功能地图如下: 图:H3 BPM 功能地图 一.流程引擎 H3 BPM 流程引擎遵循WFMC 标准的工作流引擎技术,设计可运行的流程和表单,实现工作任务在人与人.人与系统.系统 ...
- 解决WINDOWS防火墙开启后Ping不通
WINDOWS系统由于安全考虑,当开启防火墙时,默认不允许外主机对其进行ping功能,即别的电脑ping不通本机.别的主机ping不通本机是因为本机的防火墙关闭了ICMP回显功能,只要把这回显功能打开 ...