Wie multipliziere ich 10 mit einem Integer
-Objekt und bekomme das Integer
-Objekt zurück?
Ich suche nach dem besten Weg, dies zu tun.
Ich würde es wahrscheinlich so machen:
Holen Sie int von Integer
object, multiplizieren Sie es mit dem anderen int und erstellen Sie ein anderes Integer-Objekt mit diesem int-Wert.
Code wird etwas wie ...
sein %Vor% Aber ich habe einen Code gesehen, wo der Autor es so macht: Holen Sie sich die String
aus dem Integer
-Objekt, verketten Sie "0" am Ende und holen Sie Integer
-Objekt zurück, indem Sie Integer.parseInt
verwenden
Der Code ist etwa so:
%Vor%Gibt es einen Verdienst, es auf jede Art zu tun?
Und was wäre im Allgemeinen und in diesem Fall der effizienteste / sauberste Weg?
Der String-Ansatz ist amüsant, aber mit ziemlicher Sicherheit ein schlechter Weg.
Den Int-Wert eines Integers zu erhalten und einen neuen zu erstellen, wird sehr schnell sein, da es für den Aufruf von parseInt ziemlich teuer wäre.
Insgesamt würde ich Ihrer ursprünglichen Herangehensweise zustimmen (die, wie andere gezeigt haben, ohne viel Durcheinander gemacht werden kann, wenn Sie Autoboxing wie in Java 5 eingeführt haben).
Das Problem mit der zweiten Möglichkeit ist die Art, wie Strings in Java behandelt werden:
"0"
wird bei der Kompilierung in ein konstantes String-Objekt konvertiert. Jedes Mal, wenn dieser Code aufgerufen wird, wird s
als neues String-Objekt erstellt und javac
konvertiert diesen Code in String s = new StringBuilder().append(integerObj.toString()).append("0").toString()
(StringBuffer für ältere Versionen). Selbst wenn Sie das gleiche integerObj
verwenden, d. H.
String s1 = integerObj + "0";
String s2 = integerObj + "0";
(s1 == s2)
wäre false
, während s1.equals(s2)
true
wäre.
Integer.parseInt
ruft auf jeden Fall new Integer()
auf, weil Integer
unveränderlich ist.
BTW, Autoboxing / Unboxing ist intern das gleiche wie die erste Methode.
Die Lösung, die die String-Methode verwendet, ist aus verschiedenen Gründen nicht so gut. Einige sind ästhetische Gründe, andere sind praktisch.
An einer praktischen Front werden mehr Objekte durch die String-Version erzeugt als die normalere Form (wie Sie in Ihrem ersten Beispiel ausgedrückt haben).
Bei einer ästhetischen Note denke ich, dass die zweite Version die Absicht des Codes verschleiert und das ist fast so wichtig, wie es das gewünschte Ergebnis hervorbringt.
Was Sie wissen müssen ist, dass dies genau dasselbe ist wie:
%Vor%Indem Sie die Operation (in diesem Fall * =) für das Objekt 'a' ausführen, ändern Sie nicht den int-Wert innerhalb des 'a' -Objekts, sondern ordnen ein neues Objekt 'a' zu. Der Grund dafür ist, dass "a" zum Ausführen der Multiplikation automatisch deaktiviert wird, und dann wird das Ergebnis der Multiplikation automatisch mit einem Kästchen versehen und einem "a" zugewiesen.
Ganzzahl ist ein unveränderliches Objekt. (Alle Wrapper-Klassen sind unveränderbar.)
Nehmen Sie zum Beispiel dieses Stück Code:
%Vor%Die Ausgabe ist:
%Vor%Sie können sehen, dass sich die Speicheradresse für 'i' ändert (Ihre Speicheradressen sind unterschiedlich).
Lassen Sie uns nun einen kleinen Test mit Reflektion durchführen, fügen Sie dies am Ende der test () Methode hinzu:
%Vor%Die zusätzliche Ausgabe ist:
%Vor% Sie können sehen, dass sich die Speicheradresse für 'i' nicht geändert hat, obwohl wir den Wert durch Reflektion geändert haben.
(Verwenden Sie diese Weise nicht in Wirklichkeit!)