[java] Java Collections가 Primitives 유형을 직접 저장할 수없는 이유는 무엇입니까?

Java 컬렉션은 기본 유형이 아닌 객체 만 저장합니다. 그러나 우리는 래퍼 클래스를 저장할 수 있습니다.

왜 이런 제약이 있습니까?



답변

그것은 자바 디자인 결정이었고 어떤 사람들은 실수로 생각하는 결정이었습니다. 컨테이너는 객체를 원하고 기본 요소는 객체에서 파생되지 않습니다.

이것은 .NET 디자이너가 JVM에서 배웠고 값 유형과 제네릭을 구현하여 많은 경우에 boxing이 제거 된 곳입니다. CLR에서 제네릭 컨테이너는 기본 컨테이너 구조의 일부로 값 형식을 저장할 수 있습니다.

Java는 JVM의 지원없이 컴파일러에서 일반 지원을 100 % 추가하기로 결정했습니다. JVM은 “비 개체”개체를 지원하지 않습니다. Java 제네릭을 사용하면 래퍼가없는 척할 수 있지만 여전히 권투의 성능 대가를 지불합니다. 이것은 특정 프로그램 클래스에 중요합니다.

권투는 기술적 인 타협이며 구현 세부 사항이 언어로 누출되는 것 같습니다. Autoboxing은 좋은 구문 설탕이지만 여전히 성능 저하입니다. 어떤 경우라도 컴파일러가 자동 상자에 경고를 표시하고 싶습니다. (내가 아는 한, 2010 년에이 답변을 썼습니다.)

권투에 대한 좋은 설명 : 왜 일부 언어에 Boxing과 Unboxing이 필요합니까?

그리고 자바 제네릭에 대한 비판 : 왜 일부는 자바의 제네릭 구현이 나쁘다고 주장 하는가?

자바의 방어에서는 뒤돌아보고 비판하기 쉽습니다. JVM은 오랜 세월의 시험을 견뎌 왔고 여러면에서 좋은 디자인입니다.


답변

구현을 더 쉽게 만듭니다. 자바 프리미티브는 객체로 간주되지 않으므로 이러한 각 프리미티브에 대해 별도의 컬렉션 클래스를 만들어야합니다 (공유 할 템플릿 코드 없음).

물론 GNU Trove , Apache Commons Primitives 또는 HPPC를 참조하십시오 .

정말 큰 컬렉션이 없다면, 래퍼에 대한 오버 헤드는 사람들이 관심을 가질만큼 충분히 중요하지 않습니다 (그리고 정말 큰 원시 컬렉션이있는 경우에는 특수 데이터 구조를 사용 / 구축하는 데 많은 노력을 기울일 수 있습니다. ).


답변

두 가지 사실의 조합입니다.

  • 자바 프리미티브 유형은 참조 유형이 아닙니다 (예 : an intis not an Object).
  • Java는 참조 유형의 유형 삭제를 사용하여 제네릭을 수행합니다 (예 : a List<?>는 실제로 List<Object>런타임에 있음).

이 두 가지 모두 사실이므로 일반 Java 컬렉션은 기본 유형을 직접 저장할 수 없습니다. 편의를 위해 기본 유형이 참조 유형으로 자동으로 boxing 될 수 있도록 autoboxing이 도입되었습니다. 하지만 실수하지 마십시오. 컬렉션은 여전히 ​​객체 참조를 저장하고 있습니다.

이것을 피할 수 있었습니까? 혹시.

  • 이 경우 int입니다 Object, 모든에서 상자 유형에 대한 필요가 없습니다.
  • 유형 삭제를 사용하여 제네릭을 수행하지 않으면 유형 매개 변수에 기본 형식을 사용할 수 있습니다.

답변

의 개념이 자동 복싱 및 자동 언 박싱은. 당신이 저장하려고 할 경우 intA의 List<Integer>자바 컴파일러는 자동으로 변환됩니다 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 기본 데이터 유형은 예를 들어 참조 유형이 아닙니다. int는 객체가 아닙니다.

극복하기:-

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