문제

Java로 클래스를 생성하는 동안 나는 미리 알고 있는 인스턴스 수준 컬렉션을 생성하는 경우가 종종 매우 작습니다(컬렉션의 항목이 10개 미만).하지만 미리 항목 수를 모르기 때문에 일반적으로 동적 컬렉션(ArrayList, Vector 등)을 선택합니다.

class Foo
{
  ArrayList<Bar> bars = new ArrayList<Bar>(10);
}

이렇게 작은 크기에 복잡한 동적 컬렉션을 사용하는 것은 낭비라고 계속 잔소리하는 부분이 있습니다.이와 같은 것을 구현하는 더 좋은 방법이 있습니까?아니면 이것이 표준입니까?

참고로 저는 (눈에 띄는) 성능 저하나 그와 유사한 어떤 것에도 타격을 입지 않았습니다.일을 수행하는 더 좋은 방법이 없는지 궁금합니다.

도움이 되었습니까?

해결책

그만큼 ArrayList Java의 클래스에는 두 개의 데이터 멤버만 있습니다. Object[] 배열과 크기 - 배열을 사용하지 않는 경우 어쨌든 필요합니다. ArrayList.따라서 ArrayList 하나의 객체 할당을 저장하는 중인데, 이는 결코 큰 문제가 아닐 것입니다.

컨테이너 클래스의 수많은 인스턴스를 생성하고 폐기하는 경우(그리고 더 나아가 ArrayList 예) 매초마다 당신은 ~할 것 같다 가비지 수집 변동에 약간의 문제가 있지만 그런 일이 발생하면 걱정할 사항입니다.가비지 수집은 일반적으로 걱정거리가 가장 적습니다.

다른 팁

일을 단순하게 유지하기 위해 이것은 거의 문제가 되지 않는다고 생각합니다.귀하의 구현은 향후 요구 사항이 변경되더라도 리팩토링을 강요받지 않을 만큼 충분히 유연합니다.또한 작은 데이터 세트와 Java 컬렉션 API의 고품질을 고려하면 하이브리드 솔루션을 위해 코드에 더 많은 논리를 추가하는 것은 가치가 없습니다.

구글 컬렉션 불변/소수 요소에 최적화된 컬렉션이 있습니다.보다 Lists.asList API를 예로 들어보겠습니다.

오버헤드가 매우 작습니다.처음 몇 개의 항목에 대한 필드가 있는 하이브리드 배열 목록을 작성한 다음 더 긴 목록에 대한 배열을 사용하도록 대체할 수 있습니다.

배열을 사용하면 목록 개체의 오버헤드를 완전히 피할 수 있습니다.더 하드코어하게 진행하려면 필드를 객체로 선언하고 단일 항목에 대해 배열을 완전히 피할 수 있습니다.

메모리가 정말 문제라면 하위 수준에서 객체 인스턴스를 사용하는 것을 잊어버리고 싶을 수도 있습니다.대신 더 큰 세분성 수준에서 더 큰 데이터 구조를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top