如何在Java中引用参考?

时间:2019-01-14 19:51:35

标签: java pointers reference

我正在尝试通过自定义迭代器从Array中删除元素,并且需要从数组中删除元素。我知道使用数组不是很实用,但是由于某些原因,我有一些限制。

问题是我无法使用删除的元素创建另一个数组并更改引用。因为我在定制的Iterator类中没有真正的参考。我需要更改为真正的参考。让我用代码更好地解释这一点:

<!-- HTML -->

<button class="terug">Click Me</button>
<img class="popup" src="images/popup1.png" alt="beoordeling">

我可以通过删除指定元素来创建缓冲区副本,并将缓冲区引用更改为该副本。但我希望此删除可以影响实际数组。所以我 实际需要更改arr []。

同样,我知道在具有Collection层次结构时,对数组的整个使用是毫无意义的,但是我需要以这种方式解决这一问题。在这种情况下,对引用的引用不是一个很好的术语,但是我在C ++中对此有一个实现,并且正在寻找某种类似于指针的指针。

谢谢。

3 个答案:

答案 0 :(得分:1)

在您的示例中已经是这种情况了...

buffer设置为arr,可以创建引用的副本到堆中的同一Array,其中包含所有元素的相同引用。

事实是,如果要删除元素,则不应该以这种方式使用数组。

您只需使用相同类型元素的列表即可。

更改实现,以使用List<E>而不是数组,您将能够对其调用remove方法,并且对原始传递的list实例生效。

答案 1 :(得分:0)

如果要“指针的指针”,我有两种方法:第一种方法是创建仅包含一个元素的数组,第二种方法是创建自己的包含该元素的包装器类。

我将给出第一种方法的示例:

public class Iterator<E>
{
    private E[][] pointerToPointer;
    private E[] buffer; // underlying buffer.
    private int idx; // location of iterator in buffer.
    private E last_element; // last element returned by this iterator.

    public Iterator(E[][] pointerToPointer)
    {   
        this.pointerToPointer = pointerToPointer;
        buffer = pointerToPointer[0];
        idx = 0;

    }

     /**
     * Removes from the underlying collection the last element returned
     * by this iterator.
     */
    public void remove()
    {
        // create your new array (let's call it newArr)
        ...

        buffer = newArr;
        pointerToPointer[0] = buffer;
    }
}

然后,当您调用迭代器时,必须创建一个单例数组:

Integer[] arr = ...
Integer[][] pointerToPointer = {arr};
Iterator<Integer> it = new Iterator<>(new Integer[][]{pointerToPointer});

//use your iterator, including remove() method
...

arr = pointerToPointer[0]; //this gets the modified array

无论如何,是什么让您无法向返回域Iterator的{​​{1}}类添加方法?

答案 2 :(得分:0)

Java是按值传递而不是按引用传递,这意味着;您正在复制数据,然后让垃圾收集器(GC)负责其余的工作。因此,您没有C ++中的指针。

这是我的想法,有一个不良的副作用-数组是固定的,并分配给解析给构造函数的数组(已删除索引,但替换为null):

public void remove(int index) {
        @SuppressWarnings("unchecked")
        E[] tmp = (E[])new Object[this.buffer.length]; // Can cause issues on some types
        int x = 0; // Variable to track tmp's index counter
        for(int i = 0; i < this.buffer.length; i++) {
            if(i != index) {                
                x++;
                tmp[x] = this.buffer[i]; 
            }

        }
        this.buffer = tmp;
    }