当前位置: 首页 > 面试题库 >

JVM如何实现varargs?

籍昱
2023-03-14
问题内容

最近,我对Java中的这种功能感兴趣,因为它具有可变数量的参数。这是一个非常酷的功能。但是我很感兴趣:

void method(int x, String.. args) {
  // Do something
}

如何在运行时级别上实际实现呢?我想到的是,当我们打来电话时:

method(4, "Hello", "World!");

最后两个参数在内部转换为数组,然后传递给方法。我对此是否正确,或者JVM实际上将堆栈引用插入了字符串,而不仅仅是对数组的引用?


问题答案:

它在编译时级别实现。您的方法被编译为字节码为

varargs method(I[Ljava/lang/String;)V
...

相当于

void method(int x, String[] args) {
...

varargs标志。

method(4, "Hello", "World!");

编译为

method(4, new String[] {"Hello", "World!"});


 类似资料:
  • 本文向大家介绍jvm是如何实现线程的?相关面试题,主要包含被问及jvm是如何实现线程的?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JVM 线程是比进程更轻量级的调度执行单位。线程可以把一个进程的资源分配和执行调度分开。一个进程里可以启动多条线程,各个线程可共享该进程的资源(内存地址,文件IO等),又可以独立调度。线程是CPU调度的基本单位。 主流OS都提供线程实现。Java语言提供对线程

  • 问题内容: 在寻找有关如何在Java中实现引用变量的解释时,我遇到了一个问题: Java的引用变量内部是什么? Samuel_xL在评论中说,指定供应商名称将是一个更好的问题。所以我的问题是,如何在Oracle JVM中实现实例变量?它是指向地址的指针吗?我知道引用包含告诉JVM如何访问对象的位。但是它的结构如何? 问题答案: 根据我的判断,对象引用存储为称为(普通对象指针)或的类型,具体取决于J

  • 问题内容: 是否有 JavaScript jvm实现 ? 如果没有,您能给我一些为什么它还没有意识到的原因吗?(可能不可能吗?)我试图了解创建一个缺少什么? 我问的原因是我想创建具有编译功能的Web浏览器ide,而无需在计算机上安装jdk或jre(仅在浏览器中)。 问题答案: 不确定jsJVM的成熟程度如何,但是您可能会对您感兴趣的东西看起来很像。如页面所示,它是用Javascript编写的JVM

  • 问题内容: 是否有人尝试为JVM实现C#?作为Java开发人员,我一直羡慕C#,但不愿放弃JVM的可移植性和成熟度,更不用说针对它的各种工具了。 我知道JVM和CLR之间有一些重要的区别,但是有没有什么是最流行的? 问题答案: CLR和JVM之间有很大的不同。 一些例子: Java没有用户定义的值类型 Java泛型与.NET泛型 完全 不同 C#的许多方面都依赖于框架的元素-委托等。您还需要移植库

  • 问题内容: 阅读Loom提案后提出了这个问题,该提案描述了用Java编程语言实现协程的方法。 特别是,该提案表示,要以该语言实现此功能,将需要其他JVM支持。 据我了解,JVM上已经有多种语言将协程作为其功能集的一部分,例如Kotlin和Scala。 那么,如何在没有其他支持的情况下实现此功能,而没有其他支持,是否可以有效地实现它呢? 问题答案: tl; dr 摘要: 特别是,该建议说,要以该语言

  • 问题内容: 我在JVM中运行了两个单独的缓存(一个由第三方库控制),每个缓存都使用软引用。我希望JVM在库控制的缓存之前先清除受控的缓存。SoftReference javadoc指出: 在虚拟机引发OutOfMemoryError之前,确保已清除所有对软可访问对象的软引用。否则,在清除软引用的时间或清除对不同对象的一组此类引用的时间上将没有任何限制。但是,鼓励虚拟机实现偏向于清除最近创建或最近使