Was ist die beste Methode, um ein String
in Long
(das Objekt) in Java zu konvertieren.
ODER
%Vor% Gibt es hier einen korrekten Weg, weil beide die gleiche Lesbarkeit zu haben scheinen und es akzeptabel ist, einen zusätzlichen Schritt von autoboxing
in der ersten Methode hinzuzufügen?
Sehen Sie sich die Rückgabetypen genau an:
Long.parseLong(String)
gibt ein primitives long
zurück, so dass in diesem Fall ein erneuter Box-Vorgang ausgeführt wird: Long a = Long.parseLong(str);
. new Long(String)
erstellt in jedem Fall ein neues Long
-Objekt. Also tu das nicht, aber wähle 3) Long.valueOf(String)
gibt ein Long
-Objekt zurück und gibt zwischengespeicherte Instanzen für bestimmte Werte zurück - wenn Sie also ein Long
benötigen, ist dies die bevorzugte Variante. Bei der Überprüfung der Quelle java.lang.Long
enthält der Cache die folgenden Werte (Sun JDK 1.8):
Der beste Ansatz ist Long.valueOf(str)
da es auf Long.valueOf(long)
angewiesen ist, das einen internen Cache verwendet, ist es effizienter, da es die zwischengespeicherten Instanzen von Long
, die von -128
zu 127
gehören, bei Bedarf wiederverwenden wird.
Gibt eine
Long
-Instanz zurück, die den angegebenen langen Wert darstellt. Wenn ein new Long-Instanz ist nicht erforderlich, sollte diese Methode im Allgemeinen sein wird vor dem KonstruktorLong(long)
verwendet, wie diese Methode ist wahrscheinlich deutlich bessere Raum - und Zeitleistung durch häufig angeforderte Werte zwischenspeichern. Beachten Sie, dass im Gegensatz zu den entsprechenden Methode in der Integer-Klasse ist diese Methode nicht erforderlich Werte innerhalb eines bestimmten Bereichs zwischenspeichern.
Im Allgemeinen empfiehlt es sich, die static
factory-Methode valueOf(str)
einer Wrapper-Klasse wie Integer
, Boolean
, Long
, ... zu verwenden, da die meisten Instanzen sie immer wiederverwenden Es ist möglich, dass sie hinsichtlich des Speicherbedarfs potenziell effizienter sind als die entsprechenden parse
-Methoden oder -Konstruktoren.
Auszug aus Effektives Java Item 1
geschrieben von Joshua Bloch :
Sie können häufig vermeiden, unnötige Objekte zu erstellen, indem Sie static verwenden Factory-Methoden (Punkt 1) im Gegensatz zu Konstruktoren auf unveränderlich Klassen, die beides bieten. Zum Beispiel die statische Factory-Methode
Boolean.valueOf(String)
ist fast immer vorzuziehen KonstruktorBoolean(String)
. Der Konstruktor erstellt ein neues Objekt jedes Mal, wenn es aufgerufen wird, während die statische Factory-Methode nie ist benötigt, um dies zu tun und wird nicht in der Praxis.
Ich würde vorschlagen, Long.parseLong
gegenüber jeder anderen Option zu verwenden, weil:
Long.valueOf
, Long(string)
, basiert auf der Long.parseLong
Methode, die als Kernmethode für jede String
to Long
Konvertierung dient. Long.parseLong
aufrufen wollen Long.valueOf
, wenn Ihr Objekt den Typ String
hat. (Verwenden Sie natürlich direkten Aufruf.) offizielle Dokumente und die Quellcode-Link (warum nicht Byte anstelle von Long verwenden, weil der Cache nicht jede Sekunde speichert Wert auch dieser Bereich gilt auch für Integers) Von offiziellen Dokumenten
%Vor%Long.valueOf
Rückgabe ein direktes Wrapper-Objekt, ohne das new Long
-Objekt zu erstellen, ist eine falsche Aussage, wie intern von Long.parseLong
verwendet wird (was a zurückgibt primitiv lang), wird die primitive Ausgabe von Long.parseLong
in Wrapper
object konvertiert, indem ein neues Objekt von Long
class erstellt wird. Sie möchten also direkt Boxing
verwenden oder Long.valueOf=>Long.parseLong=>new Long
aufrufen.
Ein wenig mehr über das Caching (wenn der Pass-Wert lang ist):
Cache ist wenig hilfreich, wenn Sie == für die Gleichheitsprüfung (wie interne Strings) mit dem Objekttyp verwenden möchten. Der lange Cache speichert nur ein statisches Array von Objekten, deren Wert zwischen -128 to 127
liegt. Wenn Ihre Zahl also außerhalb dieses Bereichs liegt, können Sie nicht == Operator für die Gleichheitsüberprüfung (Sie glauben nicht, versuchen Sie folgendes Beispiel)
Beispiel:
%Vor%Ausgabe:
%Vor% Versuchen Sie also, equals
für die Überprüfung der Gleichheit zu verwenden.
Warum Cache erforderlich ist : Da die Anzahl zwischen -128 und 127 einschließlich aus Gründen der Leistung von JLS (5.1.7) , so dass der Cache in diesem Fall nicht für die Effizienz von Zeit und Speicherplatz sorgt.
%Vor%Fazit:
Long.parseLong
. Wrapper
classes verwenden möchten. Aus dem Javadoc:
Erstellt ein neu zugewiesenes Long-Objekt, das den Long-Wert darstellt Wert, der vom String-Parameter angegeben wird. Die Zeichenfolge wird in a konvertiert long-Wert in genau der Weise, die von der parseLong-Methode für verwendet wird Radix 10.
Tags und Links java autoboxing