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的区别
经常听到有人在抱怨这个语言哪里哪里 不好,那个语言又是如何的优秀.对于这样 的牢骚,我只是一笑而过. 就我而言,语言只是工具,没有好坏之 分.只要你采用相应的语言,完成对应的工 作,那你的目标就完成了 ...
随机推荐
- 【AR实验室】mulberryAR : ORBSLAM2+VVSION
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- Carousel 旋转画廊特效的疑难杂症
疑难杂症 该画廊特效的特点就是前后元素有层级关系. 我想很多人应该看过或者用过这个插件carousel.js,网上也有相关的教程.不知道这个插件的原型是哪个,有知道的朋友可以告诉我. 该插件相对完美, ...
- JS实现页面进入、返回定位到具体位置
最为一个刚入职不久的小白...慢慢磨练吧... JS实现页面返回定位到具体位置 其实浏览器也自带了返回的功能,也就是说,自带了返回定位的功能.正常的跳转,返回确实可以定位,但是有些特殊场景就不适用了. ...
- WebGIS中等值面展示的相关方案简析
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值面是气象.环保等相关项目上常用到的效果展示.在传统的CS项 ...
- 深入理解javascript的getTime方法
1.理解getTime getTime() 方法返回一个时间的格林威治时间数值. 可以使用这个方法把一个日期时间赋值给另一个Date 对象. 语法: dateObj.getTime() 参数: 无. ...
- psoc学习
第一是:项目的路径需要放在Documents and Settings\,也就是默认的文件夹的地方,不然会报错错误范例为:Question:CY8CKIT-023 kit example projec ...
- 使用github远程仓库
经过几天对github的研究,终于把自己想完成的给解决了,发现google真的有很多解释,但是很多也会出现一些bug,对于初学者真的很多烦恼,所以整理一份,能给初识github的你有所帮助 一,首先, ...
- 中国CIO最关心的八大问题(下)
中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...
- Mysql - 游标/动态sql/事务
游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...