Java ссылки всегда указывают на объект. У объекта есть заголовок, который, помимо прочего, идентифицирует конкретный тип (поэтому приведение может завершиться с ошибкой ClassCastException
). Для массивов начало объекта также включает в себя длину, после чего данные следуют сразу же после того, как в памяти (технически реализация свободна делать то, что ей нравится, но было бы глупо делать что-либо еще). Таким образом, вы не можете иметь ссылку, которая указывает где-то в массив.
В C указатели указывают куда угодно и на что угодно, и вы можете указывать на середину массива. Но вы не можете безопасно разыграть или узнать, как долго массив. В D указатель содержит смещение в блоке памяти и длину (или эквивалентно указатель на конец, я не могу вспомнить, что на самом деле делает реализация). Это позволяет D нарезать массивы. В C ++ у вас было бы два итератора, указывающих на начало и конец, но C ++ немного странный, как этот.
Так что возвращаясь к Java, нет, вы не можете. Как уже упоминалось, NIO ByteBuffer
позволяет вам обернуть массив, а затем разрезать его, но дает неудобный интерфейс. Вы можете, конечно, копировать, что, вероятно, намного быстрее, чем вы думаете. Вы могли бы представить собственную String
-подобную абстракцию, которая позволяет нарезать массив (текущая реализация Sun String
имеет ссылку char[]
плюс начальное смещение и длину, а реализация с более высокой производительностью просто имеет char[]
) , byte[]
- это низкий уровень, но любая основанная на классах абстракция, которую вы надеваете, будет сильно портить синтаксис до JDK7 (возможно).