Wie multiplizieren Sie 10, um eine "Integer" - Objekt in Java?
Wie kann ich 10 multiplizieren, um eine Integer
Objekt und zurück die Integer
Objekt?
Ich bin auf der Suche nach der sauberste Weg, dies zu tun.
Wahrscheinlich würde ich es so machen:
Bekommen int von Integer
Objekt, multiplizieren Sie es mit den anderen int und erstellen Sie einen anderen Integer Objekt mit diesem int-Wert.
Code wird so etwas wie ...
integerObj = new Integer(integerObj.intValue() * 10);
Aber ich habe einen code, in dem der Autor auf diese Weise tun: Holen Sie sich die String
von der Integer
Objekt verketten "0" am Ende und dann Holen Sie Integer
Objekt zurück Integer.parseInt
Den code so etwas wie dieses:
String s = integerObj + "0";
integerObj = Integer.parseInt(s);
Ist es ein Verdienst, es zu tun, oder so?
Und was wäre die effizienteste/sauberste Weg im Allgemeinen und in diesem Fall?
- Ich würde auch Ihnen raten, zu prüfen, ob die Verwendung von Integer ist WIRKLICH nötig. Joshua zeigte, dass die Verwendung von primitiven, viele, VIELE Male schneller in effiziente Java. Also, wenn Sie können, bleiben Sie bei int.
- Die Verwendung von Integer ist eigentlich eine design-Einschränkung. Die Idee ist, bekomme ich ein Integer-Objekt, und ich habe zu aktualisieren. So, können Sie nicht tun, Weg mit, dass 🙂
- <Pedanterie> Aktualisieren einer bestehenden Integer-Objekt ist nicht geschehen, ohne Reflexion voodoo. (Integer, wie andere primitive-wrapper-Typen, ist unveränderlich.) Das beste, was Sie vernünftigerweise tun-und was jeder vernünftige Beispiel tun -- ist, ersetzen Sie es mit einem anderen Objekt. Der ist gut genug für die meisten Fälle, aber bedeutet
void modifyInteger(Integer i)
wird nicht alles tun, lohnt sich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Java 5 autoboxing, Sie können einfach tun:
Dem string-Ansatz ist amüsant, aber ziemlich sicher eine schlechte Art und Weise, es zu tun.
Immer den int-Wert eine ganze Zahl, und einen neuen zu erstellen, werden sehr schnell, wo, wie parseInt, wäre ziemlich teuer zu nennen.
Insgesamt würde ich vereinbaren Sie mit Ihrem ursprünglichen Konzept (was, wie andere haben darauf hingewiesen, die getan werden können, ohne so viel Unordnung, wenn Sie autoboxing eingeführt in Java 5).
Das problem mit dem zweiten Weg ist der Weg, Strings behandelt werden, die in Java:
"0"
umgewandelt wird in ein konstantes String-Objekt zur compile-Zeit.Jedes mal, wenn dieser code aufgerufen wird,
s
aufgebaut, wie ein neues String-Objekt, undjavac
wandelt diesen code inString s = new StringBuilder().append(integerObj.toString()).append("0").toString()
(StringBuffer für ältere Versionen). Selbst wenn Sie die gleichenintegerObj
, d.h.,String s1 = integerObj + "0";
String s2 = integerObj + "0";
(s1 == s2)
wärefalse
, währends1.equals(s2)
wäretrue
.Integer.parseInt
ruft internnew Integer()
sowieso, weilInteger
unveränderlich ist.BTW, autoboxing/unboxing ist intern das gleiche wie die erste Methode.
Integer.parseInt(...)
keinen erstellen Sie ein Integer-Objekt, es direkt funktioniert mit einem primitivenint
.Halten Sie Weg von der zweite Ansatz, die beste Wette wäre, die autoboxing wenn Sie mit java 1.5, etwas früher Ihr erstes Beispiel wäre am besten.
Die Lösung mit Hilfe der String-Methode ist nicht so gut für eine Vielzahl von Gründen. Einige sind aus ästhetischen Gründen, andere sind praktisch.
Praktisch vor mehr Objekte erstellt werden, indem die String-version mehr als die normale form (wie Sie es ausgedrückt haben, in deinem ersten Beispiel).
Auf einer ästhetischen note, ich denke, dass die zweite version verschleiert die Absicht der code und ist fast so wichtig ist wie es um das Ergebnis, die Sie wollen.
toolkit die Antwort oben ist richtig und der beste Weg, aber es gibt nicht eine vollständige Erklärung, was passiert ist.
Vorausgesetzt, Java 5 oder höher:
Was Sie wissen müssen ist, dass genau das gleiche tun:
Durch ausführen der Aktion (in diesem Fall *=) auf das Objekt " a " ändern Sie nicht den int-Wert in 'a' - Objekt, aber eigentlich die Zuordnung eines neuen Objekts 'a'.
Dies ist, weil 'eine' bekommt automatisch-ohne Verpackung im Hinblick auf die Durchführung der Multiplikation und dann das Ergebnis der Multiplikation wird auto-Box zugeordnet und 'a'.
Integer ist ein immutable Objekt. (Alle wrapper-Klassen sind unveränderlich.)
Nehmen Sie zum Beispiel dieses Stück code:
Ist die Ausgabe:
Sehen Sie die Speicher-Adresse für " ich " verändert sich (Ihre Speicher-Adressen unterschiedlich sein).
Jetzt können Sie einen kleinen test mit Reflexion, fügen Sie diese auf das Ende des test () - Methode:
Die zusätzliche Ausgabe:
Können Sie sehen, dass die Speicher-Adresse für die 'ich' nicht ändern, auch wenn wir uns verändert Ihren Wert mit der spiegelung.
(VERWENDEN SIE KEINE REFLEXION AUF DIESE WEISE IM WIRKLICHEN LEBEN!!)