1


对于有经验的程序员来说,这可能是一个微不足道的问题,但我想知道两种不同的传递变量方法之间是否存在显着的性能差异(收集大量或非常大量的数据)?
我已经进行了测试,但数据结构相当小,我没有看到任何显着差异。此外,我不确定这些差异是否不是由后台运行的其他应用程序的干扰引起的。

带集合的类:

public class TestCollection
{
    ArrayList<String[]> myTestCollection = new ArrayList<String[]>();
    public TestCollection()
    {
      fillCollection();
    }

    private void fillCollection()
    {
        // here is fillng with big amount of data
    }

    public ArrayList<String[]> getI()
    {
        return myTestCollection;
    }
}

以及对集合进行操作的方法:

public class Test
{
    static TestCollection tc = new TestCollection();

    public static void main(String[] args)
    {
        new Test().approach_1(tc);
        new Test().approach_2(tc.getI());
    }

    public void approach_1(TestCollection t)
    {
        for (int i = 0; i < tc.getI().size(); i++)
        {
            // some actions with collection using tc.getI().DOSOMETHING
        }
    }

    public void approach_2(ArrayList<String[]> t)
    {
        for (int i = 0; i < t.size(); i++)
        {
            // some actions with collection using t.DOSOMETHING
        }
    }
}

问候。

4

1 回答 1

3

不,这里没有真正的区别。

Java 将对象传递references给方法,而不是整个对象的副本。这类似于pass by reference其他语言中的概念(尽管我们实际上是在将对象引用传递给被调用的方法,按值传递)。

如果您来自 C 编程背景,了解这一点很重要!

而且,一些提示 - 首先,最好将您的列表声明为List<...>而不是ArrayList<...>,如下所示:

List<String[]> myTestCollection = new ArrayList<String[]>();

其次,您可以for在列表上使用改进的循环,如下所示:

// first case
for (String[] s : tc.getI()) { /* do something */ }

// second case
for (String[] s : t) { /* do something */ }

希望这可以帮助 :)

于 2013-09-04T09:36:15.737 回答