Java Collections가 프리미티브 유형을 직접 저장할 수없는 이유는 무엇입니까?
Java 콜렉션은 기본 유형이 아닌 오브젝트 만 저장합니다. 그러나 래퍼 클래스를 저장할 수 있습니다.
왜 이런 제약이 있습니까?
Java 디자인 결정이었고 일부는 실수로 간주했습니다. 컨테이너는 객체와 프리미티브가 객체에서 파생되지 않기를 원합니다.
이것은 .NET 디자이너가 JVM에서 배운 곳으로 많은 경우에 권투가 제거되도록 값 유형과 제네릭을 구현했습니다. CLR에서 일반 컨테이너는 기본 컨테이너 구조의 일부로 값 유형을 저장할 수 있습니다.
Java는 JVM의 지원없이 컴파일러에서 일반 지원을 100 % 추가하기로 선택했습니다. JVM은 "객체가 아닌"객체를 지원하지 않습니다. Java 제네릭을 사용하면 래퍼가없는 척할 수 있지만 여전히 권투 성능 가격을 지불해야합니다. 이것은 특정 클래스의 프로그램에 중요합니다.
복싱은 기술적 인 타협이며 구현 세부 사항이 언어로 유출되는 것 같습니다. 오토 박싱은 좋은 구문 설탕이지만 여전히 성능 저하입니다. 어떤 것이 든, 컴파일러가 오토 박스 때 경고 메시지를 표시하고 싶습니다. (내가 아는 한, 지금은 2010 년 에이 답변을 썼을 수도 있습니다).
권투에 대한 SO에 대한 좋은 설명 : 왜 어떤 언어는 권투와 Unboxing이 필요합니까?
Java generics에 대한 비판 : Java의 generics 구현이 잘못되었다고 주장하는 이유는 무엇입니까?
Java의 방어에서는 거꾸로보고 비판하기가 쉽습니다. JVM은 시간 테스트를 견뎌냈으며 여러 측면에서 좋은 디자인입니다.
구현이 더 쉬워집니다. Java 프리미티브는 오브젝트로 간주되지 않으므로 이러한 프리미티브 각각에 대해 별도의 콜렉션 클래스를 작성해야합니다 (공유 할 템플리트 코드 없음).
물론 GNU Trove , Apache Commons Primitives 또는 HPPC 만 참조하십시오 .
컬렉션이 너무 크지 않은 경우 래퍼에 대한 오버 헤드는 사람들이 돌보는 데 충분하지 않습니다 (실제로 큰 컬렉션이있는 경우 특수한 데이터 구조를 사용 / 구축하는 데 노력을 기울일 수 있습니다) ).
두 가지 사실의 조합입니다.
- 자바 기본 유형 (예가 유형을 참조하지
int
아니 어서Object
) - Java는 참조 유형의 유형 삭제를 사용하여 제네릭을 수행합니다 (예 :
List<?>
실제로는List<Object>
런타임에 있습니다)
이 두 가지 모두 사실이므로 일반 Java 콜렉션은 기본 유형을 직접 저장할 수 없습니다. 편의를 위해 기본 형식을 참조 형식으로 자동 상자에 넣을 수 있도록 자동 상자 기능이 도입되었습니다. 그럼에도 불구하고 컬렉션은 여전히 개체 참조를 저장하고 있습니다.
이것을 피할 수 있었습니까? 혹시.
- 이 경우
int
입니다Object
, 모든에서 상자 유형에 대한 필요가 없습니다. - 유형 삭제를 사용하여 제네릭을 수행하지 않으면 기본 매개 변수를 유형 매개 변수에 사용할 수 있습니다.
자동 박스 및 자동 박스 해제 의 개념이 있습니다 . Java 컴파일러 int
에 저장을 시도 List<Integer>
하면 Java 컴파일러가 자동으로로 변환합니다 Integer
.
그것은 실제로 제약이 아닌가?
기본 값을 저장 한 콜렉션을 작성하려는 경우 고려하십시오. int, float 또는 char을 저장할 수있는 컬렉션을 어떻게 작성 하시겠습니까? 아마 여러 컬렉션으로 끝날 것이므로 intlist와 charlist 등이 필요합니다.
콜렉션 클래스를 작성할 때 Java의 오브젝트 지향 특성을 활용하면 오브젝트를 저장할 수 있으므로 하나의 콜렉션 클래스 만 필요합니다. 이 다형성이라는 아이디어는 매우 강력하며 라이브러리 디자인을 크게 단순화합니다.
- 나는 우리가이 JEP에 따라 가능한 자바 (10)의 JDK에서이 공간에서 진행 상황을 볼 수 있습니다 생각 http://openjdk.java.net/jeps/218 .
오늘날 컬렉션에서 권투 프리미티브를 피하려면 여러 가지 타사 대안이 있습니다. 앞에서 언급 한 타사 옵션 외에도 Eclipse Collections , FastUtil 및 Koloboke도 있습니다.
기본 맵의 비교는 제목과 함께 얼마 전에 출판되었습니다 : Large HashMap 개요 : JDK, FastUtil, Goldman Sachs, HPPC, Koloboke, Trove . GS Collections (Goldman Sachs) 라이브러리는 Eclipse Foundation으로 마이그레이션되었으며 이제 Eclipse Collections입니다.
주된 이유는 자바 디자인 전략입니다. ++ 1) 컬렉션에는 조작을위한 객체가 필요하고 프리미티브는 객체에서 파생되지 않으므로 이것이 다른 이유 일 수 있습니다. 2) Java 프리미티브 데이터 유형은 ex에 대한 참조 유형이 아닙니다. int는 객체가 아닙니다.
극복하기:-
자동 복싱과 자동 언 박싱의 개념이 있습니다. 따라서 기본 데이터 유형을 저장하려고하면 컴파일러는 해당 기본 데이터 클래스의 객체로 자동 변환합니다.
'IT story' 카테고리의 다른 글
iOS 7 스타일 흐림보기 (0) | 2020.07.26 |
---|---|
소스에서 데비안 / 우분투 패키지를 빌드하는 방법? (0) | 2020.07.26 |
자바 제네릭 T vs Object (0) | 2020.07.26 |
의사 요소가 'img'요소와 작동하지 않는 이유는 무엇입니까? (0) | 2020.07.26 |
반응 / 리 독스 및 다국어 (국제화) 앱-아키텍처 (0) | 2020.07.26 |