2016-02-09 4 views
0

Я пытался реализовать свой собственный класс ArrayList для образовательных целей, и когда мне нужно его выращивать, мне нужно скопировать содержимое старого маленького массива в новый более крупный.java как реализовать System.arraycopy() самостоятельно

Выполнение этого с помощью for loop очень неэффективно и потребует O(n) time в зависимости от размера массива, который нужно скопировать. К счастью, Java имеет функцию System.arraycopy(), которая, как я подозреваю, не использует for loop, но копирует весь массив сразу, уступая меньше времени.

Однако возможно ли, чтобы я сделал копии этих копий или это настолько глубоко похоронено, что только компилятор java может это сделать?

P.S Есть много функций, которые я не знаю, как реализовать и, кажется, работать с использованием магии System.out.println() например или сокетов.

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

+5

Я не думаю, что можно скопировать массив в O (1) раз. – shmosel

+1

Копирование массива будет по-прежнему зависеть от размера, так как байты необходимо перемещать, поэтому даже «System.arraycopy()» будет O (n) - возможно, только быстрее на какой-то фактор из-за отсутствующего цикла. Вопрос будет: если в образовательных целях производительность играет большую роль? – Thomas

+0

хорошо, а не O (1) раз, но по крайней мере эффективнее, чем цикл for –

ответ

0

В java.lang.System, вы можете увидеть объявление, но не исходный код:

public static native void arraycopy(Object src, int srcPos, 
            Object dest, int destPos, 
            int length); 

Это потому, что это нативный метод, реализованный в библиотеке, предоставленной JVM. Реализация может различаться между JVM, а ее двоичные файлы различаются между платформами, поскольку их необходимо скомпилировать для каждого.

Вы можете написать свои собственные родные библиотеки. Чтобы достичь нужного уровня оптимизации, вам нужно владеть языком более низкого уровня, таким как C или Assembler. С более высокими языками, вероятно, будет работать тот же барьер, что и на Java, поскольку вы обычно не имеете прямого доступа к памяти в них.

Недостатком написания собственной библиотеки является то, что ваше приложение больше не будет независимым от платформы, потому что в отличие от System, скомпилированная библиотека, необходимая для ее запуска, не включена в JVM.

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