【问题标题】:Should we pass argument to a method as a variable or as a new object directly in java我们应该将参数作为变量还是直接在java中作为新对象传递给方法
【发布时间】:2013-01-14 10:06:01
【问题描述】:

考虑以下两个对 java 中同一个方法的调用:-

1)doSomething(new Object[]{"something"}) ;

2)

Object[] obj = {"something"} ;

doSomething(obj);

在内存和时间效率方面哪个更有效?我会说 1) 在内存和时间效率方面都更好。在第二个选项中的原因要求我们创建另一个变量(额外的内存),然后将该值分配给变量(额外的时间)。有没有cmets?

只是为了澄清对象只会被创建一次,我说的是用于保存新创建对象的地址的额外变量。

【问题讨论】:

  • 不要在这里吹毛求疵,但无论如何你都会创建obj,这是一个问题,何时/是否obj 将被垃圾收集。

标签: java


【解决方案1】:

两者在时间和内存方面都是相同的。额外的赋值可以被编译器优化掉。

不同之处在于,第二个版本让您有机会为变量指定一个有用的名称,这可以使代码更加清晰。

【讨论】:

  • 我同意你的观点,第二个可能很清楚。但是,假设对象的实际地址是 42。在第一种情况下,它将首先将该值分配给变量 obj(额外时间),然后将该值传递给函数。在第二种情况下,“new”运算符返回的对象的地址将直接传递给函数。所以这两种情况都是这样的:-
  • 1) doSomething(42); 2)obj = 42;做某事(对象);仅当 Java 要创建一个中间变量来保存地址然后传递该变量时,您的观点才有效。我不确定Java是否这样做。如果是,为什么需要这样做。只需传递实际地址即可?
【解决方案2】:

第二个调用允许您在调用方法中重用对象,但第一个不允许。

它与内存无关,因为无论如何都会创建传递的对象。

【讨论】:

  • 但也创建了另一个变量。
  • 不,在第二次调用中,会创建一个变量,然后将其作为引用传递给被调用的方法。但它仍然是同一个对象,它只在内存中创建一次。好的,它创建了另一个地址引用,但它在时间和内存上都可以忽略不计,并且可以在编译时进行优化,正如 Mark 所说。
  • 是的,我说的是新变量中包含的额外地址引用(实际对象只会创建一次),是的,这可以忽略不计。
【解决方案3】:

您应该始终首先考虑更简单和更清晰的内容。仅当您知道存在问题时才应考虑性能,因为您在分析器或微基准测试中对其进行了测量。

最好的选择可能是使用可变参数

doSomething("something");

void doSomething(String... args) { }

注意:这不仅是最简单的,而且可能是最快的,因为 JIT 可以消除创建的 String[]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2014-03-12
    • 2019-01-02
    • 2022-08-31
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多