如何从指针中删除对象?

时间:2012-04-06 02:37:23

标签: java

我有一个对象,我添加到几个不同的ArrayLists。我想避免更改每个列表,所以我正在尝试更改指针,以便所有列表都更改。但是如果我想将对象设置为null,我就无法工作。例如:

ArrayList<Point> list1 = new ArrayList<Point>();
ArrayList<Point> list2 = new ArrayList<Point>();
Point a = new Point(2, 3);
list1.add(a); list2.add(a);

此时,两个列表都有一个指向同一对象的项目。值为“2,3”。如果我改变了对象的值。然后两个列表都改变了:

a.set(5,5);

现在两个列表都有一个值为“5,5”的项目。但是,如果我尝试将值设置为null。

a = null;

现在a被设置为null,但是对象这两个列表仍然是“5,5”而不是我想要的null。我甚至尝试向Point类添加一个方法,将其自身设置为null。但是,我也无法做到这一点。如何通过仅更改指针来删除所有列表中的对象?

5 个答案:

答案 0 :(得分:5)

您可以更改引用变量持有的对象的状态,这将反映在引用同一对象的所有变量中,但如果更改引用变量的赋值,则仅影响该变量。提到的对象没有变化 - 正如预期的那样。

答案 1 :(得分:2)

在Java中,您不能从其“指针”删除对象(“引用”更精确)。当一个对象被解除引用(意思是:没有引用指向它)时,它就成了垃圾收集的候选者; Java的垃圾收集器会自动为您删除对象,没有free()操作,就像其他语言(C / C ++一样),您必须手动管理内存。

关于您的问题:您可以使用remove()中的ArrayList方法从两个列表中删除对象,或者在给定索引的列表中手动将对象设置为null({{ 1}}),但是没有办法通过将其外部引用(列表之外的引用)设置为list.set(index, null)来删除对象。

答案 2 :(得分:1)

简短的回答是'不'。您无法通过更改指向它的指针来更改对象的内容。

a = null;只清除指针,而不是对象。

答案 3 :(得分:1)

正如其他人所说,没有简单的方法来做你所要求的。你可以做什么,我不建议这样做,在List中使用WeakReference。弱引用不会阻止您的Point被垃圾回收。

List<WeakReference<Point>> list = new ArrayList<>();
Point p = new Point();
list.add(new WeakReference<>(p));
System.out.println(p);
System.out.println(list.get(0).get());

p = null;

System.gc(); System.gc(); System.gc(); System.gc(); // hopefully the GC collects p by now

System.out.println(list.get(0).get()); // null!

只需从remove两个Point手动List,就会轻松得多。

答案 4 :(得分:1)

  

如何通过仅更改指针来删除所有列表上的对象?

无。你无法做到这一点。如果要使列表中对象的引用为空(或从列表中删除它们),则必须对每个列表执行操作。

如果您无法修改列表,请考虑以下备选方案:

  1. 使用另一个Point类,该类具有一个额外字段,表示该点是否“有效”并且具有查看列表的代码检查此字段。

  2. 创建一个自定义类,表示对Point的可为空的引用; e.g。

      public class PointRef {
          private Point p;
          public PointRef(Point p) { this.p = p; }
          public Point get() { return p; }
          public void invalidate() { p = null; }
      }
    
      ArrayList<PointRef> list1 = new ArrayList<PointRef>();
      ArrayList<PointRef> list2 = new ArrayList<PointRef>();
      PointRef a = new PointRef(new Point(2, 3));
      list1.add(a); list2.add(a);
    
      ...
    
      a.invalidate;
      // Now both lists contain hold a PointRef that points to a null Point.
    
  3. 但这两个都使使用列表及其包含的Point对象更加复杂。

    (@ Jeffrey的回答建议使用WeakReference类,但语义错误。特别是,如果GC检测到没有对该对象的强引用,引用将“中断”。这不是什么如果我正确理解你的问题,你的用例需要...。


    顺便说一下,我想不出任何一种编程语言可以让你以你提出的方式做你想做的事情。