Bri*_*new 47
正如所指出的,Java有参考.这些有何不同?
所以它们不像C++引用(直接指向一个对象).也许一个更好的名字将被处理.
Edw*_*uck 38
Java没有指针; Java有参考.
这是一个很好的点,但指针有额外的操作,你可能(或可能不)通常使用; 引用缺少这些操作,因为操作可能不安全.
例如,如果使用指针索引数组的第一个元素,如下所示:
int squares[] = {1, 4, 9, 16, 25, 36, 49};
int* intPointer = squares;
Run Code Online (Sandbox Code Playgroud)
你可能想要取消引用指针并获得值"1",但你也可以:
intPointer++
Run Code Online (Sandbox Code Playgroud)
并且在您执行此操作后,当您取消引用指针时,您将获得值"4".一秒
intPointer++;
Run Code Online (Sandbox Code Playgroud)
将被取消引用时,将为您提供值"9".这是因为++操作将指针在内存中向前移动一个"单位".
问题来自于C/C++类型检查系统的缺点(C++必须与C保持兼容性,因此它允许相同的问题).指针在内存中存储一个地址,++操作将适当数量的字节添加到地址中.在许多系统上,使用int添加四个字节,但如果指针是一个char指针,那么它应该只添加一个字节.请注意,由于指针的基础数据类型是内存中的地址,因此以下内容是合法的(但不推荐):
char* charPointer = squares;
charPointer++;
void* voidPointer = squares;
voidPointer++;
Run Code Online (Sandbox Code Playgroud)
由于指针是内存中的地址,因此它们可能(正确地)表示计算机中的任何内存位,但只有当底层数据与指针的类型和对齐方式匹配时,它们才会被正确解除引用.对于不受大量代码管理以使其安全的指针,这意味着您可能会偏离所需信息的数据类型(或对齐),并且取消引用可能以灾难结束.尝试使用自定义代码修复此问题往往会导致一个指针严重减慢,以至于您发现性能问题,并且它为在自定义"指针管理"代码中添加错误打开了大门.
Java端通过返回引用来解决所有这些问题.引用不是指存储器中的任何位置; Java维护一个内部的"指针引用"表.此表获取引用并返回与其关联的数据,无论数据驻留在内存中的何处.这会减慢代码执行速度,因为每次"解除引用"都会进行两次查找,参考表中有一次查找,机器内存中有一次查找.
使用引用的Java的一大优点是可以移动内存而不会破坏可能的指针地址.在C程序中,如果将数据移动到新的存储器位置,则很难知道程序的其他部分是否具有指向数据的指针.如果在移动内存后取消引用陈旧指针,程序将访问损坏的数据,通常崩溃将是缺点.
能够在正在运行的程序中移动内存使程序可以轻松地回收内存.任何不需要内存块的程序都可以释放未使用的内存,但这会在使用过的内存块之间创建未使用内存的内存空洞.内部计算机使用非常大的内存页面.如果稀疏使用的存储器页面可能将少量使用的位移入另一页面,则可以释放一页存储器.这增加了数据到内存的密度,提高了缓存性能.有时,这可以转化为性能改进,这可能非常引人注目.
Java的垃圾收集器通过临时阻止对一组引用的数据访问来利用引用的优势.在访问阻塞期间,它会移动数据(压缩它).在阻塞之后,对地址表的引用具有新的存储器地址.由于代码的"功能"层首先不知道地址,因此该操作不会破坏正在运行的Java程序.
Syn*_*tic 13
Java在存储对数据的引用的变量意义上有指针.Java中Object类型的所有变量都是这个意义上的指针.
但是,Java语言不允许对指针值进行算术运算,就像你能用C语言那样.
new 做(大致)以下:
小智 5
java.lang.NullPointerException
人们在采访中告诉我“java没有指针”。我通常给他们一些 java 代码,让他们解释一下这段代码中发生了什么:
public class TestPointers {
public static void main(String args[]) {
Object p1, p2;
p1 = new Object();
p2 = p1;
p1 = null;
System.out.println(p2);
}
}
Run Code Online (Sandbox Code Playgroud)
Java确实有指针,它们以名称“引用”为人所知。
当人们说“Java 没有指针”时,他们通常会将指针的概念与 C 和 C 派生语言中的指针的特定实现和能力混淆。
特别是:
此外,与普遍的看法相反,指针不一定是地址。指针通常实现为地址,但没有要求这样做,即使在 C 或 C++ 中也没有。