我正在研究我的讲师给我的几个课程,我无法理解函数heapRebuild
是如何被使用的!它不会改变任何全局变量,也不会打印任何广告,它不会返回任何内容 - 所以这甚至可以工作吗?不应该,不应该吗?
如果您被告知要使用heapRebuild
制作新功能removeMac
,您会修改heapRebuild
吗?
public class MaxHeap<T extends Comparable<T>> implements Heap<T>{
private T[] heap;
private int lastIndex;
public T removeMax(){
T rootItem = heap[0];
heap[0] = heap[lastIndex-1];
lastIndex--;
heapRebuild(heap, 0, lastIndex);
return rootItem;
}
protected void heapRebuild(T[ ] items, int root, int size){
int child = 2*root+1;
if( child < size){
int rightChild = child+1;
if ((rightChild < size) &&
(items[rightChild].compareTo(items[child]) > 0)){
child = rightChild;
}
if (items[root].compareTo(items[child]) < 0){
T temp = items[root];
items[root] = items[child];
items[child] = temp;
heapRebuild(items, child, size);}
}
}
}
答案 0 :(得分:3)
Java是一种按值传递的OO语言。这些方法可以改变传入的可变值。
简化示例:
import java.util.Arrays;
public class Test {
public static void main(String... args) {
String[] strings = new String[] { "foo", "bar" };
System.out.println(Arrays.toString(strings)); // [foo, bar]
changeValue(strings);
System.out.println(Arrays.toString(strings)); // [foo, foo]
}
public static void changeValue(String[] strings) {
strings[1] = "foo";
}
}
答案 1 :(得分:3)
T temp = items[root];
items[root] = items[child];
items[child] = temp;
这些行交换items
中的两个条目,索引root
和索引child
中的两个条目。 heapRebuild()
的每次调用都使用相同的items
数组,而不是数组的副本,因此调用者确实可以看到这些更改。
答案 2 :(得分:3)
它修改了items
数组。
当您将对象传递给Java中的函数时,它不会创建该对象的单独副本。
因此,当您的heapRebuild
函数修改items
数组时,它会修改传递给它的原始数组。
请注意,Java不会传递对变量的引用,因此如果函数写入items = whatever
,则调用者的数组仍将引用旧的数组实例。
答案 3 :(得分:1)
谁说它什么都没做。它修改传递的值,即T []项。
答案 4 :(得分:0)
该方法正在修改传入的数组。在java中,这是通过引用传递的。更多详情here。
答案 5 :(得分:0)
该方法更改其T[ ] items
参数内容的顺序。在Java中,通过复制引用的值来传递引用类型(包括数组)的方法参数。该方法可以对引用所引用的对象进行任何更改。