【问题标题】:<T> T[] toArray(T[] array) not modifying the original array<T> T[] toArray(T[] array) 不修改原始数组
【发布时间】:2021-12-26 09:13:51
【问题描述】:

我编写了以下代码作为 BST 的实现。添加toArray() 仅供参考。返回的数组工作得很好,但在运行该方法后它不会修改原始数组。我不确定它是否有问题,或者它是否按预期工作。有什么建议吗?

@Override
public Object[] toArray() {
    Object[] array = new Object[size];
    ArrayList <TreeNode<E>> list = new ArrayList<>();
    toArray(root, list);
    for (int i = 0; i < size; i++ ){
        array[i] = list.get(i);
    }
    return array;
}

protected void toArray(TreeNode<E> root, ArrayList <TreeNode<E>> array){
    if (root == null) return;
    toArray(root.left, array);
    array.add(root);
    toArray(root.right, array);
}

@Override
public <T> T[] toArray(T[] array) {
    if (size > array.length){
        array = (T[]) Array.newInstance(toArray()[0].getClass(), size);
    }
    if (size >= 0) System.arraycopy(toArray(), 0, array, 0, size);
    return array;
}

【问题讨论】:

  • 您希望修改哪个数组?
  • @MirekPluta 他似乎对按值传递和按引用传递感到困惑。

标签: java arrays generics binary-search-tree


【解决方案1】:

Java 永远不会用其他东西替换方法参数。

这正是该语言设计的工作方式。所以是的,它正在按应有的方式工作,即使可能不像您所期望的那样。

你基本上被你的“array = ...”行弄糊涂了。最好使用新名称创建一个数组,而不是尝试重用该名称。

这就是为什么很多人(包括我)强烈建议将所有方法参数声明为“final”的原因,因为编译器会提醒您注意它(除此之外它几乎没有作用)。

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2012-02-10
    • 2014-11-30
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多