前言:因为目前gis圈里,搞b/s的基本后台都用的是java、c++,java占主流。不过c/s的主流还是C#,主要集中在ArcEngine、skyline、osgEarth上做二次开发。但我一直是做b/s的,虽然搞了三年的C#,还是准备转java。有句话说的好,做一件事,最好的时间就是十年前,或者现在。所以别犹豫,干就完了。
接下来对比一下C#和java的不同之处吧:
1、getter setter
C#的get set写起来非常顺手,只要字段后面跟个大括号,里面写上get;set;就行,但是java必须写全,这一点让人很难受。虽然C#编译的时候,底层也是自动补全get和set方法,但是用户写起来爽呀。
2、继承
C#的继承,无论是继承类还是继承接口,都用冒号连接就行,非常方便。但是java继承类必须用extends,继承接口必须implements。
3、方法引用
C#里叫委托,java里就叫方法引用,本质上都是用另一种方式来调被引用的那个方法。
4、Lamda表达式
C#里Lamda表达式用 => 连接,java里用 ->连接。
5、锁
线程里的锁,C#的关键字是lock,java里是synchronized 意思是同步的,即同一个时刻只能有一个线程来访问,他们都是要把某一块代码包起来。在jdk1.5时也新增了lock关键字,准确的说是方法,需要手动mylock.lock和mylock.unlock。
6、数组声明
java声明数组既可以 int[ ] arr=……也可以int arr [ ]=……,官方其实推荐第一种写法,c#则只能是第一种写法。
7、数组遍历
java的forEach循环:
// 打印所有数组元素
for (double element: myList) {
System.out.println(element);
}
c#的forEach循环:
// 打印所有数组元素
foreach(double element in myList) {
Console.WriteLine(element);
}
8、时间类型
java中Date的构造函数可以传一个millsec,表示的是从1970年1月1日起的毫秒数,即时间戳,这一点和js类似。
9、时间类型的格式化
java中对于Date类型的格式化需要用到SimpleDateFormat类,对Date的加减需要用到Calender类,c#则只用Date或者DateTime就行。
10、java注解 vs c#特性
注解或特性说白了都是给计算机看的,不同的注解特性有不同的功能。不过我感觉java中注解经常使用,而c#中特性一般使用的并不太多。
11、异常
java和c#都是用的try catch捕获异常,但是抛异常不太一样。java是不仅需要在方法声明之后要加一个类似throws RunTimeException来抛,也需要在方法体里写throw new exception(注意:方法体里是throw,声明时是throws),而c#里则只需要在方法体里直接throw new exception就行。
12、命名空间
命名空间是c#里的概念,java里叫package,两个是一个意思,体现的是功能的模块性。
13、集合
java中集合的类型巨多,可分为set list map三大类,每一种又有两三种子类。c#主要还是用list,且在c#中遍历集合主要还是用for 或者foreach循环。而java中虽然也可以用for遍历,但是一般不用这种方式,用的是迭代器iterator来遍历。最最最特殊的是,集合的移除元素不是用集合本身的方法,而是用迭代器的remove方法。我的天呐~~~~。虽然也可以用foreach遍历,但是本质上还是调用的迭代器。
14、枚举
java中的枚举可以实现一个接口,里面的每个枚举项都可以重写这个接口,从而在调用的时候表现出不同的内容,感觉跟多态似的。然而在c#好像不能这么用?反正我从来没有这么玩过。
15、泛型
java中的泛型指定类型时只能用包装类型或者引用类型(Interger Double String),不能用基本数据类型(int double string)。c#中则都是用基本数据类型。泛型方法中尖括号放置的位置也有所不同,c#一般是放在方法名称后面,而java是放在返回值的前面。
16、list类型对比
java中的list类型分为arraylist、linkedlist、vector三种,linkedlist底层是用双向链表实现的,其他两个底层都是用object数组实现的,一个线程安全一个不安全,两个的数组扩容时的默认容量也不太一样。所以综合上来说,linkedlist的效率最高。
17、map vs dictionary
键值对,在c#中叫dictionary,在java中叫map,java中的map又分为hashmap linkedhashmap、treemap、hashtable、properties。key都不可重复,我觉得c#中的dictionary更像java中的linkedhashmap,都可以按照添加的顺序去遍历。补充一句,java中集合的无序性的意思是向集合里添加的时候不是按索引的123456去添加,而是根据hash值去计算一个位置。所以遍历的时候仍然是有顺序的,只不过不是添加的顺序而已。
18、可变参数
c#中的可变参数用关键字params表示,java中用三个点表示…
19、占位符
c#里的占位符比较简单,只有{0}{1}{2}……,java里就比较多了,string.format用的是类似c语言的占位符,如%s 、%d 、%f等等,message.format用的也是{0}{1}{2},拼接sql语句时用的是?占位符,在xml文件中,如在mybaties框架里,用的是#{0}或者#{param1}或者#{变量1}#{变量2}#{变量3}或者${变量1}${变量2}${变量3}。
持续更新中。。。。。。