2011-01-04 5 views
10

가능한 중복 :
storing primitive values in a java collection?Java 콜렉션. 원시 타입이없는 이유는 무엇입니까?

내 자바 교과서 컬렉션의 요소, 예를 들어 ArrayList를 들어, 기본 유형이 될 수 없습니다 말했다. 이것에 대한 이유가 있습니까? 나는 Sun의 누군가가 이것을 결정 했습니까, 아니면 그것을하는 것에 대한 장벽이 있습니까? 내 예제 반액 내 질문에 대한 내 질문 ArrayList 개체 및 원시 개체가 아닌 개체가 필요합니다 이해합니다. 그렇다면 왜 그들은 원시 타입을 가질 수없는 것일까?

답변

2

모든 기본 유형을 나타내는 "래퍼"라는 객체가 있습니다. 예를 들어 을 지원하는 Integer 클래스가 있습니다. 기본 래퍼를 사용하여 Collection에 값을 저장할 수 있습니다.

기본 유형 (적어도 Java 5까지)의 문제점은 기본 Object 클래스에서 확장되지 않았기 때문입니다. 모든 컬렉션은 사용하고있는 모든 메소드에 대해 클래스를 지정해야하며 Object이 모든 클래스의 기본이므로 Object을 지정합니다.

Java 5부터 Java는 원시와 필요할 때 래퍼 클래스를 암시 적으로 전환합니다. 즉, int 또는 double 등을 컬렉션에 추가 할 수 있습니다. VM은 자동으로 래퍼 클래스에 프리미티브를 래핑하여 래퍼를 Collection에 배치합니다.

+6

"원시 유형 (적어도 Java 5까지)의 문제점"... 이상 버전. 현재 자동 복싱이 있지만 기본 유형에 대한 공통 기본 클래스는 아직 없습니다. –

5

저장 미개봉 프리미티브 극적으로 컬렉션 코드를 복잡하게한다. 반면 래퍼 (은 int 등)는 코드가 상당히 간단합니다. 몇 년 동안 Java는 "자동 권투"를 지원했습니다. 즉, 에 Integer이 표시되면 intInteger 인스턴스에 래핑됩니다 (그 반대의 경우도 마찬가지입니다).

1

위키 백과에서이 기사를 읽으십시오. 그것은 도움이 될 수 있습니다 : 컴퓨터 과학에서 http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing

, 객체 유형 (일명 포장 객체)가처럼 보이게 아닌 객체 유형 을 래핑하는 객체 지향 프로그래밍에 사용되는 데이터 타입 입니다 동적 객체.

일부 객체 지향 프로그래밍 언어

이 참조 및 값 유형 사이에 구별을 자주 객체로 언급하고 복잡한 값 유형 이 존재하지 않는 경우 등 런타임 등의 이유로 플랫폼에서 비 객체 효율성과 구문 또는 의미 론적 문제. 예를 들어, 자바는 프리미티브 각 프리미티브 타입에 대응 래퍼 클래스 가지고 정수 및 INT, 문자 및 문자, 플로트와 플로트 참조 형 거의 또는 전혀 개념이 ++ C와 같은 기타 언어; 따라서, 오브젝트 유형의 사용은 거의 관심이 없습니다.

권투 개체 프리미티브는 참조 대상으로서 사용할 수 있도록 내에 기본 유형을 배치하는 공정이다. 예를 들어 목록 에는 배열 이 포함될 수없는 특정 방법이있을 수 있지만 목록의 경우 의 경우 해당 요소가 모두 동적 개체 여야합니다. 이 경우 목록의 추가 기능인 은 개의 간단한 배열에 대해 을 사용할 수 없습니다. 보다 구체적인 예를 들어, Java에서 의 경우 LinkedList는 크기를 변경할 수 있지만 배열의 크기는 으로 고정되어야합니다. int의 LinkedList를 원할 수 있지만 LinkedList 클래스는 동적 인 개체에 대한 참조 만 나열합니다. 즉, 값 유형 인 기본 유형을 나열 할 수 없습니다. 이것을 회피

는 int 치의 다이나믹 개체 정수로 박스형 다음 정수 LinkedList의 첨가 할 수있다. (J2SE 5.0 도입 일반 파라미터 유형을 사용하여,이 유형 LinkedList의로 표현된다.) 다른 한편, C#을 일반 객체 기준 복귀 어떠한 프리미티브 랩퍼 클래스가 없지만, 어떤 값 유형의 복싱을 허용한다.

박스형 객체는 항상 값 개체의 복사본이며, 일반적으로 불변입니다. 객체 언 박싱도 은 저장된 값의 복사본을 반환합니다. 은 동적으로 새 오브젝트를 할당하고 은 가비지 콜렉션에 적합하도록 만들기 때문에 오브젝트의 반복 된 복싱 및 박스 해제 은 성능에 큰 영향을 줄 수 있습니다.

7

그 일에 대한 몇 가지 장벽이있다?

ArrayList의 거의 동일한 버전을 작성하여 비 클래스 유형 중 하나를 저장하도록 맞춤형으로 만들 수 있습니다. IntegerArrayList 등등. 이것에 대한 장벽은, 원시 타입의 수에 콜렉션 타입의 수를 곱하는 것과 같은 클래스의 폭발이 있다는 것입니다. 표준 컬렉션 프레임 워크를 관리하기 쉽게 유지하기 위해 이것은 배제되었습니다.

이 문제를 좀 더 깔끔하게 해결하려면 원시 유형을 유형 매개 변수로 사용하고 배열과 제네릭 간의 상호 작용을 향상시킬 수 있도록 제네릭이 필요합니다.

0

성능 문제는 이것이 달성되기 위해 자동 권투가 필요하기 때문에 문제 중 하나입니다. 또한 일부 구조는 null 값을 갖는 것으로부터 이익을 얻을 수 있습니다.

1

현재 프리티브를 컬렉션에 직접 저장하는 유일한 방법은 각 프리미티브 유형에 대한 컬렉션을 갖는 것입니다. TIntArrayList.

ArrayList가 기본 요소를 사용하는 것보다 느리지 만 90 % 이상의 사용 사례에 충분히 빠르다는 것을 알 수 있습니다.

관련 문제