2013-08-12 4 views
2

arrayList в Java «содержит» ссылки на объекты, а не на фактические данные объекта.Можем ли мы реализовать список стилей C++ в Java?

Мне было интересно, можно ли реализовать массивList в Java, который может содержать данные Object непосредственно вместо ссылок. Может ли Java Unsafe Class использоваться для этой реализации? Если да, какова будет производительность этого списка по сравнению с существующим массивом Java?

+5

Какая польза от этого получится? Местность кэша процессора в лучшем случае? –

+0

Да ЦП и, возможно, что-то еще, чего я не знаю. Вот почему я спрашиваю. – karakalos10

+2

Вы всегда можете просто использовать JNI список C++ для Java. Это может быть лучше, чем ваш подход, но если ваше приложение в основном Java, то это будет почти невидимым. –

ответ

3

Коротко, нет.

Java работает только со ссылками на объекты. То, что вы описываете, зависит от низкоуровневого управления распределением/использованием памяти, позволяющим выделить блок памяти для записей «n». Java просто не работает так - вы никогда не контролируете память, и JVM имеет право перемещать объекты в памяти. Вы только когда-либо дело со ссылками.

Обратите внимание, что объекты, содержащие ссылки, будут ссылаться на другие отдельные блоки памяти, поэтому понятие объекта, содержащегося в одном смежном блоке памяти, на самом деле не существует.

Если вам действительно нужен массив байтов, поддерживаемый памятью, может использоваться DirectByteBuffer. Это класс java.nio, построенный с использованием класса sun.misc.Unsafe. Возможно, вы могли бы сериализовать/десериализовать объекты (тщательно подсчитывая размер, чтобы правильно определить индексирование). Но стоимость сериализации замачивала бы любую другую экономию, я бы подозревал.

+0

Вы можете иметь низкоуровневое управление распределением памяти в Java, используя java Unsafe class. – karakalos10

+0

@Brian: Вы правы, и я собирался сказать что-то подобное. Но затем я посмотрел на sun.misc.Unsafe: http://mishadoff.github.io/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/ Это то, что используется для реализации низкоуровневые вещи, такие как буферы NIO. В теории_, возможно, что с этим можно сделать список стилей в стиле C++, но это, скорее всего, будет медленным и чрезвычайно запутанным взломом. И, как сказал Иисус Рамос, в этом нет никакого смысла. –

+0

Но почему вы думаете, что это будет медленным? Операции с низкой памятью в Java сразу преобразуются в код сборки, поскольку JVM обрабатывает их как внутренние операции. – karakalos10

Смежные вопросы