Java Fragen zu einem Array und der eingabe von Variablen.

  • Ersteller Ersteller DefconDev
  • Erstellt am Erstellt am
D

DefconDev

Gast
Code:
Scanner s = new Scanner(System.in);
    
    double[] Array1 = new double [3];
    
    int Eingabe1, Eingabe2;
    double Ergebnis=0;
    
    
    Eingabe1 = s.nextInt();
    Eingabe2 = s.nextInt();
    
    Array1[0]=Eingabe1;
    Array1[1]=Eingabe2;
    Array1[2]=Ergebnis;
    
    Ergebnis= Eingabe1+Eingabe2;
    System.out.print("Das ist das Ergebnis "+Ergebnis+"\n");

oder

Code:
int[] x = new int[3];
      
      x[0]= s.nextInt();
      x[1]= s.nextInt();
      x[2]= x[0]+x[1];

Bis auf die Tatsache dass eine Variante weniger Schreibkram wäre, was ist sinniger bzw. welche der beiden ist sparsamer an Speicher wenn man das jetzt im großen Stil anweden würde!?
 
Also erstens: Wenn du zwei Ganzzahlen addierst, kannst du bei "int" bleiben. Auf "double" zu wechseln hat da eigentlich wenig Sinn, weil keine Kommazahl entstehen kann. Der Vorteil wäre höchstens ein höherer Speicherbereich eines doubles, aber wenn man zwei int addiert, ist es relativ unwahrscheinlich, gerade in dem Bereich zu landen, in dem der "kleine" Werteraum von Relevanz ist, oder man hätte da sowieso einen Fehler im Konzept, wenn tatsächlich öfter so große Werte eingegeben werden. Alternativ: "long" ist auch für Ganzzahlen, deckt aber einen wesentlich größeren Bereich ab.

Das Ergebnis im ersten Codestück erst zuzuweisen, nachdem du es schon in Array[2] schreibst, sollte auch relativ wenig bringen. Ich kann mich irren, aber wenn Java die Datentypen hier nicht als Referenztypen behandelt, was relativ sinnlos wäre, wird hier nämlich Array[2] nicht die Referenz auf den Wert des Ergebnisses übergeben, sondern der zu dem Zeitpunkt in Ergebnis vorhandene Wert, also erst einmal 0.

Der Zwischenschritt über Eingabe1 und Eingabe2 im ersten Codestück ist zumindest in diesem Beispiel auch überflüssig, inwieweit der Compiler da automatisch optimiert, weiß ich nicht. Im schlimmsten Fall würde es entsprechend minimalst länger dauern und entsprechend mehr Speicher verbrauchen.

Ich würde Variante 2 vorziehen, denn nicht nur, dass die kürzer zu schreiben ist, man spart sich den Umgang mit Variablen, die man ja doch nur an einer Stelle noch einmal aufgreift. Abgesehen vom genannten Fehler in der Reihenfolge im ersten Beispiel.
 
AP Nova schrieb:
Also erstens: Wenn du zwei Ganzzahlen addierst, kannst du bei "int" bleiben. Auf "double" zu wechseln hat da eigentlich wenig Sinn, weil keine Kommazahl entstehen kann. Der Vorteil wäre höchstens ein höherer Speicherbereich eines doubles, aber wenn man zwei int addiert, ist es relativ unwahrscheinlich, gerade in dem Bereich zu landen, in dem der "kleine" Werteraum von Relevanz ist, oder man hätte da sowieso einen Fehler im Konzept, wenn tatsächlich öfter so große Werte eingegeben werden. Alternativ: "long" ist auch für Ganzzahlen, deckt aber einen wesentlich größeren Bereich ab.

Ok, das habe ich eigentlich wahrlos gewählt, ich dachte mir nur wenn man zwei zahlen eingibt die im maximalen positiven wertebereich von int eingibt und dann addiert, muss die dritte variable einen größeren datentyp besitzen. Also mir ist schon bewusst dass double für komma zahlen gedacht ist. :-) Trotzdem danke für den Hinweis.

Das Ergebnis im ersten Codestück erst zuzuweisen, nachdem du es schon in Array[2] schreibst, sollte auch relativ wenig bringen. Ich kann mich irren, aber wenn Java die Datentypen hier nicht als Referenztypen behandelt, was relativ sinnlos wäre, wird hier nämlich Array[2] nicht die Referenz auf den Wert des Ergebnisses übergeben, sondern der zu dem Zeitpunkt in Ergebnis vorhandene Wert, also erst einmal 0.

Achso das ist tatsächlich ein Fehler meinerseits, das wird nicht als referenz behandelt. Ich müsste die Zeile vor der eingabe der arrays eingeben. Sonst ist das ergebnis erst null, wie du schon sagtest.

Der Zwischenschritt über Eingabe1 und Eingabe2 im ersten Codestück ist zumindest in diesem Beispiel auch überflüssig, inwieweit der Compiler da automatisch optimiert, weiß ich nicht. Im schlimmsten Fall würde es entsprechend minimalst länger dauern und entsprechend mehr Speicher verbrauchen.

Welchen Zwischenschritt? Eingabe1 = s.nextInt();?? Der dient dazu Zahlen von der Tastatur einzulesen. Wieso sollte der wegoptimiert werden?

Danke aber für deinen ausführlichen Hinweis.
 
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.

Das hier gehört mit Sicherheit nicht zu den 3%.

