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的区别
经常听到有人在抱怨这个语言哪里哪里 不好,那个语言又是如何的优秀.对于这样 的牢骚,我只是一笑而过. 就我而言,语言只是工具,没有好坏之 分.只要你采用相应的语言,完成对应的工 作,那你的目标就完成了 ...
随机推荐
- 先说IEnumerable,我们每天用的foreach你真的懂它吗?
我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...
- RabbitMq应用二
在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- SSH实战 · 唯唯乐购项目(中)
用户模块 三:一级分类的查询 创建一级分类表并导入基本数据 CREATE TABLE `category` ( `cid` int(11) NOT NULL AUTO_INCREMENT, ` ...
- CSS HTML元素布局及Display属性
本篇文章主要介绍HTML的内联元素.块级元素的分类与布局,以及dispaly属性对布局的影响. 目录 1. HTML 元素分类:介绍内联元素.块级元素的分类. 2. HTML 元素布局:介绍内联元素. ...
- 解决PHP-问题:Class 'SimpleXMLElement' not found in
1.问题 在ubuntu 16.10中,学习PHP,学习到PHP如何生成XML文件时候,碰到了这个问题: PHP Fatal error: Class 'ClassName\SimpleXMLElem ...
- SDWebImage源码解读之SDWebImageCache(下)
第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...
- JDBC增加删除修改
一.配置程序--让我们程序能找到数据库的驱动jar包 1.把.jar文件复制到项目中去,整合的时候方便. 2.在eclipse项目右击"构建路径"--"配置构建路径&qu ...
- 极光推送和友盟推送,ios端和安卓端的后端调试设置
我是最后端的,这两天搞了一个app项目,前端安卓使用友盟很方便,调试比较顺利,然后ios就遇到各种问题了,证书.发送成功推送不成功,测试时用的TestMode(),ios上架之后就必须用product ...
- Ajax部分
Ajax的概念 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指 ...