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