Java Character vs char: Wie steht es um die Speichernutzung?

9

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?

    
gd1 22.03.2013, 09:38
quelle

3 Antworten

1

Wenn Sie Character zum Erstellen von Zeichen verwenden, verwenden Sie lieber

%Vor%

Nachfolgend finden Sie einen Auszug aus javadoc.

  

Wenn keine neue Character-Instanz benötigt wird, sollte diese Methode Character.valueOf() im Allgemeinen vor dem Konstruktor Character(char) verwendet werden, da diese Methode wahrscheinlich wesentlich bessere Raum- und Zeit-Performance bringt, indem häufig angeforderte Werte zwischengespeichert werden.

    
AmitG 22.03.2013, 09:48
quelle
0

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.

    
Fabien 22.03.2013 09:54
quelle
0

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

    
ZhongYu 22.03.2013 16:07
quelle

Tags und Links