首页 > 解决方案 > 在类之间传递二维数组列表

问题描述

我将如何将我的二维数组列表传递给数字类,这样当我在那里更改它时,我在测试中的数组列表也会改变,反之亦然。就像两个类共享同一个变量;我确实在 C 上通过引用传递,但在 java 中我不知道

import java.util.ArrayList;

public class test {

    ArrayList<ArrayList<String>> stats = new ArrayList<ArrayList<String>>();
    
    public static void main(String[] args)
    {
        stats.get(0).add("one");
        System.out.println(stats.get(0).get(0));
    }
}

我希望这个数字类能够访问和更改 arraylist 变量

import java.util.ArrayList;

public class numbers {
    //add value
    //change value
}

标签: javaarraylist

解决方案


TL;博士

在我个人看来,无需开发人员额外努力即可自动将数据结构作为引用传递的语言应归类为按引用传递,因为指向过时的标准并不能真正帮助任何人。

关于按值传递与按引用传递的咆哮

从技术上讲,Java 是按值传递的

参考:Java 是“按引用传递”还是“按值传递”?

但是,由于该值通常最终成为指针(除非您传递原始类型),因此它也可以通过引用传递。

如今,参考传递语言几乎不存在,而且往往不告诉某人一种语言是传递值传递对回答他们的问题没有多大帮助,而且实际上可能在他们第一次学习如何做时给他们错误的想法编码。

参考:哪些(有)语言只通过引用传递?

一般来说,大多数人想知道的是我的数据在哪里以及它是如何传递的。由于像 Java 和 Python 这样的语言不给你选择指向数据的指针(不,反射不算数),它提出了一个问题,如果我创建一个传递 type 的函数,Foo它会在整个范围内复制值吗?Foo对象或只是引用相同的 foo 对象。

分别以这两个非常相似的 C 和 Java 程序为例。

struct {
    int bar;
} Foo;

void editFoo(Foo foo) {
    foo.bar = 85;

Foo a;
a.bar = 6;

editFoo(a);
printf("bar: %d", a.bar);
class Foo {
    int bar;
}

static void editFoo(Foo foo) {
    foo.bar = 85;
}

Foo a = new Foo();
a.bar = 6;

editFoo(a);
System.out.println("bar: " + a.bar);

C 版本打印6,说明函数没有修改a。为了让它改变其中的数据,a我们需要修改函数以指定它需要一个引用。但是另一方面,Java 版本打印85表明它确实通过了引用,而我们没有做任何额外的工作。事实上,Java 并没有像 C 那样提供按值传递的选项。如果我想传递一个完全独立但相同的副本Foo,我需要创建一个deepCopy函数并在每次传递对象时调用它。在我看来,这应该区分传递值和传递引用。

所以回答你的问题...

您可以将其添加到构造函数或通过函数调用传递它。

public class Numbers {
    public static void modifyList(ArrayList<ArrayList<String>> list) {
        // You can access it here too!
        list.get(0).add("two");
    }
}

// Somewhere in main function
Numbers.modifyList(stats);
System.out.println(list.get(0).get(0));
// Should output "two"

尽管如此,您可能会遇到当前代码的问题,因为stats它不是static但正在上下​​文中使用static


推荐阅读