In einer meiner Klassen habe ich ein Feld vom Typ Character
. Ich bevorzuge es über char
, weil manchmal das Feld "keinen Wert" hat und null
für mich der sauberste Weg ist, um diese (fehlende) Information darzustellen.
Ich frage mich jedoch, wie sich dieser Ansatz auswirkt. Ich habe es mit Hunderttausenden von Objekten zu tun, und der vernachlässigbare Unterschied zwischen den beiden Optionen verdient jetzt eine Untersuchung.
Meine erste Wette ist, dass ein char
zwei Bytes benötigt, während ein Character
ein Objekt ist, und daher viel mehr braucht, um seinen Lebenszyklus zu unterstützen. Aber ich weiß Boxed Primitiven wie Integer
, Character
und so weiter sind keine gewöhnlichen Klassen (Denken Sie über Boxen und Unboxing), also frage ich mich, ob die JVM eine Art von Optimierung unter der Haube machen kann.
Außerdem, sind Character
s Müll gesammelt wie die anderen Sachen oder haben einen anderen Lebenszyklus? Sind sie aus einem gemeinsamen Repository gepoolt? Ist dieser Standard oder JVM-Implementierung abhängig?
Ich konnte im Internet keine klaren Informationen zu diesem Problem finden. Können Sie mich auf einige Informationen hinweisen?
Wenn Sie Character
zum Erstellen von Zeichen verwenden, verwenden Sie lieber
Nachfolgend finden Sie einen Auszug aus javadoc.
Wenn keine neue Character-Instanz benötigt wird, sollte diese Methode
Character.valueOf()
im Allgemeinen vor dem KonstruktorCharacter(char)
verwendet werden, da diese Methode wahrscheinlich wesentlich bessere Raum- und Zeit-Performance bringt, indem häufig angeforderte Werte zwischengespeichert werden.
Wie Sie bereits gesagt haben, kann ein Character
-Objekt null
sein, also muss es mehr Platz im RAM haben als ein reguläres char
, das nicht null sein kann: in gewisser Weise ist Character
s eine Obermenge von char
s.
In einem bestimmten Teil Ihres Codes kann der JIT-Compiler jedoch feststellen, dass Sie Character
nie null ist und immer als reguläres char
verwendet wird, und optimieren Sie diesen Teil so, dass Ihr Character
verwendet nicht mehr RAM oder Ausführung ist nicht langsamer. Ich spekuliere gerade über diesen Punkt, aber ich weiß nicht, ob ein JIT tatsächlich diese präzise Optimierung durchführen kann.
Verwenden Sie stattdessen int
. Verwenden Sie -1
, um "no char" darzustellen.
Viele haben Vorrang vor diesem Muster, zum Beispiel int read() in java.io.Reader
Tags und Links java memory performance