有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (4) 个答案

  1. # 1 楼答案

    编译器而言,我能想到的最大区别(除了明显的“输入”和“输出”)是泛型实现,因为这两个都有泛型,但非常不同(类型擦除与运行时辅助)。拳击模型显然不同,但我不确定这对编译器来说是巨大的

    在匿名方法、匿名内部类、lambda、委托等方面,特性有着明显的区别,但这很难与1:1进行比较。不过,最终只有你的教授知道他在寻找的答案(以及对教授应有的尊重,但如果他的答案已经过时一年或更长时间,请不要感到惊讶)

  2. # 2 楼答案

    Java和C#编译器都编译成一个“机器代码”,用于一个独立于最终执行平台的中间虚拟机;JVM和CLR

    JVM最初是专门为支持Java而设计的。虽然可以编译Java以外的语言以在JVM上运行,但其设计的某些方面并不完全适合某些语言类。相比之下,CLR及其指令集从一开始就被设计为支持多种语言

    另一个区别在于JIT编译的工作方式。根据Wikipedia,CLR被设计为运行完全编译的代码,因此(大概)CLR的JIT编译器必须在启动之前急切地编译整个应用程序。(我还收集到,您可以提前将字节码编译为本机代码。)相比之下,热点JVM使用真正的“即时”编译。字节码方法最初由JVM使用字节码解释器执行,字节码解释器还收集有关方法内执行路径的跟踪信息。那些执行多次的方法然后由JIT编译器编译为本机代码,使用捕获的跟踪信息帮助代码优化。这允许针对实际执行平台,甚至针对应用程序当前执行的行为,对本机代码进行优化

    当然,C#和Java语言有许多显著的差异,相应的编译器也不同,因为需要处理这些语言差异。例如,C#编译器执行更多的类型推断。。。因为C#语言更依赖于推断类型

  3. # 4 楼答案

    一个区别是C#编译器具有一些Java编译器不具备的类型推断功能(尽管Java 7可能会改变这一点)。举个简单的例子,在Java中必须键入Map<String, List<String>> anagrams = new HashMap<String, List<String>>();,而在C#中可以使用var anagrams = new HashMap<String, List<String>>();(尽管您可以在C#中创建非常大、复杂的表达式,而不必命名类型)

    另一个区别是C#编译器可以创建表达式树,使您能够将函数的描述传递给另一个函数。例如,(Func<int,int>) x => x * 2是一个接受整数并将其加倍的函数,而(Expression<Func<int,int>>) x => x * 2是一个描述接受整数并将其加倍的函数的数据结构。您可以将此描述编译为函数(在本地运行)或将其转换为SQL(作为数据库查询的一部分运行)