Korrekte Art, String in Java in Long zu konvertieren [duplizieren]

7

Was ist die beste Methode, um ein String in Long (das Objekt) in Java zu konvertieren.

%Vor%

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?

    
Humus 29.09.2016, 14:57
quelle

5 Antworten

12

Sehen Sie sich die Rückgabetypen genau an:

  1. 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); .
  2. new Long(String) erstellt in jedem Fall ein neues Long -Objekt. Also tu das nicht, aber wähle 3)
  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):

%Vor%     
qqilihq 29.09.2016, 15:01
quelle
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 Konstruktor Long(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   Konstruktor Boolean(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.

    
Nicolas Filotto 29.09.2016 15:01
quelle
2

Ich würde vorschlagen, Long.parseLong gegenüber jeder anderen Option zu verwenden, weil:

  • Jede andere Funktion, d. h. Long.valueOf , Long(string) , basiert auf der Long.parseLong Methode, die als Kernmethode für jede String to Long Konvertierung dient.
  • Wie beim Caching funktioniert das, wenn Ihre Eingabe nur zwischen -128 bis 127 liegt (siehe Beispiel unten), also liegt es an dem Coder, den Sie direkt oder durch 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%
  • Über 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:

  • Verwenden Sie Long.parseLong .
  • Muss bei der Arbeit mit Wrapper -Klassen gleich sein.
  • Cache für Java-Mechanismus funktioniert nur, wenn Sie Zahlen zwischen -128 bis 127 mit Wrapper classes verwenden möchten.
Pavneet_Singh 29.09.2016 17:04
quelle
1

Aus dem Quellcode:

%Vor%

Falls Sie nicht glauben:

    
xenteros 29.09.2016 15:00
quelle
0

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.

    
Wojciech Kazior 29.09.2016 15:00
quelle

Tags und Links