Warum können Java Collections Primitiventypen nicht direkt speichern?
Java collections nur Objekte speichern, nicht primitive Typen; jedoch können wir speichern Sie die wrapper-Klassen.
Warum diese Einschränkung?
InformationsquelleAutor der Frage JavaUser | 2010-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es wurde ein Java-design-Entscheidung, und eine, die einige betrachten einen Fehler. Behälter wollen, Objekten und primitiven nicht eine Ableitung von Object.
Dies ist ein Ort, dass .NET-Designer gelernt, von der JVM und umgesetzt werden value types und generics, so dass Boxen entfällt in vielen Fällen. In CLR, generische Container speichern können Wert-Typen, die als Teil der zugrunde liegenden container-Struktur.
Java entschieden, hinzufügen generic support 100% in den compiler ohne Unterstützung durch die JVM. Die JVM wird, was es ist, bietet keine Unterstützung für ein "non-object" - Objekt. Java generics ermöglichen es Ihnen, zu behaupten, es ist kein wrapper, aber Sie zahlen immer noch die Leistung-Preis-Boxen. Dies ist WICHTIG für bestimmte Klassen von Programmen.
Boxen ist ein technischer Kompromiss, und ich glaube, es ist von der Implementierung detail undicht in der Sprache. Autoboxing ist schön syntaktischer Zucker, aber ist immer noch ein performance-Einbußen. Wenn überhaupt, würde ich mag, dass der compiler warnen, wenn es autoboxes. (Ich weiß, kann es jetzt, schrieb ich diese Antwort in 2010).
Eine gute Erklärung, ALSO über das Boxen: Warum haben manche Sprachen benötigen, Boxing und Unboxing?
Und Kritik von Java generics: Warum tun manche behaupten, dass die Java-Implementierung von generics ist schlecht?
In der Java-Verteidigung, es ist leicht, um nach hinten zu schauen und zu kritisieren. Die JVM hat widerstanden den test der Zeit und ist ein gutes design in vielerlei Hinsicht.
InformationsquelleAutor der Antwort codenheim
Macht die Implementierung einfacher. Da Java-primitive sind nicht als Objekte betrachtet, würden Sie brauchen, um erstellen Sie eine separate collection-Klasse für jedes dieser primitive (keine template-code zu teilen).
Können Sie das tun, natürlich, nur sehen Sie GNU TroveApache Commons Primitives oder HPPC.
Es sei denn, Sie haben wirklich große Sammlungen, der Aufwand für den Wrapper egal, genug für die Menschen zu kümmern (und wenn Sie haben wirklich große, primitive, Sammlungen, möchten Sie vielleicht zu verbringen, die Mühe Blick auf die Verwendung/Aufbau einer spezialisierten Datenstruktur).
InformationsquelleAutor der Antwort Thilo
Es ist eine Kombination von zwei Tatsachen:
int
ist nicht einObject
)List<?>
ist wirklich einList<Object>
zur Laufzeit)Da beide wahr sind, generischen Java-collections können nicht speichern von primitiven Datentypen direkt. Für die Bequemlichkeit, autoboxing eingeführt, die primitive Typen werden automatisch boxed als Referenz-Typen. Machen Sie keinen Fehler über es, obwohl die Kollektionen sind immer noch die Speicherung von Objekt-Referenzen unabhängig.
Könnte dies vermieden worden? Vielleicht.
int
ist einObject
dann gibt es keine Notwendigkeit für eine box-Typen überhaupt.InformationsquelleAutor der Antwort polygenelubricants
Es ist das Konzept der auto-boxing und auto-unboxing. Wenn Sie versuchen, speichern Sie eine
int
imList<Integer>
der Java-compiler wird automatisch konvertieren Sie es zu einerInteger
.InformationsquelleAutor der Antwort Jeremy
Es ist nicht wirklich eine Einschränkung ist es?
Berücksichtigen, wenn Sie wollten, um eine Sammlung zu erstellen, dass die gespeicherten Grundwerte. Wie würden Sie schreiben, einer Sammlung speichern können, entweder int, oder float oder char? Wahrscheinlich werden Sie am Ende mit mehreren Sammlungen, so benötigen Sie eine intlist und eine charlist etc.
Unter Ausnutzung von Objekt-orientierten Natur von Java, wenn Sie schreiben, eine collection-Klasse, die es speichern kann, jedes Objekt, so benötigen Sie nur eine collection-Klasse. Diese Idee, Polymorphismus, ist sehr kraftvoll und stark vereinfacht die Gestaltung von Bibliotheken.
InformationsquelleAutor der Antwort Vincent Ramdhanie
Ich denke, vielleicht sehen wir Fortschritte, die in diesem Raum in der JDK-möglicherweise in Java 10, basierend auf dieser JEP - http://openjdk.java.net/jeps/218.
Wenn Sie möchten, um zu vermeiden, Boxen primitive in Sammlungen heute gibt es mehrere Drittanbieter-alternativen. Zusätzlich zu den zuvor genannten third-party-Optionen gibt es auch Eclipse-SammlungenFastUtil und Koloboke.
Einen Vergleich von primitiven maps wurde auch veröffentlicht eine Weile her, mit dem Titel: Große HashMap überblick: JDK, FastUtil, Goldman Sachs, HPPC, Koloboke, Fundgrube. Die GS Collections (Goldman Sachs) - Bibliothek migriert wurde der Eclipse Foundation und ist nun Eclipse Sammlungen.
InformationsquelleAutor der Antwort Donald Raab