2016-12-03 3 views
0

개체 (# 0에서 9까지) 내에 10 개의 색인 된 참조가 있다고합시다. 그러나 그 중 2 개는 클래스의 특정 인스턴스에서 사용되지 않습니다 (예 : # 3 및 # 8). 여기 내 질문은 다음과 같습니다. 메모리와 성능면에서 가장 좋은 옵션은 다음과 같습니다. 길이가 10 인 참조 배열과 인덱스 3과 8에 null 값이 있거나 배열 8을 가리키는 int 배열과 결합 된 크기 8의 목록 그 목록에있는 색인의 색인?개체 배열 대 색인 배열

용액 1은 다음과 같을 것이다 : 용액 2 하다니

class SomeObject{ 
    OtherObject[] references = new OtherObject[10]; 
    { 
     for(int i = 0; i<10; i++){ 
      if(i != 3 && i != 8) 
       references[0] = new OtherObject(); 
      //otherwise just keep the null value 
     } 
    } 

    //then to use (here getting the toString() value) 
    String getStringOfObjectAtIndex(int index){ 
     //in real code we'd first check that index is within 0-9 
     if(references[index] != null) 
      return references[index].toString(); 
     else 
      return "";//no reference for that index 
    } 
} 

보다과 같이 될 것이다 :

class SomeObject{ 
    ArrayList<OtherObject> references = new ArrayList<>(0); 
    int[] pointers = new int[10]; 
    { 
     for(int i = 0; i<10; i++){ 
      if(i != 3 && i != 8){ 
       pointers[i] = references.size(); 
       references.add(new OtherObject()); 
      }else{ 
       pointers[i] = -1;//no reference available 
      } 
     } 
    } 

    //then to use (here getting the toString() value) 
    String getStringOfObjectAtIndex(int index){ 
     //in real code we'd first check that index is within 0-9 
     if(pointers[index] != -1) 
      return references.get(pointers[index]).toString(); 
     else 
      return "";//no reference for that index 
    } 
} 

TL; DR :는보다 어레이 내부 null 참조 크다 int?

답변

1

첫 번째 경우에는 참조 비용이 64 비트라고 가정 할 때 두 개의 null 참조를 저장하려면 128 비트가 필요하며 코드는 이해하기 쉽고 유지 관리하기 쉽습니다.

두 번째 경우에는 10 개의 정수 (즉, 10 * 32 비트와 배열 자체에 최소 16 바이트)가 추가로 필요하며 코드가 복잡합니다. ArrayList 자체에는 배열과 비교하여 추가 오버 헤드가 있으며 요소를 보유하기 위해 8보다 큰 배열이 포함됩니다.

어쨌든, 이것은 모든 악의 뿌리 인 조기 최적화와 매우 비슷합니다. 가장 간단하고 명확하며 가장 읽기 쉽고 유지 보수가 쉬운 솔루션을 사용하십시오. 그것은 충분히 빠를 수있는 좋은 기회를 가지며, 심지어 가장 빠르게 그리고 가장 낮은 기억이 될 기회를 가지고 있습니다.

매우 크고 매우 드문 배열이있는 경우 대체 전략이 유용 할 수 있습니다. 그러나이 경우 Map<Integer, OtherObject>을 사용하는 것이 더 간단 할 것입니다.