Wie multipliziere 10 mit einem "Integer" -Objekt in Java?

8

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?

    
Jagmal 05.09.2008, 14:49
quelle

6 Antworten

25

Mit Autoboxing von Java 5 können Sie einfach Folgendes tun:

%Vor%     
toolkit 05.09.2008, 14:52
quelle
7

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).

    
Matt Sheppard 05.09.2008 14:52
quelle
3

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.

    
ckpwong 05.09.2008 17:59
quelle
1

Halten Sie sich von dem zweiten Ansatz fern, am besten wäre das Autoboxing, wenn Sie Java 1.5 verwenden, alles frühere wäre das beste Beispiel.

    
Galbrezu 05.09.2008 14:56
quelle
1

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.

    
Clokey 05.09.2008 14:56
quelle
0
Die obige Antwort des Toolkits ist korrekt und der beste Weg, aber es gibt keine vollständige Erklärung dessen, was passiert. Angenommen, Java 5 oder höher:

%Vor%

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!)

    
Chris 18.06.2014 08:54
quelle

Tags und Links