2016-06-08 7 views
3

나는 다음과 같은 인터페이스를 구현 byte s의 크기 조정 목록 객체 싶은 :Java : 크기를 조정할 수있는 프리미티브 목록으로 어떤 유형을 사용해야합니까?

  • 얻을 현재 크기
  • 명확한 목록 (제로로 크기를 재설정)
  • byte 추가를 끝
  • 인덱스에 의해 끝에서 모든 요소
  • GET 값 byte 제거
,745,

또한이 목록에는 21 개 이상의 요소가 필요하지 않습니다.

이 개체는 크기가 21 인 byte[]과배열로 구현되어있어 아직 채워지지 않은 다음 요소의 인덱스를 제공하며이를 사용하여 큰 성공을 거두었습니다.

이것은 간단한 구현처럼 보이지만 이미 이런 종류의 빌드 인 유형이 있습니까? 나는 그런 일에 대한 필요성이 극도로 뛰어나다 고 생각합니다. ArrayList<Byte>을 사용해 보았습니다.하지만 느린 속도가 느리고 런타임이 반복적으로 기하 급수적으로 늘어납니다. 나는 권투/unboxing 성능 손실로 고통 받고 있습니까? 크기를 조정할 수있는 프리미티브 목록으로 사용할 기본 제공 유형은 무엇입니까?

+2

의 커미터입니까? 첫 번째 네 절에 가장 적합한 옵션입니다. – Andrew

+2

@AndrewTobilko :'ArrayList '이 유즈 케이스에서 "매우 느린"경우'LinkedList '이 많을수록 더 좋아 보이지 않습니다. –

+0

변경하려는 동기는 무엇입니까? 당신의 시나리오에서 잘 작동하는 무언가가 있고'ArrayList '이 ...에 맞지 않는다는 것을 이미 알고 있다면? –

답변

2

외부 라이브러리가 허용되는 경우 HPPC (Java 용 고성능 기본 컬렉션)을 사용할 수 있습니다. 모든 Java 프리미티브의 목록, 세트 및 맵을 지원합니다.

이러한 요구 사항을 다룰 때 절충안을 작성해야합니다. 가장 많이 사용되는 작업을 찾아서이를 기반으로 지원 구조를 선택하는 것이 좋습니다.

+1

fastutil이 좋습니다. – leventov

0

표준 Java는 기본 유형에 대한 콜렉션을 제공하지 않습니다.

하지만 컴파일러는 자동 상자를 많이 사용합니다. 좋은 도우미 메서드가 있으므로 앞으로 byte[]에서 List<Byte>으로가는 것은 아마도 많은 작업이되지 않을 것입니다. 코딩 방법은입니다.

그러나 이러한 코드를 사용하면 큰 문제가 발생합니다. 성능 비용이 발생합니다. 그러나 이러한 일반적인 수준에서 그것에 대해 이야기함으로써 평가할 수는 없습니다.

짧은 이야기 : 귀하의 환경이 권장 타사 라이브러리 중 하나를 사용하도록 허락한다면 ... 그냥 사용해보십시오. 그들에게 보여 - (당신이 주변에 일부 날카로운 눈 동료가있는 경우

가) 광범위한 검토에 의해

또는

B)를 프로파일 링 : 그렇지 않으면, 당신은 당신의 CPU 사이클이 어디에서 오는지 이해해야 귀하의 코드를 누른 다음 (un) 권투가 발생 장소를 파악하려고하고 그것을 피하는 방법)

"내부 검토"당신을 위해 작동하지 않는 경우, 당신은 전환 할 수 있습니다 codereview.stackexchange.com

1

다른 사람들이 이미 말했듯이 표준 자바는 프리미티브 컬렉션을 지원합니다.타사 라이브러리를 열어 둔 경우 Eclipse CollectionsMutableByteList은 지정한 요구 사항 목록을 지원합니다.

MutableByteList byteList = ByteLists.mutable.empty(); 
Assert.assertEquals(0, byteList.size()); 
byteList.add((byte) 1); 
byteList.add((byte) 2); 
byteList.add((byte) 3); 
Assert.assertEquals(3, byteList.size()); 
byteList.removeAtIndex(2); 
Assert.assertEquals(
    ByteLists.mutable.with((byte) 1, (byte) 2), byteList); 
byteList.addAtIndex(2, (byte) 3); 
Assert.assertEquals(
    ByteLists.mutable.with((byte) 1, (byte) 2, (byte) 3), byteList); 
Assert.assertTrue((byte) 2 == byteList.get(1)); 
byteList.clear(); 
Assert.assertEquals(0, byteList.size()); 

참고 : 나는 이클립스 컬렉션 무엇`LinkedList의 `에 대한