Java中的指针

Nik*_*tel 8 java memory pointers

C++支持指针,而Java则不支持.但是当许多程序员质疑如何在没有指针的情况下工作时,发起人开始说"受限制的指针".所以我们可以说Java支持受限制的指针?

Joa*_*uer 38

这里的术语非常模糊.

Java支持它所谓的"引用".引用行为 很多像指针在C/C++ -喜欢的语言.他们不会采取同样的方式"引用",在这些语言的工作.

C中的指针与Java中的引用之间的主要区别是:

  • 你不能用Java做指针运算(即你不能从Java引用中"添加"或"减去",你只能取消引用它或将它与另一个进行比较).
  • 您不能将其转换为不兼容的类型:Java是强类型安全的,您不能将内存中的字节"重新解释"为其他对象.

对于指针的某些用途,这没有实际效果(例如链接列表在两种语言中的工作方式几乎相同),对于其他用途,差异非常大(C中的数组只是花哨的指针算术,在Java中它们的工作方式完全不同).

因此,在某种程度上,Java引用可以称为"受限指针".

维基百科将指针定义

...一种编程语言数据类型,其值直接指向(或"指向")另一个值

强调我的.根据这个严格的定义,Java没有指针.

更一般的引用是指针的超类,但也包含更多抽象的东西,如文件句柄甚至URL.

  • @ AlfP.Steinbach:OP显然要求理解从C++派生的指针,而不是Java语言规范.使用相同的单词并不意味着相同的概念正在发挥作用,特别是当涉及标准(易于行话重新定义)时. (6认同)
  • @DanielLyons:获得该值的更直接的方法是`System.identityHashCode()`,虽然它*可能*基于内存地址,但很可能不是,原因有两个:1.)它是32位长,在具有未压缩引用的64位VM中,它太少了.2)即使GC在内存中移动对象,它也不会在对象上发生变化. (5认同)

Pet*_*rey 7

Java和C/C++之间的另一个重要区别是引用是对象的索引.而在C/C++中,指针是内存中的地址.

在32位JVM中,它们是相同的,但是在64位JVM中它们不是.你会注意到这个区别是,对于小于32 GB的堆大小,引用仍然是32位(即使在64位JVM中)这是因为对象是在8字节边界上分配的,所以索引可以参考up至32 GB内存(4 G*8字节)

在64位C/C++程序中,指针需要能够引用每个字节,即使存储器分配在16字节边界上,因此它的大小为64位(从技术上讲,它应该可以使其为32-位小于4 GB的内存.)

智能指针需要两个底层指针(总共16个字节),但是,GCC,用于参考计数的最小分配大小为32个字节(然后您有指向该对象的尺寸)的总大小为32个字节每个指针+ 16个字节.在Java中每个引用的4个字节.(如果你有32+ GB的堆,则为8个字节)

总之,Java引用不必是实际地址,甚至不必是指针.它肯定比智能指针小得多.


Buh*_*ndi 5

首先,您需要了解"限制指针".维基百科摘录:

指针的一个主要问题是,只要它们可以作为数字直接操作,就可以使它们指向未使用的地址或用于其他目的的数据.许多语言,包括大多数函数式编程语言和最近的命令式语言(如Java),都用更不透明的引用类型替换指针,通常称为引用,它只能用于引用对象而不是作为数字操作,从而阻止了这种情况.错误类型.数组索引作为特殊情况处理.

这意味着在Java中,您无法添加或减少指针,因为内存管理由JVM本身完成.

Java采用了参考.引用具有类型,就像在C中一样,并且它们是类型安全的,因为这些引用不能被解释为原始地址,并且不允许不安全的转换.