2013-01-09 26 views
6

Ich muss viele String-Objekte im Speicher halten (Hunderte von MB) und ich möchte sie im UTF-8-Format halten, da in den meisten Fällen die Hälfte der Speicher die Standardimplementierung erfordert benutzen.
Die Standard-String-Klasse erfordert für eine Zeichenfolge mit 12 Zeichen 60 Byte (siehe http://blog.griddynamics.com/2010/01/java-tricks-reducing-memory-consumption.html).
Die meisten meiner Strings sind 10-20 Zeichen lang.
Ich frage mich, ob es eine Open-Source-Bibliothek gibt, die einen Wrapper für solche Strings bietet?
Ich kann String in UTF-8-Byte-Array konvertieren, aber ich bin auf der Suche nach einer Wrapper-Klasse, die alle erforderlichen Dienstfunktionen (Hash, Equal, ToString, fromString, usw.) zur Verfügung stellt.UTF-8 String-Klasse für Java

+2

http://docs.oracle.com/javase/tutorial/i18n/text/string.html – Doorknob

+2

Java speichert alle Zeichenfolgen intern in UTF-16, so dass Sie 12 Zeichenfolgen intern 24 Byte enthalten. Ohne den obligatorischen Objektaufwand, woher kommt diese 60-Byte-Zahl? – fge

+0

... mindestens 24 Bytes, da UTF-Kodierungen variable Länge haben (vorausgesetzt, Sie müssten einige sehr exotische Zeichen verwenden, um 24 Bytes im OP-Beispiel zu überschreiten) –

Antwort

2

Apache Avro hat ein UTF8 wrapper class die CharSequence implementiert, aber ich weiß nicht, den Speicherverbrauch solcher Objekte

Hadoop hat die Text class, die ganz die Art der Schnittstelle hat Sie

+0

hast du gemeint, beide Links gleich zu machen? – AgilePro

+0

nein, ganz sicher :-) Ich habe die Korrektur gemacht – Grooveek

0

wünschen Wenn Sie ein möchten distinct-Objekt für jeden String und Sie wollen sie so kompakt wie möglich, dann verwenden Sie Byte-Arrays. Das ist 1 Byte pro Zeichen gegenüber 2, und Sie haben nicht den Overhead des String-Headers (der wahrscheinlich 32 Bytes pro Objekt hinzufügt).

Aber natürlich könnten Sie keine String-Methoden verwenden, ohne zuerst in String zu konvertieren.

Aber wenn Sie wirklich Platz sparen möchten, speichern Sie die Zeichenfolgen Rücken an Rücken in einigen größeren Arrays mit "Dope-Vektoren", um die einzelnen Zeichenfolgen zu finden.