IT story

Java Collections가 프리미티브 유형을 직접 저장할 수없는 이유는 무엇입니까?

hot-time 2020. 7. 26. 12:01
반응형

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 , FastUtilKoloboke도 있습니다.

기본 맵의 비교는 제목과 함께 얼마 전에 출판되었습니다 : Large HashMap 개요 : JDK, FastUtil, Goldman Sachs, HPPC, Koloboke, Trove . GS Collections (Goldman Sachs) 라이브러리는 Eclipse Foundation으로 마이그레이션되었으며 이제 Eclipse Collections입니다.


주된 이유는 자바 디자인 전략입니다. ++ 1) 컬렉션에는 조작을위한 객체가 필요하고 프리미티브는 객체에서 파생되지 않으므로 이것이 다른 이유 일 수 있습니다. 2) Java 프리미티브 데이터 유형은 ex에 대한 참조 유형이 아닙니다. int는 객체가 아닙니다.

극복하기:-

자동 복싱과 자동 언 박싱의 개념이 있습니다. 따라서 기본 데이터 유형을 저장하려고하면 컴파일러는 해당 기본 데이터 클래스의 객체로 자동 변환합니다.

참고 URL : https://stackoverflow.com/questions/2504959/why-can-java-collections-not-directly-store-primitives-types

반응형