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

什么时候比数组更喜欢varargs列表?

刘嘉木
2023-03-14
问题内容

我正在实现一个API,有一个方法可以传递程序从中读取资源的路径列表

public void importFrom(String... paths) {

}

我正在使用varargs使调用方法尽可能方便用户,就像这样

obj.importFrom("/foo", "/foo/bar);

这是varargs的适当用法吗?还是传递数组更好?


问题答案:

在您的情况下,varargs很好。您实际上并不需要对要导入的路径进行数组处理,因为除了将它们传递给您的importFrom方法外,您不需要执行任何其他操作。

varargs功能使您不必为了将一组值传递给一次性方法而显式创建数组,而您似乎确实在这里拥有该数组。

顺便说一句,你 可以 还通过在一个数组,如果你想

public class VarargsDemo {
    public static void f(String... args) {
        for (String s: args) {
            System.out.println(s);
        }
    }
    public static void main(String[] args) {
        String[] english = new String[]{"one", "two", "three"};
        f(english);
        f("uno", "dos", "tres");
    }
}

因为行为是相同的,所以差异归结为您希望方法签名“说”什么的(可能是次要的)问题。当您声明一个方法以采用显式数组参数时,几乎就像您想强调要对数组对象进行操作一样,该对象已在方法外部定义,并在方法外部具有其自身的存在和重要性,并且其中可能涉及索引等操作。当用varargs声明方法时,就好像您在说“只是给我一堆东西”一样。

再说一遍,这不一定是正确的。JVM不知道它们之间的区别,只看到运行时的数组。许多程序员不会因为方法签名的目的而费心。Varargs旨在简化通话。

就是说,varargs 的主要 限制 是这样的参数必须是方法的最后一个。在您的情况下,这不是问题,但通常需要考虑。



 类似资料:
  • 问题内容: 当喜欢过? 何时以及何时使用哪种数据结构: 您想要高效的读写 应该具有更少的内存占用 尽管存在类似的问题,但它并没有突出表明应该优先选择哪个事实? 问题答案: 蜘蛛侠鲍里斯(Boris the Spider)已经概述了和之间最明显的区别-前者始终是有界的,而后者可以是无界的。 因此,如果您需要无限制的阻塞队列,或者将其用作工具箱中的最佳选择。 但是,假设您需要一个有限的阻塞队列。最后,

  • 问题内容: 我的要求是仅显示跨数据库从数据库检索的一组值。我正在使用jQuery。 问题答案: 如果满足以下任一条件,则将XML优先于JSON: 您需要消息验证 您正在使用XSLT 您的消息中包含很多标记文字 您需要与不支持JSON的环境进行互操作 当所有这些都成立时,在XML上偏爱JSON: 不需要验证消息,或者验证消息的反序列化很简单 您不是要转换邮件,也不是转换邮件的反序列​​化很简单 您的

  • 问题内容: 在Swing中,密码字段具有(returns )方法,而不是通常的(returns )方法。同样,我也遇到了不建议使用密码的建议。 为什么涉及密码安全性受到威胁?使用起来感觉不方便。 问题答案: 字符串是不可变的。这意味着一旦创建了,如果另一个进程可以转储内存,则除了反射之外,你将无法清除数据,然后再进行垃圾回收。 使用数组,你可以在使用完数据后显式擦除数据。你可以用任何你喜欢的东西覆

  • 问题内容: 复制整个数组时,我经常看到人们写: 但是在我看来,没有理由对此表示赞同: 无论如何,它们都是浅表副本。这些人可能只是不知道存在。那么有什么理由不使用吗? 问题答案: 否。 如果您 确实要进行微 基准测试,则可能取决于您正在运行的JVM。但是实际上,没有。

  • 我想知道什么时候应该使用顶级常量,什么时候应该使用伴星对象?如果财产是私有的还是公共的,我应该考虑使用什么? 或者我应该使用: 当我们处理可见性时,使用什么很重要吗?

  • 问题内容: 在Swing中,密码字段具有方法,而不是通常的方法。同样,我遇到了不使用String密码的建议。 为什么String涉及密码安全性受到威胁?使用起来感觉不方便。 问题答案: 字符串是不可变的。这意味着一旦创建了String,如果另一个进程可以转储内存,则除了反射之外,你将无法清除数据,然后再进行垃圾回收。 使用数组,你可以在使用完数据后显式擦除数据。你可以用任何你喜欢的东西覆盖阵列,并