2017-12-03 2 views
2

첫 번째 버전은 다음과 같습니다이 두 가지 Java 데이터 구조의 차이점은 무엇입니까?

int[] a = new int[1000]; 
int[] b = new int[1000]; 

번째 버전은 다음과 같습니다

class Helper{ 
    int a; 
    int b; 
} 
Helper[] c = new Helper[1000]; 

내 직감이 두 번째가 더 낫다고 하더군요,하지만 난 이유는 자신을 설득 할 수 .... 수 누구나 나를 위해이 두 구조의 시간 복잡성과 공간 복잡성을 비교할 수 있습니다. 예를 들어,이 두 버전의 비용은 같은 공간입니까? 아니면 두 번째 비용은 더 쌉니까? 감사합니다. 당신이 요청해야

+1

빠른 답변 : Google "병렬 배열 대 구조". 그게 당신에게 여러 가지 걸릴거야. –

+0

더 많은 컨텍스트가 없으면 두 번째가 더 나은지 확실하게 말할 수 없습니다. 개념적으로 얼마나 관련이 있는지에 달려 있습니다. – Carcigenicate

+0

두 옵션을 모두 사용하여 도우미를 'aa' 속성별로 정렬 해보십시오. –

답변

4

진짜 문제는 aa[i]bb[i] 사이의 관계입니다 것입니다. aa[i]bb[i]가 같은 개체의 속성 (즉, "도우미"보다 더 의미있는 설명이) 있다면, 당신은 확실히 대신 여러 원시적 배열을 사용하는 몇 가지 클래스에 넣어해야합니다. 결국 Java는 객체 지향 언어입니다.

당신은 성능 차이에 대해 신경 안된다. 그것들은 중요하지 않습니다. 중요한 것은 코드를 읽는 사람에게 코드를 적용하는 것입니다. , 둘다 잘하지만

+0

또한 'List'가 배열보다 선호되어야합니다. 'Arrays.asList'는 그 변환을 쉽게 만듭니다. – 4castle

+2

@ 4castle 그것은 유스 케이스에 달려있다. OP에 크기가 미리 알려진 고정 크기 컨테이너가 필요한 경우 배열이 List보다 효율적입니다. – Eran

+0

'Arrays.asList'는 같은 배열에 대한 참조를 저장하는 래퍼'List' 구현을 반환합니다. 여전히 고정 크기입니다. – 4castle

1

, 나는 몇 가지 더 많은 포인트를 추가합니다.

물론 성능에 대해 신경 쓰지 않을 가능성이 있습니다. 범용 애플리케이션에서는 그 차이가 매우 미미합니다. 가독성이란 무엇입니까.

아직도, 기술적 인 세부 사항의 측면에서 :

공간의 복잡성은 (항상 당신이 가지고있는 많은 요소의) 동일하지만 바이트의 절대 값이 다릅니다. 쌍

배열은 당신에게 더 많은 비용을 부담해야 - 각 자바 객체는 여러 바이트의 오버 헤드를 가지고있다. 배열이 두 개인 경우 각 배열 당 오버 헤드가 몇 바이트에 불과합니다.

두 배열의 경우 각 배열의 값은 메모리에서 서로 옆에 있습니다. 이러한 배열 중 하나의 모든 값을 읽으면 CPU 캐시와 메모리 레이아웃 측면에서 더 효과적입니다. 객체 배열의 경우에는 해당 객체에 대한 링크 배열이 있으므로 필드의 실제 값에 액세스하려면 객체의 주소를 먼저 읽어야합니다. 당신은 무슨 일이 일어나고 있는지의 느낌을 얻을 수 있도록

이는 일반 점이다. 실제로 그것은 그것들이 어떻게 그러한 구조로 작업하기를 원하는지에 달려 있습니다.