Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>()

volcanos

Bekanntes Mitglied
Die Frage ist, wieso kommt bei der Varags-Methode
...
"List<Integer> numbersList = Arrays.asList();"
...
eine java.lang.UnsupportedOperationException ?

Wenn man das Gleiche aber in Main mit fixen Integer-Werten macht, dann kommt keine java.lang.UnsupportedOperationException ?
Hier geht
"List<Integer> numbersList = Arrays.asList(60, 20, 120);"

Bei der Methode muss man
"List<Integer> numbersList = new ArrayList<>();"
schreiben, sodass es funktioniert !

Java:
public class GenericsDemo
{
    // Main
    public static void main(String... args)
    {
        // Varargs ohne Generics:
        sumA(1,2,3,4,5,6,7,8,9,0);
      
        // Args mit Generics:
        int result = 0;
        List<Integer> numbersList = Arrays.asList(60, 20, 120);        // Addition korrekt
        for(var nL : numbersList)                    // oder int
        result += nL;
        System.out.println(result);
      
        // Varargs mit Generics (Addition):
        sumB(60, 20, 120);             
    }


    // Varargs ohne Generics (Addition):
     static void sumA(int... numbers)
     {
         int result = 0;
         for(int i : numbers)
         { result += i; }

         System.out.println(result);
     }
  
  
     // Varargs mit Generics (Addition):                     
     static void sumB(int... numbersX)
     {
         int result = 0;
         // List<Integer> numbersList = Arrays.asList();        // java.lang.UnsupportedOperationException
         List<Integer> numbersList = new ArrayList<>();            // .add korrekt
         for(var i : numbersX)                                     // oder int
         { numbersList.add(i); }
          
         for(var nL : numbersList)                                // oder int
         { result += nL; }
         System.out.println(result);
     }
}
 
Zuletzt bearbeitet:
Ich zitiere mal kurz die Javadoc von Arrays.asList:

Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.)

Auszerdem ist deine Aussage dass die Erzeugung zu einer UnsupportedOperationException fuehrt falsch, die Ausnahme wird geworfen wenn du versuchst ein Element hinzuzufuegen, was ja Sinn macht, weil die Liste nicht erweiterbar ist.
 
"Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.)"

Also auf deutsch:
Gibt eine Liste fester Größe zurück, die durch das angegebene Array unterstützt wird.
(Änderungen an der zurückgegebenen Liste werden in das Array "write-through" geschrieben.)

Write Through ist ein Speicherverfahren, bei dem Daten gleichzeitig in den Cache und den entsprechenden Hauptspeicherplatz (Main Memory) geschrieben werden. Die zwischengespeicherten Daten ermöglichen einen schnellen Abruf bei Bedarf, während die gleichen Daten im Hauptspeicher sicherstellen, dass bei einem Problem, Stromausfall oder einer anderen Systemstörung nichts verloren geht.

Obwohl das Write-Through-Verfahren das Risiko eines Datenverlustes minimiert, muss jeder Schreibvorgang zweimal durchgeführt werden, und diese Redundanz braucht Zeit. Das aktive Anwendungsprogramm muss warten, bis jeder Datenblock sowohl in den Hauptspeicher als auch in den Cache geschrieben wurde, bevor es die nächste Operation startet. Die „Datenversicherung“ geht also auf Kosten der Systemgeschwindigkeit.
 
Write Through ist ein Speicherverfahren, bei dem Daten gleichzeitig in den Cache und den entsprechenden Hauptspeicherplatz (Main Memory) geschrieben werden. Die zwischengespeicherten Daten ermöglichen einen schnellen Abruf bei Bedarf, während die gleichen Daten im Hauptspeicher sicherstellen, dass bei einem Problem, Stromausfall oder einer anderen Systemstörung nichts verloren geht.

Obwohl das Write-Through-Verfahren das Risiko eines Datenverlustes minimiert, muss jeder Schreibvorgang zweimal durchgeführt werden, und diese Redundanz braucht Zeit. Das aktive Anwendungsprogramm muss warten, bis jeder Datenblock sowohl in den Hauptspeicher als auch in den Cache geschrieben wurde, bevor es die nächste Operation startet. Die „Datenversicherung“ geht also auf Kosten der Systemgeschwindigkeit.

Wat? "Write Through" war in Anfuehrungszeichen, es ist gemeint das Aenderungen direkt in das zugrunde liegende Array geschrieben werden, nicht mehr. Du kannst dir auch jeder Zeit die Implementierung von Arrays.asList und der retournierten (leider schlecht benannten) Arrays.ArrayList ansehen.

Wenn ich dich richtig verstanden habe, dann wird der Fehler deshalb geworfen,
weil das Arrays.asList() endgültig ist (final) -> nicht mehr erweiterbar.

Nein, der Fehler wird deswegen geworfen weil dieser in der Methode Arrays.ArrayList.add geworfen wird, weil das veraendern der Liste nicht implementiert ist in dieser Implementierung. Das hat nichts damit zu tun ob die Klasse oder die Methode final ist oder nicht.
 
ok nur klammern geht . aber verändern nicht
Hinzufügen und Entfernen klappen nicht bei einer durch asList erstellten Liste, da sie wie sublist() nur eine Abbildung der Quelle darstellt.
Einzelne Werte verändern oder z.B. sortieren klappen hingegen, damit wird dann das Original verändert.

Java:
Compareable[] arr = ...; //mal annehmen, dass es eine Länge > 4 hat.
Collections.sort(Arrays.asList(arr).subList(1,4)); //dieser Befehl sortiert den genannten Bereich im Array.

asList() ohne Parameter bildet ein leeres Array ab. Technisch gesehen absolut ok, aber halt völlig unbrauchbar.
 

Zurück
Oben