【问题标题】:How Java ArrayList works internally [closed]Java ArrayList 如何在内部工作 [关闭]
【发布时间】:2019-01-24 21:31:05
【问题描述】:

在下面的代码中,我将列表(在 main 中定义)传递给 remove_dup 方法,它更新了实际的数组列表(列表)。由于 Java 是按值传递的,那么为什么列表由 remove_dup 方法更新。

然后我使用 list 创建了另一个 list2,但是如果我在 list2 中添加一个元素,它不会被添加到列表中。

为什么要更新主列表而其他方法不更新?

        public class ArrayListTest {

            public static void remove_dups(ArrayList<String> list, int n) {

                Set<String> unqList = new TreeSet<String>(list);
                list.clear();
                list.addAll(unqList);
            }

            public static void main(String[] args) {

                ArrayList<String> list = new ArrayList<String>();

                list.add("one");
                list.add("two");
                list.add("two");

                remove_dups(list);
        //As Java is pass by value then why its printing unique values here?
  //expected output---- One two two but its printing one two
                for (String string : list) {
                    System.out.println(string);
                }

                ArrayList<String> list2 = new ArrayList<String>(list);

                list2.add("three");

                for (String string : list2) {
                    System.out.println("list 2-" + string);
                }

    //I was expecting "three to be printed with list" 
                for (String string : list) {
                    System.out.println("list 1-" + string);
                }
            }
        }

【问题讨论】:

  • 我无法重现您的问题;当测试 list2 按预期包含“三个”时。由于变量 n 未定义,您的代码将无法编译。
  • 你认为new ArrayList&lt;String&gt;(list); 会做什么?
  • 您是否期望第一个列表也包含“三个”?
  • 当您将list 传递给remove_dups 时,您传递的是对原始对象的引用,这允许remove_dups 修改内容。当调用new ArrayList&lt;String&gt;(list)时,它会用list的内容创建一个新的List,但是修改list2不会改变list,因为两者之间不再有联系,它们是两个不同的实例List
  • ”Java 总是按值传递。不幸的是,当我们传递一个对象的值时,我们传递的是对它的引用。这让初学者感到困惑。” 欢迎来到一个混乱的世界????

标签: java arraylist


【解决方案1】:

如果您将ArrayList 传递给函数,它会将指针传递回原始列表。这意味着该方法中的任何更新都将更新您原来的ArrayList,因为它们是相同的。

ArrayList<String> list2 = new ArrayList<String>(list);

这会复制一份列表并将其保存到list2。 list 和list2 是完全独立的ArrayList 的。

【讨论】:

  • "如果你将 ArrayList 传递给它通过引用传递的函数..." -- 不,Java 中的一切都是pass by value
  • 指向 ArrayList 的指针按值传递给方法。指针指向 ArrayList 的内存空间。整个 ArrayList 的副本不是按值传递的。
  • "整个 ArrayList 的副本不是按值传递的。" - 我没有说是。阅读链接的文章。按值传递对象引用和按引用传递是有区别的。
  • @azurefrog 该链接很有帮助。谢谢
猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多