我以为我在java方面很有经验,但似乎事实并非如此,我昨天注意到了一些事情,我以前用过的东西却从未真正意识到它的作用。我用谷歌搜索,但没有找到我的问题的答案。
如果我声明一个int数组,并使用Array的静态排序函数对我的数组进行排序,我只需要输入
Arrays.sort( numbers );
而不是
numbers = Array.sort( numbers );
在C和C ++中看起来很容易,因为你可以在那里使用指针。所以我想知道的是,这是怎么做到的?这是太阳的优势,还是我在这里完全没有意义?
答案 0 :(得分:7)
指针存在于java中 - 所有非原始变量都是java中的指针,也就是引用。
它不支持与C tho中的指针相同的操作集 - 它们对语言的用户基本上是不透明的。
Arrays.sort(array)
的工作原因是因为array
是一个“指针”,它允许sort()
函数访问array
变量指向的内存位置。
现在,为什么不:
void swap (Integer a, Integer b) {
Integer tmp = a;
a = b;
b = tmp;
}
如果你做了
Integer x = 1;
Integer y = 2;
swap(x,y);
它因为java传递值(这是一个与指针不同的概念)。指向1
的指针赋予swap()
,而不是变量x
的值(它是内存地址或指针)。因此,操纵swap()
中的参数不会影响变量x
。
答案 1 :(得分:5)
首先,它属于StackOverflow。其次,您想阅读文章Java is Pass-by-Value, Dammit!
答案 2 :(得分:4)
它就地对阵列进行排序。
sort
方法接收对number
数组(对象)的引用,并更改数组内的值!没有创建新的数组对象,因此将其传递给sort
函数就足够了。
PS: Java的所有源代码都是开放的,您可以自己去阅读sort
函数的来源。你会看到,没有魔法。如果在系统上正确安装了Java,则Java主文件夹中应该有src.zip
。
答案 3 :(得分:2)
我认为numbers
是一个int数组,Java中的所有数组都是对象。因此,sort
会传递对numbers
的引用,并且可以对它们进行排序。
答案 4 :(得分:2)
这个问题应该迁移到Stack Overflow。 Java有一个NullPointerException
类的事实应该会给你一个强有力的提示,告诉你Java是否使用了指向这些场景的指针。