Nun, die API für Integer.valueOf(String)
sagt tatsächlich, dass das String
genau so interpretiert wird, als ob es gegeben wäre Integer.parseInt(String)
. Allerdings valueOf(String)
gibt ein Objekt während kehrt ein primitive .new
Integer()
parseInt(String)
int
Wenn Sie die potenziellen Caching-Vorteile von Integer.valueOf(int)
nutzen möchten, können Sie auch diesen Schandfleck verwenden:
Integer k = Integer.valueOf(Integer.parseInt("123"))
Nun, wenn das, was Sie wollen , ist das Objekt und nicht die primitive, dann unter Verwendung von valueOf(String)
möglicherweise attraktiver als zu machen , ein neues Objekt aus , parseInt(String)
da erstere über durchweg vorhanden ist Integer
, Long
, Double
etc.
Integer.valueOf(Integer.parseInt("123"))
hat keinen Vorteil gegenüberInteger.valueOf("123")
oderInteger.valueOf(123)
abgesehen von der Verschwendung von Zyklen und der Größe Ihres Programms.Integer.valueOf(String)
macht genau das gleiche Caching wieInteger.valueOf(int)
. In der Tat ist es implementiert alsInteger.valueOf(Integer.parseInt(…))
...int
. Die Signatur sagt, dass es ein zurückgibtInteger
, und genau das tut es. Diese Antwort ist auch teilweise falsch, wenn sie besagt, dass sie ein "neues" zurückgibtInteger
. Das steht im Javadoc nicht. Es ist kostenlos, einen zwischengespeicherten Wert zurückzugebenInteger
.Aus diesem Forum :
quelle
ist ähnlich wie
Der Unterschied ist
valueOf()
einInteger
undparseInt()
einint
(ein primitiver Typ). Beachten Sie auch, dassvalueOf()
eine zwischengespeicherteInteger
Instanz zurückgegeben werden kann, was zu verwirrenden Ergebnissen führen kann, wenn das Testergebnis==
zeitweise korrekt erscheint. Vor dem Autoboxen kann es einen Unterschied in der Benutzerfreundlichkeit geben, nach Java 1.5 spielt es keine Rolle mehr.Darüber hinaus
Integer.parseInt(s)
kann auch primitiver Datentyp verwendet werden.quelle
Schauen Sie sich Java-Quellen an:
valueOf
verwendetparseInt
:parseInt
kehrt zurückint
quelle
Integer.parseInt kann nur int als nativen Typ zurückgeben.
Integer.valueOf muss möglicherweise tatsächlich ein Integer-Objekt zuweisen, es sei denn, diese Ganzzahl ist eine der vorab zugewiesenen. Das kostet mehr.
Wenn Sie nur einen nativen Typ benötigen, verwenden Sie parseInt. Wenn Sie ein Objekt benötigen, verwenden Sie valueOf.
Aufgrund dieser möglichen Zuordnung ist Autoboxing nicht in jeder Hinsicht eine gute Sache. Es kann Dinge verlangsamen.
quelle
Die parse * -Variationen geben primitive Typen zurück und die valueOf-Versionen geben Objekte zurück. Ich glaube, dass die valueOf-Versionen auch einen internen Referenzpool verwenden, um das gleiche Objekt für einen bestimmten Wert zurückzugeben, nicht nur für eine andere Instanz mit demselben internen Wert.
quelle
Da Sie möglicherweise jdk1.5 + verwenden und es dort automatisch in int konvertiert wird. In Ihrem Code wird also zuerst eine Ganzzahl zurückgegeben und dann automatisch in int konvertiert.
Ihr Code ist der gleiche wie
quelle
Wenn Sie die Integer-Klasse überprüfen, finden Sie den Wert der Methode parseInt. Der große Unterschied besteht im Caching, wenn Sie valueof API aufrufen. Es wird zwischengespeichert, wenn der Wert zwischen -128 und 127 liegt. Weitere Informationen finden Sie unter dem Link
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
quelle
public static Integer valueOf (String s)
Das Ergebnis ist ein Integer-Objekt, das den durch die Zeichenfolge angegebenen Integer-Wert darstellt.
Mit anderen Worten, diese Methode gibt ein Integer-Objekt zurück, das dem Wert von: new Integer (Integer.parseInt (s)) entspricht.
quelle
Integer.parseInt akzeptiert nur String und gibt den primitiven Integer-Typ (int) zurück.
Iteger.valueOf akzeptiere int und String. Wenn value String ist, konvertieren Sie valueOf mit parseInt in das einfache int und geben Sie eine neue Ganzzahl zurück, wenn die Eingabe kleiner als -128 oder größer als 127 ist. Wenn die Eingabe im Bereich (-128 - 127) liegt, werden immer die Integer-Objekte von a zurückgegeben interner IntegerCache. Die Integer-Klasse verwaltet eine innere statische IntegerCache-Klasse, die als Cache fungiert und Integer-Objekte von -128 bis 127 enthält. Wenn wir beispielsweise versuchen, ein Integer-Objekt für 127 abzurufen, erhalten wir immer dasselbe Objekt.
Iteger.valueOf(200)
wird neue Ganzzahl von 200 geben. Es ist wienew Integer(200)
Iteger.valueOf(127)
das gleiche wieInteger = 127
;Wenn Sie String nicht in die Ganzzahl konvertieren möchten, verwenden Sie
Iteger.valueOf
.Wenn Sie String nicht in das einfache int konvertieren möchten, verwenden Sie
Integer.parseInt
. Es funktioniert schneller.Ein Vergleich von Integer.valueOf (127) == Integer.valueOf (127) ergibt true
Weil es die Integer-Objekte mit den gleichen Referenzen aus dem Cache nimmt.
Integer.valueOf (128) == Integer.valueOf (128) ist jedoch falsch, da 128 außerhalb des IntegerCache-Bereichs liegt und neue Integer zurückgibt, sodass Objekte unterschiedliche Referenzen haben.
quelle
Wir sollten je nach Bedarf einen verwenden. Im Fall von ValueOf, da es ein Objekt instanziiert. Es wird mehr Ressourcen verbrauchen, wenn wir nur den Wert eines Textes benötigen, dann sollten wir parseInt, parseFloat usw. verwenden.
quelle