Java与c#的一些细节区别

Wesley13
• 阅读 567

实习中用的语言是c#,第一次接触到这种语言,然后写的过程中,发觉和Java几乎一摸一样,好像根本是无缝切换,但细节仍有很大的区别,称有空总结一波里面的部分细节实现。

ps. 我写c#过程中,发觉c#有很多优秀的特性,写起来在方便很多,比如lambda,linq等

1.Lambda VS Delegate

Java底层实现:

 1 /**
 2  * @Auther: Chang
 3  * @Date: 2018/9/2
 4  */
 5 public class JavaVsCSharp {
 6     public static void main(String[] args) {
 7 
 8         testLambda(() -> System.out.println("Hello World"));
 9     }
10 
11     private static void testLambda(Print pt) {
12         pt.print();
13     }
14 }
15 
16 @FunctionalInterface
17 interface Print {
18     void print();
19 }

结果是打印出Hello World

我们对class文件进行反编译试一下,javap -c -p JavaVsCSharp.class

Java与c#的一些细节区别

内部动态生成了一个私有的静态方法

1 private static void lambda$main$0() {
2     // 空
3 }

然后然后。。。。我就不会调试了。。。。。。网上的调试我没看懂,怎么跑来跑去的(菜是一种罪过)

不过最后最后就生成了一个内部类,和一个内部方法

 1 private static void lambda$main$0() {
 2     System.out.println("Hello World!!!");
 3 }
 4 
 5 static final class JavaVsCSharp$$Lambda$1 implements Print {
 6     private JavaVsCSharp$$Lambda$1() {
 7     }
 8 
 9     @Override
10     public void print() {
11         lambda$main$0();
12     }
13 }

c#底层实现:

Java与c#的一些细节区别

转自:你知道C#中的Lambda表达式的演化过程吗?

说白了,c#就是一个delegate委托,类似于c中的函数指针。每一个Lambda对应着一个函数方法,delegate指向这个函数方法,现在Lambda把它简化了,即不用重新写一遍了。 

2.Linq VS Stream表达式

Java Stream实现:

 1 **
 2  * @Auther: Chang
 3  * @Date: 2018/9/2
 4  */
 5 public class JavaVsCSharp {
 6     public static void main(String[] args) {
 7 
 8         List<Integer> list = new ArrayList<>();
 9         for (int i = 0; i < 10; i++) {
10             list.add(new Random().nextInt(100));
11         }
12         print(list, "原数据");
13         list = list.stream().sorted(Comparator.naturalOrder()).distinct()
14                 .filter(x -> x > 50 || x % 5 == 0).collect(Collectors.toList());
15         print(list, "处理后数据");
16     }
17 
18     private static void print(List<Integer> list, String s) {
19         System.out.print(s + ":  ");
20         list.forEach(x -> System.out.print(x + "  "));
21         System.out.println();
22     }
23 }

我们可以看到list得到stream流接口以后,就有很多方法可以调用了

Java与c#的一些细节区别

Stream这个接口的实现方法都在 ReferencePipeline 实现完了。(话说不知为何,感觉这个类的实现很乱,代码风格差的特别多)

c#linq实现:

 1 class IntroToLINQ
 2 {        
 3     static void Main()
 4     {
 5         // The Three Parts of a LINQ Query:
 6         //  1. Data source.
 7         int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
 8 
 9         // 2. Query creation.
10         // numQuery is an IEnumerable<int>
11         var numQuery =
12             from num in numbers
13             where (num % 2) == 0
14             select num;
15 
16         // 3. Query execution.
17         foreach (int num in numQuery)
18         {
19             Console.Write("{0,1} ", num);
20         }
21     }
22 }

是不是很像SQL语句,用起来也特别的清晰明了。这点可以说c#甩了Java几条街。

由于很少用Linq,我的VS也过期了,难受,官方教程了解下 => 官方Linq教程

后言:可能c#一些东西没有深入到底层,因为VS过期,并且已经很少用了。所以哪里有不对的地方,老哥们,还希望指出,谢谢

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java通过JNI调用C语言写的函数,能提高运行效率吗?
C语言比Java快早就是公认的事实了。而Java可以通过JNI调用C语言写的库很多人也都知道。但通过JNI调用C语言写的函数能提高效率吗?一直以来我都认为是的。昨晚心血来潮做了个测试,本意是想看看传说中强大的C语言在速度上到底有多强大,结果让我发现了通过JNI调有C语言并不能提高效率。不知道这样的结论有没有错,先说一下我测试的过程吧:第一个测
Wesley13 Wesley13
3年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Stella981 Stella981
3年前
Gson序列化时@SerializedName的使用
        Gson是java中比较常见的json序列化工具,实习参与的项目由于最开始是C开发的.net项目,近两年才开始用java,但之前的很多项目仍然在使用C并且还在更新。于是牵涉到跨语言的程序通信,公司自己用thrift封装了一个服务路由实现。但两个语言有些不一样的地方挺蛋疼,比如命名规则,java喜欢首字母小写,C喜欢首字母大写,传数据就
Wesley13 Wesley13
3年前
JAVA专业好还是C语言专业好,哪个编程语言好就业?
Java可以算是从C发展而来的,所以语法和C很相似,但既然是升级,所以必定涵盖了很多C的东西,所以这两种语言,只需学其一即可,java尤善用些。Java是面向对象的,C是面向过程的,就好像说做蛋糕,最早时期只能用手一个个塑形,就好比于C语言,而后有人发明了蛋糕模子,然后就可以不用每一个都捏一下了,这就好比与Java语言,这种方
Wesley13 Wesley13
3年前
Java 基本功 (基础概念与常识)
主要涉及知识点:JVMJDK和JRE最详细通俗的解答OracleJDK和OpenJDK的对比Java和C的区别?什么是Java程序的主类应用程序和小程序的主类有何不同?Java应用程序与小程序之间有哪些差别?importjava和javax有什么区别?为什么说Java语言“编译与解释并存”?
Wesley13 Wesley13
3年前
mysql数据库优化课程
mysql数据库优化课程9、php用什么写的一、总结一句话总结:php是用c语言写的,所以php里面的那些模块什么都是c语言c语言:php是用c语言写的,所以php里面的那些模块什么都是c语言2、google搜索和百度搜索的区别是什么?
Wesley13 Wesley13
3年前
Java并发编程:多线程如何实现阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。Java为我们提供了多种API来对线程进行阻塞和唤醒操作,比如suspend与resume、sleep、wait与notify以及park与unpark等等。!(
Wesley13 Wesley13
3年前
Java 并发编程:多线程如何实现阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。Java为我们提供了多种API来对线程进行阻塞和唤醒操作,比如suspend与resume、sleep、wait与notify以及park与unpark等等。!(
Wesley13 Wesley13
3年前
Java与C++的区别
C和Java的区别:(面试问到这个问题,特来总结一下根据CPrime和ThinkinJava两本书总结而来)尽管Java是基于C的的,但是相比之下,Java是一种更纯粹的面向对象程序设计语言。在Java中,一切都被视为对象。1\.C创建对象之后,需要再使用完将其调用delete方法将其销毁;Java有垃圾回收机制,用