【问题标题】:Updating and Referencing items in a List更新和引用列表中的项目
【发布时间】:2017-03-19 05:05:47
【问题描述】:

我只是想知道 Java 是否提供了允许以下内容的任何东西:

<Some List> list = new <Some List>;
Foo f = null;
list.add(f);
f = new Foo();

//Where this would be true
list.contains(f)

//As well as this (which is kind of implied by the contains call)
f == list.get(0)

据我所知,这不适用于任何 Java 列表。本质上,我问的是是否有一个集合类型会根据它们的外部引用更新它们的内部元素。在上面的示例中,我希望将 'f' 设置为 Foo 的新实例也将反映在列表条目中。这也意味着以下情况是正确的:

<Some List> list = new <Some List>;
Foo f = null;
list.add(f);
f = new Foo();
f.name = "banana";

//Where this would be true and not cause an NPE, as it does with List
f.name == list.get(0).name //Both would equal "banana"

这样的事情存在吗?

编辑:

为了澄清,添加到列表中的原始对象需要为空。然后更新该对象,并且该更新应反映在列表中。在上面的例子中,Foo变量一开始是null,当它仍然为null时被添加到列表中。添加后,我将其设置为 Foo 的新实例。我想知道是否有一个列表类型,当我实例化 Foo 时,它也会更新列表。

【问题讨论】:

  • 为什么要在列表中添加null,然后修改f?当您这样做时,您不会修改列表中的空条目。 f 是一个引用,reference 的副本存储在列表中,而不是对引用的引用。如果您需要 2 级间接,则必须将引用包装在一个类中并将该类的实例存储在列表中。

标签: java list


【解决方案1】:

回答你关于包含的问题看看这个例子

        List<String> test = new ArrayList<String>();
        String one = new String("one");
        test.add(one);
        one = new String("one");
        System.out.println(test.contains(one));

打印结果是真的,为什么?因为 String 类覆盖了 equals 和 hash 方法(从 Object 类,所有 Class 都从 Object 扩展)

如果你没有得到equals,那是因为你需要探测方法equals在你传递它时是否为真。

【讨论】:

    【解决方案2】:

    实现您正在寻找的最简单的方法是将您的引用包装在另一个类中:

    class FooRef {
        private Foo foo = null;
    
        public void setFoo(Foo foo) {
            this.foo = foo;
        }
    
        public Foo getFoo() {
            return foo;
        }
    }
    
    List<FooRef> fooRefs = new ArrayList<>();
    FooRef ref = new FooRef(foo1);
    fooRefs.add(ref);
    ref.setFoo(foo2);
    assertSame(foo2, fooRefs.get(0).getFoo());
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2021-08-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多