Frage

Eigentlich hier ist ein ähnliches Thema mit wenig praktischen Wert. Soweit ich verstehe, Primitiven eine bessere Leistung und sollte überall außer in den Fällen verwendet werden, in dem objektbezogene Merkmale (z null Prüfung) erforderlich sind. Richtig?

War es hilfreich?

Lösung

Sie nicht vergessen, dass da eine neue Wrapper für jeden Boxen Auftreten schaffen, ist ziemlich teuer, besonders wenn man bedenkt es in einem einzelnen Bereich in der Regel ein Verfahren verwendet wird, Autoboxing verwendet einen Pool von gemeinsamen Wrapper.

Dies ist in der Tat eine Implementierung des Fliegengewicht Entwurfsmuster . Wenn eine Box für einen bekannten Wert auftritt, anstatt eine neue Wrapper-Instanz zu schaffen, eine bereits erstellten Instanz aus einem Pool geholt und zurückgeführt.

Eine Folge davon ist: es ist immer noch nicht empfohlen für wissenschaftliche Berechnungen zu verwenden Autoboxing . Zum Beispiel, der Code = d a * b + c wird unter Verwendung von Integer-Klassen für a, b, c und d, und der erzeugte Code ist d.valueOf (a.intValue () * b.intValue () + c.intValue ( )). All diese Verfahren Anrufungen ihren eigenen Kopf hat, so es wird in der Regel empfohlen, Autoboxing zu verwenden, wenn zum Speichern von Primitiven in einer Sammlung erforderlich .

Und selbst dann, wenn Sie eine riesige Sammlung haben von Integer Verpackung int, der Overhead kann impliziert längere Laufzeiten, bis zu 20-mal länger , wie in diesem Artikel berichtet.


Jb fügt diese wichtige Bemerkung:

  

Auch Wrapper.valueOf (primitive) verwendet Pool von Wrapper. So bevorzugen Integer.valueOf (5) in new Integer (5)

Andere Tipps

Primitives schneller sind, wenn sie verwendet , als Objekte müssen vor dem Gebrauch werden unboxed; so gibt es einen zusätzlichen Schritt für den VM auszuführen. Zum Beispiel, um die Arithmetik auf einer Integer auszuführen, muss es zuerst in einen int umgewandelt werden, bevor die Arithmetik durchgeführt werden kann.

In vielen Geschäftsanwendungen ist dies wahrscheinlich zählt selten. Aber wenn Sie etwas zu schreiben, waren sehr numnber-Knirschen schwer wie, sagen wir, einen Grafikprozessor Transformation Sie viel eher zu sorgen.

ja, Primitive ist schneller als Objekte. Seit 5 Java können Sie sogar Primitiven und Objekte mischen, ohne manuell einem zum anderen zu konvertieren. Der Autoboxing Mechanismus kümmert sich nur das.

Dies bedeutet, dass, wenn Sie ein primitive in einer Sammlung zu setzen, werden nicht die Compiler beschweren, und wandeln die primitiven zu einem Objekt implizit.

Wenn Sie speichern Primitiven in einer Sammlung benötigen Sie verwenden commons-Primitiven .

Ich ziehe mit Primitive Wrapper, einzigen Ort, der absolut Wrapper Entitätsklassen sind haben muss. Datenbanken unterstützen nulls, so Entitäten sollten auch.

Ich habe einmal auf Projekt, das Primitive verwendet (und Homebrew ORM) in den Datenbankzugriff:

 class Foo{
    int xxx = -1;
 ...
 }

Und dann Sie hatte:

 void persist(Foo foo){
     ...
     statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX());
     ...
}

Gott es war böse.

Ich würde sagen, Sie über die Verwendung von Primitiven über Wrapper besorgt werden sollen nur, wenn Sie Ihre Anwendung profilieren und sehen, dass das Autoboxing eine Leistung oder Speicherproblem ist. Nach meiner Erfahrung Speicher wird ein Problem vor CPU-Zyklen, wenn es um Primitive vs Wickeln Objekte zu sprechen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top