Java에서 배열의 세그먼트를 반환하는 메소드를 찾고 있습니다. 예를 들어 바이트 배열의 4 번째 및 5 번째 바이트를 포함하는 바이트 배열을 얻는 것이 있습니다. 힙 메모리에 새로운 바이트 배열을 만들고 싶지는 않습니다. 현재 다음 코드가 있습니다.
doSomethingWithTwoBytes(byte[] twoByteArray);
void someMethod(byte[] bigArray)
{
byte[] x = {bigArray[4], bigArray[5]};
doSomethingWithTwoBytes(x);
}
doSomething(bigArray.getSubArray(4, 2))
예를 들어 4가 오프셋이고 2가 길이 인 곳을 수행하는 방법이 있는지 알고 싶습니다 .
답변
면책 조항 :이 답변은 질문의 제약 조건을 준수하지 않습니다 :
힙 메모리에 새로운 바이트 배열을 만들고 싶지는 않습니다.
( 솔직히, 내 대답은 삭제할 가치가 있다고 생각합니다. @ unique72의 대답은 정확합니다. Imma는이 편집 내용을 잠시 앉아서 다음 대답을 삭제합니다. )
추가 힙 할당없이 배열로 직접이 작업을 수행하는 방법을 모르지만 하위 목록 래퍼를 사용하는 다른 답변에는 래퍼에 대한 추가 할당이 있지만 배열은 아닙니다.이 경우에는 유용합니다. 큰 배열.
즉, 간결성을 찾고 있다면 유틸리티 방법 Arrays.copyOfRange()
이 Java 6 (2006 년 말?)에 도입되었습니다.
byte [] a = new byte [] {0, 1, 2, 3, 4, 5, 6, 7};
// get a[4], a[5]
byte [] subArray = Arrays.copyOfRange(a, 4, 6);
답변
Arrays.asList(myArray)
ArrayList(myArray)
배열을 복사하지 않고 참조를 저장하는 new에 위임합니다 . List.subList(start, end)
그 후에 사용 하면 a SubList
는 원래 목록을 참조합니다 (아직도 배열을 참조합니다). 배열이나 그 내용을 복사하거나 래퍼를 만들지 않고 관련된 모든 목록은 원래 배열로 백업됩니다. (더 무겁다 고 생각했습니다.)
답변
포인터 스타일의 앨리어싱 접근 방식을 찾고 있다면 공간을 할당하고 데이터를 복사 할 필요가 없으므로 운이 좋지 않다고 생각합니다.
System.arraycopy()
소스에서 대상으로 복사되며이 유틸리티의 효율성이 요구됩니다. 대상 배열을 할당해야합니다.
답변
한 가지 방법은에서 배열을 래핑하고 java.nio.ByteBuffer
절대 put / get 함수를 사용하고 하위 배열에서 작동하도록 버퍼를 슬라이스하는 것입니다.
예를 들어 :
doSomething(ByteBuffer twoBytes) {
byte b1 = twoBytes.get(0);
byte b2 = twoBytes.get(1);
...
}
void someMethod(byte[] bigArray) {
int offset = 4;
int length = 2;
doSomething(ByteBuffer.wrap(bigArray, offset, length).slice());
}
참고이 모두를 호출해야한다는 wrap()
하고 slice()
있기 때문에, wrap()
단지 상대 풋에 영향을 미치는 그 자체로 / 기능이 아닌 절대 사람을 얻는다.
ByteBuffer
이해하기가 약간 까다로울 수 있지만 대부분 효율적으로 구현되며 학습 가치가 있습니다.
답변
java.nio.Buffer를 사용하십시오. 다양한 기본 유형의 버퍼를위한 경량 래퍼이며 슬라이싱, 위치, 변환, 바이트 순서 등을 관리하는 데 도움이됩니다.
바이트가 스트림에서 시작된 경우 NIO 버퍼는 “직접 모드”를 사용하여 기본 자원이 지원하는 버퍼를 만듭니다. 이것은 많은 경우에 성능을 향상시킬 수 있습니다.
답변
ApacheUtils 에서 ArrayUtils.subarray 를 사용할 수 있습니다 . 완벽하지는 않지만 약간 직관적 인 System.arraycopy.
단점은 코드에 또 다른 의존성을 도입한다는 것입니다.
답변
subList 답변이 이미 여기에 있지만 사본이 아닌 실제 하위 목록임을 보여주는 코드가 있습니다.
public class SubListTest extends TestCase {
public void testSubarray() throws Exception {
Integer[] array = {1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(array);
List<Integer> subList = list.subList(2, 4);
assertEquals(2, subList.size());
assertEquals((Integer) 3, subList.get(0));
list.set(2, 7);
assertEquals((Integer) 7, subList.get(0));
}
}
그러나 배열로 직접 이것을 수행하는 좋은 방법이 없다고 생각합니다.