Указатели на Java - PullRequest
       3

Указатели на Java

8 голосов
/ 20 сентября 2011

C ++ поддерживает указатели, а Java - нет.Но когда многие программисты спросили, как можно работать без указателей, промоутеры начали говорить «Ограниченные указатели». Таким образом, мы можем сказать, что Java поддерживает ограниченные указатели?

Ответы [ 9 ]

38 голосов
/ 20 сентября 2011

Терминология здесь довольно размыта.

Java поддерживает то, что называется "ссылками".Ссылки действуют очень как указатели в C / C ++ - как языки.Они не действуют так же, как "ссылки" работают на этих языках.

Основные различия между указателем в C и ссылкой в ​​Java:

  • Вы не можете делать арифметику указателей в Java (то есть вы не можете «добавлять» или «вычитать» из ссылки Java, вы можете только разыменовать его или сравнивать сеще один).
  • Вы не можете привести его к несовместимому типу: Java является строго типобезопасным, вы не можете «интерпретировать» байты в памяти как некоторый другой объект.

Для некоторых применений указателей это не имеет никакого реального эффекта (например, связанные списки работают почти одинаково на обоих языках), для других разница довольно значительна (массивы в C просто причудливыарифметика указателей, в Java они работают совершенно по-разному).

Таким образом, ссылки на Java можно было бы назвать «ограниченными указателями».

Википедия определяет указатель как

... тип данных языка программирования, значение которогоотносится напрямую к (или "указывает на") другому значению

Подчеркните мое.Согласно этому строгому определению , Java не имеет указателей.

Более общая ссылка является суперклассом указателей, но также противоречит более абстрактным вещам, таким как дескрипторы файловили даже URL.

7 голосов
/ 20 сентября 2011

Другое важное различие между Java и C / C ++ состоит в том, что ссылки являются индексом объекта. Тогда как в C / C ++ указатель является адресом в памяти.

В 32-разрядной JVM это одно и то же, однако в 64-разрядной JVM это не так. Вы заметите, что это различие заключается в том, что для размеров кучи менее 32 ГБ ссылки по-прежнему 32-разрядные (даже в 64-разрядной JVM). Это связано с тем, что объекты размещаются на 8-байтовой границе, поэтому индекс может ссылаться на до 32 ГБ памяти (4 ГБ * 8 байт)

В 64-битных программах на C / C ++ указатель должен иметь возможность ссылаться на каждый байт, даже если выделение памяти находится на границе 16 байт, и поэтому он имеет размер 64 бита (технически это должно быть возможно сделать 32-битная память менее 4 ГБ.)

A интеллектуальный указатель требуется два базовых указателя (всего 16 байт), но на gcc минимальный размер выделения для счетчика ссылок составляет 32 байта (и тогда у вас есть размер объекта, который вы указать на) Общий размер составляет 32 байта + 16 байтов на указатель. c.f. 4 байта на ссылку в Java. (8 байт, если у вас 32+ ГБ кучи)

Таким образом, ссылка на Java не обязательно должна быть реальным адресом или даже иметь такой же размер, как указатель. Это, конечно, намного меньше, чем умный указатель.

5 голосов
/ 20 сентября 2011

Во-первых, вам нужно понять «ограниченные указатели». Выдержка из Википедии :

Одна из основных проблем с указателями заключается в том, что пока они непосредственно манипулировать как число, они могут быть сделаны, чтобы указать на неиспользованные адреса или данные, которые используются для других целей. Много языки, включая большинство функциональных языков программирования и последние императивные языки, такие как Java, заменяют указатели на более непрозрачные тип ссылки, обычно называемый просто ссылкой, которая может использоваться только для ссылки на объекты, а не манипулировать как числа, предотвращая этот тип ошибки. Индексирование массива обрабатывается как особый случай.

Это означает, что в Java вы не можете добавлять или вычитать указатель, поскольку управление памятью осуществляется самой JVM.

Ява принята ссылка . Ссылки имеют типы, как и в C, и они безопасны от типов, поскольку эти ссылки не могут быть интерпретированы как необработанный адрес и небезопасное преобразование не допускается.

3 голосов
/ 20 сентября 2011

Когда люди говорят, что Java не поддерживает указатели, они практикуют пики новостей.То, что Java называет ссылками, точно соответствует тому, что всегда было известно как указатели в прошлом.

То, что Java не поддерживает, - это арифметика указателей.Что является чем-то совершенно другим;насколько я знаю, C и его потомки - единственные типизированные языки, которые поддерживают арифметику указателей.Например, в Pascal и Modula-2 есть «указатели», описанные как указатели в их спецификациях, но эти указатели имеют семантику, гораздо более близкую к семантической ссылке;они не допускают арифметику указателей.

2 голосов
/ 23 января 2018

Java на самом деле имеет математику указателя. Это приходит с sun.misc. Небезопасно. Однако вы должны сами управлять памятью - будьте осторожны.

1 голос
/ 20 сентября 2011

В спецификации языка Java есть что сказать по этому поводу:

Спецификация языка Java § 4.3.3
Ссылочные значения (часто просто ссылки) являются указателями на эти объекты и специальной нулевой ссылкой, которая не ссылается на объект.

Для тех, кто боится углубляться в документациюприсутствие, например, Java NullPointerException должно быть четким признаком того, что в Java есть указатели.

Короче говоря, вопрос бессмыслен, поскольку он основан на совершенно неверном предположении о том, что, цитируя OP, «Javaне указатели »- как доказано выше, это технически ерунда.

См. также Ответ Джеймса Канзе .

Этот ответ лучше всего рассматривать как предоставление необходимых ссылок.на ответ Джеймса.

Приветствия & hth.

1 голос
/ 20 сентября 2011

Позвольте мне быть кислотным: у Java нет указателей, потому что дизайнеры решили называть их по-другому.Фактически они переместили все в кучу так, чтобы все управлялось указателем, а затем, поскольку прямой ссылки больше не существовало, отменили «.»и переименован в "->" как "."

1 голос
/ 20 сентября 2011

В Java есть указатели. Вот почему он имеет исключение NullPointerException. У него просто нет указательной математики. Любая ссылка на объект на самом деле является указателем, поэтому он может быть нулевым. Тем не менее, существует множество полезных языков программирования, в которых нет указателей, поэтому любой, кто считает, что указатели необходимы для программирования, имеет очень узкое представление о языках программирования.

0 голосов
/ 30 декабря 2011

Указатели - просто способ сделать изменчивое возвращение.Они не очень важны для эффективной работы.Это проще в использовании, и вы можете понять код лучше, чем с указателями.В большинстве исходных кодов на c я вижу больше & / * / ->, чем другие вещи, и вы когда-нибудь смотрели, нужно ли вам это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...