Was aber viel wichtiger ist - das erste Beispiel speichert nicht das richtige Ergebnis im Array. Und damit wurde das oben angeführte Zitat mal wieder bestätigt. Konzentriere dich lieber auf korrekte Logik, statt dich an Mikro-Optimierungen aufzuhängen. Speicher sparen und Java ist quasi ein Widerspruch in sich.
In Java schreibt man Variablennamen übrigens in mixed case, d.h. mit kleinem Anfangsbuchstaben.

Und den Scanner bitte noch closen.

P.S.: Wenn du wirklich gute Kniffe für Java lernen willst, empfehle ich dieses Buch.
 
Zuletzt bearbeitet:
Tumbleweed schrieb:
Das hier gehört mit Sicherheit nicht zu den 3%.

Was aber viel wichtiger ist - das erste Beispiel speichert nicht das richtige Ergebnis im Array. Und damit wurde das oben angeführte Zitat mal wieder bestätigt. Konzentriere dich lieber auf korrekte Logik, statt dich an Mikro-Optimierungen aufzuhängen. Speicher sparen und Java ist quasi ein Widerspruch in sich.
In Java schreibt man Variablennamen übrigens in mixed case, d.h. mit kleinem Anfangsbuchstaben.

Und den Scanner bitte noch closen.

Ja, erkannt habe ich es jetzt auch :P

Mir geht es auch mehr darum was die feinere art ist.

Wieso schreibt man Variablennamen mit kleinen Anfangsbuchstaben?
 
​Ich befürchte da gibt es nichts Vergleichbares. Ich kenne zumindest nichts. Das Buch ist auch im englischen Bereich quasi konkurrenzlos. Das liegt wohl in der Natur der Sache, da die Zielgruppe fortgeschrittene Entwickler bzw. zumindest erfahrene und ambitionierte Einsteiger sind und die können normalerweise Englisch, weil ihnen auf ihrem Weg jemand gesagt hat, dass es ohne einfach nicht wirklich weitergeht. ;)

Es ist aber nicht wirklich anspruchsvolles Englisch und die paar Fachwörter die auftauchen, kann man zur Not nachschlagen und hat damit direkt das nötige Vokabular intus, das man braucht, wenn man um Hilfe googlen muss. Du kannst ja einfach mal auf Amazon durchblättern, ob du damit zurecht kommst.
 
Tumbleweed schrieb:
​Ich befürchte da gibt es nichts Vergleichbares. Ich kenne zumindest nichts. Das Buch ist auch im englischen Bereich quasi konkurrenzlos. Das liegt wohl in der Natur der Sache, da die Zielgruppe fortgeschrittene Entwickler bzw. zumindest erfahrene und ambitionierte Einsteiger sind und die können normalerweise Englisch, weil ihnen auf ihrem Weg jemand gesagt hat, dass es ohne einfach nicht wirklich weitergeht. ;)

Es ist aber nicht wirklich anspruchsvolles Englisch und die paar Fachwörter die auftauchen, kann man zur Not nachschlagen und hat damit direkt das nötige Vokabular intus, das man braucht, wenn man um Hilfe googlen muss. Du kannst ja einfach mal auf Amazon durchblättern, ob du damit zurecht kommst.

Ich kann schon englisch lesen und sprechen, aber wenn es um bestimmte Terminologien geht, wie zb. die der Informatik fehlt mir selbst in Deutscher Sprache teilweise das Wissen. Da müsste ich dann doppelt nachschlagen.

Wörter wie Methoden oder allozieren musste ich in dem Zusammenhang auch erstmal nachschlagen^^


Aber ich werde es mir mal auf Amazon zu gemüte führen.

Danke!
 
Nachtrag zum Wertebereich der Datentypen:
int mit den "normalen" 32 Bit* speichert nebenbei Werte von -2^31 bis +2^31 - 1 (im positiven Bereich "fehlt" ein Wert, weil der für die 0 genutzt wird), das sind ganz grob gesagt jeweils etwa zwei Milliarden. (Daneben gibt es noch "unsigned int", eine vorzeichenlose Ganzzahl, die speichert dann von 0 bis 2^32 - 1)
Würde man nun tatsächlich beispielsweise 2^30 + 2^30 addieren, käme man bei 2^31 raus. Das wäre genau 1 über dem Maximalwert und würde vom Computer als Minimalwert verarbeitet werden. (Wenn die int vorzeichenbehaftet sind, was sie standardmäßig sind)

Also zwei int zu addieren heißt nicht zwangshaft, dass das Ergebnis mathematisch stimmt, man kann bei entsprechenden Eingaben hier durch die begrenzten Werte durchaus Fehler provozieren. Was ich oben meinte ist nur, dass, wenn man wirklich mit Ganzzahlen in Zahlenbereichen rechnet, in denen sowas zu einer fehlerhaften Rechnung führen kann, man von vornerein eine Lösung suchen sollte, die das umgeht.

*Ich meine, dass es allerdings in Java auch einen Befehl gibt, um sich die Wertebereiche von den Variablen ausgeben zu lassen, ob Java auf 64 Bit Maschinen dann auch mit 64 Bit int arbeitet, weiß ich nicht.

Nebenbei: Als überflüssigen Zwischenschritt betrachte ich, dass du das s.nextInt() immer erst in Eingabe1 und Eingabe2 schreibst, obwohl du direkt danach Eingabe1 und Eingabe2 ins Array schreibst und die beiden auch sonst nie wieder benutzt. Entsprechend kann man s.nextInt() direkt zum Zuweisen im Array nutzen. (Wie in Beispiel 2)
 
Zurück
Oben