Java Quiz


#261

Ok, ich habe es ausprobiert. Die Erklärung liegt wahrscheinlich mal wieder tief in der JLS?


#262

So tief gar nicht.

[QUOTE=Clayn;94410]
Meine begründung schlicht und einfach die Darstellung von floatzahlen. Da dort ja immer ungenauigkeiten auftreten können nund 0,5 einfacher bzw genauer darstellbar ist als 0,7. Dadurch wird 0,7 eben nicht genau 0,7 sein. [/QUOTE]

Das stimmt. 0.5 ist exakt darstellbar. 0.7 ist nicht genau darstellbar. Und bei [inline]floatWert += 0.7[/inline] kommt der float-Wert raus, der der 0.7 am nächsten kommt. Der ist aber kleiner als der double-Wert für 0.7, der in dem Vergleich verwendet wird.

(Inspiriert von http://stackoverflow.com/questions/7011184/floating-point-comparison/7011243#7011243 )


#263

[QUOTE=cmrudolph;94411]Ok, ich habe es ausprobiert. Die Erklärung liegt wahrscheinlich mal wieder tief in der JLS?[/QUOTE]

Nö.

Decimal Representation: 0.7
Binary Representation: 00111111001100110011001100110011
Hexadecimal Representation: 0x3f333333
After casting to double precision: 0.699999988079071

http://www.h-schmidt.net/FloatConverter/IEEE754de.html


#264

Ok, auf float vs double hereingefallen :slight_smile:


#265

Ich gebe zu, dass mich viele der Fragen hier überfordern, was das tiefere Wissen um die Sprache Java angeht. Trotzdem eine Frage mal von mir, die mir ebenaufgefallen ist. Ich nehme an, den Profis hier ist das schonmal begegnet und deshalb keine Herausforderung mehr. Aber dennoch.
Was passiert hier?


String [] strings = {"a", "b" , "c"};
        
        List<String> stringList = Arrays.asList(strings);
        
        Iterator<String> stringIter = stringList.iterator();
        while(stringIter.hasNext()){
            String tmp = stringIter.next();
            if(tmp.equals("a")){
                stringIter.remove();
            }
        } 
        System.out.println(stringList.size());





#266

[SPOILER]ich vermute eine Exception (Wahrscheinlich eine NotImplementedException oder so) beim Aufruf von remove. Da Arrays.asList eine Miniimplementierung zurueckliefert. Die diese Methoden nicht implementiert hat. Daher besser in dieser Situation eher so ein Konstruct machen [inline]new ArrayList(Arrays.asList(strings))[/inline][/SPOILER]


#267

Das wird wohl eine ConcurrentModificationException werfen, da man die List nicht bearbeiten kann während man durch sie iteriert.

MfG,
~Oneric


#268

Wenn der Iterator die optionale [inline]remove()[/inline] unterstützt, dann geht das schon. Ich denke aber, AmunRa hat recht.


#269

[QUOTE=Oneric;95887]Das wird wohl eine ConcurrentModificationException werfen, da man die List nicht bearbeiten kann während man durch sie iteriert.[/QUOTE]Und weil genau das passiert, wenn man es auf der LISTE macht, gibt es die Methode remove() im Iterator, die einem das Löschen trotzden erlaubt. Sonst wäre es ja reichlich sinnfrei eine Methode auf dem Interator anzubieten, wenn es schon eine in der Liste gibt, oder?

Ich tippe drauf, dass eine UnsupportedOperationException fliegt (die Standard-Exception für nicht implementierte Methoden halt)


#270

AmunRa hat recht. Ist mir vorher noch nie aufgefallen.


#271

So ich denke es ist wieder mal Zeit für ne Frage (mal schaun obs zu einfach ist oder ähnliches^^):

Undzwar geht es darum welche Ausgabe folgender Code erzeugen wird:


import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectQuiz
{

    public static final int FOO = 1;
    public static int BAH = 2;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception
    {
        System.out.println("Test FOO");
        testFoo();
        System.out.println("Test BAH");
        testBah();
    }

    static void testFoo() throws Exception
    {
        Field f = ReflectQuiz.class.getDeclaredField("FOO");
        int fieldValue = f.getInt(null);
        System.out.println(fieldValue);
        System.out.println(FOO);
        changeField(f, null, 42);
        fieldValue = f.getInt(null);
        System.out.println(fieldValue);
        System.out.println(FOO);
    }

    static void testBah() throws Exception
    {
        Field f = ReflectQuiz.class.getDeclaredField("BAH");
        int fieldValue = f.getInt(null);
        System.out.println(fieldValue);
        System.out.println(BAH);
        changeField(f, null, 1337);
        fieldValue = f.getInt(null);
        System.out.println(fieldValue);
        System.out.println(BAH);
    }

    static void changeField(Field fl, Object inst, Object val) throws
            SecurityException, NoSuchFieldException, IllegalArgumentException,
            IllegalAccessException
    {
        fl.setAccessible(true);
        Field modField = Field.class.getDeclaredField("modifiers");
        int modold = fl.getModifiers();
        modField.setAccessible(true);
        modField.setInt(fl, fl.getModifiers() & ~Modifier.FINAL);
        fl.set(inst, val);
        modField.setInt(fl, modold);
    }
}

Mal schaun wie lang es dauert bis die richtige Antwort ohne ausprobieren kommt^^

Edit:
Ich hoffe das kam bisher noch nicht so vor. Falls doch Schande über mein Haupt


#272

Da kommt ziemlich viel zusammen. Aber ich tippe auf
1,1,42,1,2,2,1337,1337
weil das static final Field zwar beim Complilieren “Ge-inlinet” werden darf (und deswegen auch nach der Änderung noch 1 rauskommt), aber die fieldValue trotzdem aktualisiert werden dürfte. Beim nicht-final sollte es keine Überraschungen geben (und wenn doch, schiebe ich das darauf, dass ich das Uhrzeitbedingt übersehen habe :D)


#273

Ganz genau. Aufgefallen ist mir das, als ich letztens mal spaßenshalber versucht haben Konstanten aus KeyEvent z.B. zu Verändern um zu gucken ob dann bei Tastatureingaben “falsche” Events bei rauskommen^^


#274

Konstanten aus KeyEvent z.B. zu Verändern um zu gucken ob dann bei Tastatureingaben “falsche” Events […]

haha, das wäre doch mal ein lustiger “virus”… xD


#275

Ohne auszuprobieren, was macht folgender Code:

map.put("a", "A");
map.put("b", "B");
map.put("c", "C");

for(String key : map.keySet()){
  map.put(key, map.get(key).toLowerCase());
}

System.out.println(map);```

#276

Nach meiner Erfahrung mit dem Iterieren über Collections und deren gleichzeitiger Modifikation über etwas anderes als den Iterator (hier indirekt über put) tippe ich, dass…
[spoiler]…eine ConcurrentModificationException geworfen wird.[/spoiler]
EDIT: Ok, hab’s ausprobiert. Hatte Unrecht, weil…
[spoiler]das put weder das KeySet noch das EntrySet selbst verändert, sondern nur das Mapping innerhalb des jeweiligen Entry. Wenn man innerhalb der for-Schleife allerdings einen neuen key einfügt, dann passiert das von mir Erwartete.[/spoiler]


#277

Ohne ausprobieren… ich würde mit einer ConcurrentModificationException rechnen, aber wenn’s die nicht ist, sehe ich nichts, würde ich da nichts unerwartetes erwarten ( :smiley: )


#278

Ja, eine ConcurrentModificationException hätte ich auch erwartet. Laut Doku ist das Verhalten undefiniert, wenn man die Map während der Iteration über das Set ändert. Sich darauf verlassen, dass KEINE ConcurrentModificationException fliegt, sollte man sich also auch nicht. ^^
Ist jetzt die Frage, ob man sowas produktiv einsetzen “darf” oder nicht.


#279

wie viele testläufe braucht man denn bei sowas bis man sicher sein könnte? ^^


#280

Keine. Nur den Satz “You may do this-and-that with this map” in der Doku/Spec :smiley: