addAll verwendet kein Iterator?

Status
Nicht offen für weitere Antworten.

Redfrettchen

Bekanntes Mitglied
Hi,
also das Fragezeichen im Titel kann man sich auch wegdenken.
Ich hab eine Klasse, die von ArrayList erbt. Sie verändert ihre Objekte nicht, aber die Benutzung von get() liefert unter Umständen (gewollt) veränderte Objekte. Man kann über Objekte der Klasse wunderbar iterieren und da geht alles glatt. Aber ich möchte gerne die Objekte dieser Collection in eine ArrayList übertragen und zwar so, dass die veränderten Objekte in die ArrayList eingetragen werden. Mit einer foreach-Schleife und ArrayList#add klappt das auch wunderbar, aber wozu gibt es bitteschön addAll bzw. den parametisierten Konstruktor, dacht ich mir. Leider wird die ArrayList auf diese Weise mit den originalen Objekten der unterliegenen ArrayList gefüllt, also konkludiere ich daraus, dass addAll bzw. der Konstruktor nicht/nicht richtig über die übergebene Collection iterieren und auch nicht ihr get() verwenden.

Liege ich da richtig, und vor allem: muss ich extra dieses oder ein anderes Workaround (z.B. in meiner neuen Listenklasse addAll neu implementieren und benutzen) machen, um das Problem zu beheben?
 

semi

Top Contributor
AbstractList#addAll(Collection c) verwendet den Iterator der gegebenen Collection,
geht also nicht über die get-Methode.
Problem unklar. :bahnhof:
 
B

bygones

Gast
die addAll hängt von der implementierten Collection ab.
Da ArrayList nichts anderes als ein Array ist werden über addAll einfach die Element über ein System.arraycopy hinzugefügt. Bei der LinkedList wird über die Liste iteriert und die entsprechenden Zeiger aktualisiert
 

Redfrettchen

Bekanntes Mitglied
Aber die ArrayList weiß doch nicht, um was für eine Collection es sich handelt und ich glaube auch nicht, dass da ganz viele instanceof Operatoren in if-Klammern stehen. Das wäre ziemlich unflexibel, wenn ich meine eigene Collection bauen würde und die Spezifikation der Methode würde verletzt sein. Jede Collection implementiert doch das Iterable-Interface, wieso sollte man also (außer aus Performancegründen (man bedenke aber bei generischen ArrayList's die ganzen Casts beim Kopieren)) nicht auch in addAll über die Collection iterieren bzw. welche andere Möglichkeit hat die Collection bei addAll, herauszufinden, welche Elemente die übergebene Collection enthält?
Und das tut sie aber anscheinend nicht/nicht richtig, wie ich am Beispiel meines Problems gesehen habe. Oder der Iterator, den man bei foreach-Schleifen benutzt, ist ein anderer, als der, der bei addAll benutzt wird. ka

Hab ich da einen Denkfehler? Oder hab ich was überlesen/übersehen?
 

byte

Top Contributor
Ich bin mir ziemlich sicher, dass Collections die nicht das List Interface implementieren, den Iterator für AddAll() verwenden. Das suggeriert schon die Methode aus AbstractCollection:

This implementation iterates over the specified collection, and adds each object returned by the iterator to this collection, in turn.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/AbstractCollection.html#addAll(java.util.Collection)
 
B

bygones

Gast
Redfrettchen hat gesagt.:
Aber die ArrayList weiß doch nicht, um was für eine Collection es sich handelt und ich glaube auch nicht, dass da ganz viele instanceof Operatoren in if-Klammern stehen
??? die ArrayList ist eine Collection, wo stellt sich die Frage um welche Collection es sich handelt ?

Redfrettchen hat gesagt.:
jede Collection implementiert doch das Iterable-Interface
klar jede Collection implementiert Iterable, was ihnen die Möglichkeit bietet, einen iterator zu generieren, d.h. aber nicht, dass sie dies in der addAll Methode anwenden...

ArrayList und Vector nutzen System.arraycopy, LinkedList setzt die Zeiger einfach richtig (kein iterieren über die Liste) - nur wenn die Collection selber nicht die addAll Methode überschreibt (z.b. beim HashSet), so wird die addAll methode von AbstractCollection verwendet, welche dann den Iterator nutzt.

ansonsten verstech ich nicht so ganz das Problem... als Tipp: Schau dir den Source code der Klassen an wenn du es nicht glaubst ;-)

oft hilft es von Vererbung auf Delegation umzustellen, da du dann eben nicht auf die super Implementierungen angewiesen bist sondern dir deine eigenen korrekten Methoden stricken kannst
 

zommi

Neues Mitglied
tachschen leude..... so wie ich das verstanden hab, geht das hier darum:

der gute mann hat eine neue klasse, die von ArrayList erbt.
in dieser klasse ist die get-methode überschrieben.
(sagen wir mal sie verdoppelt immer ontheFly das ergebnis - was zum Beispiel mal zahlen sind)
also onthefly heißt hier, dass der wert eigentlich nich verändert wird, sondern nur von get manipulativ zurückgegeben wird.

wenn er jetzt im programm get bei dieser liste anwendet, oder mit for-each (was ja intern als iteratorschleife umgesetzt wird) da durchwandert, bekommt er immer die manipulierten ergebnisse. also so wie gewollt.
also get und iterator geben shon die manipulierten ergebnisse zurück.

nun will er diese manipulierten ergebnisse allesamt in eine neue ArrayList übertragen.
dazu kann er ja mit for-each und add jedes element einzeln hinzufügen.
das klappt ja auch... aber addAll klappt nicht. da nimmt der die originalen werte.

also folgt daraus: addAll nutzt nicht get() und auch nicht den iterator der übergebenen Collection. (weil sonst würde es ja gehn)
aber wie macht es es dann ?

sem meint ja:
AbstractList#addAll(Collection c) verwendet den Iterator der gegebenen Collection,
geht also nicht über die get-Methode.
Problem unklar. bahnhof.gif

und das is ja wohl falsch (sonst würde es ja funktionieren)

naja.. jedenfalls ( bin mal auch gespannt, wies addAll nun werkelt)

mfg,
der zommi
 

Redfrettchen

Bekanntes Mitglied
Ja, ich hab meinen Denkfehler jetzt erkannt. Ich hab zuvor deathbyaclown's System.arrayCopy nicht nachvollziehen können und er hat anscheinend mich missverstanden, als ich von Collection sprach. Aber seis drum, hier die Auflösung:
ArrayList#addAll(Collection<? extends E>) benutzt nicht iterator(), sondern toArray() und das war es, was ich eigentlich wissen wollte. Diese Methode hab ich vollkommen übersehen; und dann kopiert ArrayList, wie natürlich richtig von deathbyaclown angemerkt, mit System.arrayCopy die Arraydarstellung der Collection in sein Array (so grob gesagt).
Ich muss also bloß toArray() von ArrayList in meiner Liste neu implementieren (also letztendlich mit iterator()), damit ich die gewünschten Ergebnisse bekomme.

Danke für die Mühen!
 

byte

Top Contributor
zommi hat gesagt.:
sem meint ja:
AbstractList#addAll(Collection c) verwendet den Iterator der gegebenen Collection,
geht also nicht über die get-Methode.
Problem unklar. bahnhof.gif

und das is ja wohl falsch (sonst würde es ja funktionieren)

Nö, das ist korrekt:

This implementation gets an iterator over the specified collection and iterates over it, inserting the elements obtained from the iterator into this list at the appropriate position, one at a time, using add(int, Object). Many implementations will override this method for efficiency.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/AbstractList.html#addAll(int,%20java.util.Collection)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Set - addAll, removeAll..? Allgemeine Java-Themen 8
W Komplexität von addAll() bei Collections Allgemeine Java-Themen 4
G Vector addAll Allgemeine Java-Themen 5
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
G Gleiche Packages in verschiedenen JAR Dateien - Welches Package wird verwendet? Allgemeine Java-Themen 5
C log4j.properties wird nicht verwendet?? Allgemeine Java-Themen 3
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
C Kopieren von Dateien die von einem anderen Programm verwendet werden? Allgemeine Java-Themen 7
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
M Wann verwendet man PropertyChangedEvents, wann eigene? Allgemeine Java-Themen 3
W VersionsVerwaltung welches Tool Verwendet ihr Allgemeine Java-Themen 12
H Welche Scriptsprache verwendet ihr in Java Allgemeine Java-Themen 9
Zrebna SonarLint: Warum kein Null-Referencing-CodeSmell-Hint hier? Allgemeine Java-Themen 23
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
I OpenPDF (ehem. iText) will kein PDF mit CMYK only erzeugen Allgemeine Java-Themen 6
A Kein Online-Zugang mögl.! Allgemeine Java-Themen 4
D kein Versand von Mails mit Anhang mehr Allgemeine Java-Themen 2
D Best Practice Gesamten Bildschirminhalt auslesen und Email schicken sobald kein Pixel sich ändert Allgemeine Java-Themen 11
R Warum kein throw? Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
A Datentypen Long.valueOf liefert kein "L" am Ende Allgemeine Java-Themen 3
M Kein Zugriff auf microSD Karten Allgemeine Java-Themen 4
B Input/Output Server Startet, Jedoch Kein Output. Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
Guybrush Threepwood Kein user.home unter Windows8 Allgemeine Java-Themen 7
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
D Eclipse Kein Zugriff auf Inhalt einer referenzierten .jar Allgemeine Java-Themen 5
S Schnell eine fortlaufende nummer erzeugen SQL, kein Primkey Allgemeine Java-Themen 8
P Mail wird nicht gesendet - Muss ich kein PW angeben ? Allgemeine Java-Themen 13
G RegEx kein Unterstrich Allgemeine Java-Themen 2
E kein doppelter Programmaufruf Allgemeine Java-Themen 3
reibi Workspace schon geöffnet (Kein Eclipse Thema) Allgemeine Java-Themen 14
D Kein Zugriff auf WebService ausser localhost Allgemeine Java-Themen 4
H Bestimmten String mit Pattern und Matcher herauslesen => kein erfolg Allgemeine Java-Themen 9
Haave Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich Allgemeine Java-Themen 7
Z Boolean Abfrage gibt kein Boolean zurück, aber warum? Allgemeine Java-Themen 6
T GregorianCalendar - kein Februar Allgemeine Java-Themen 6
0 kein Java unter Server 2008 ? Allgemeine Java-Themen 3
I kann JAVA kein Mathe? Allgemeine Java-Themen 10
J Kein Zugriff auf Klassen im Default Package Allgemeine Java-Themen 8
F Threading oder kein Threading - das ist hier die Frage. Allgemeine Java-Themen 23
V FileWriter und Zahlen (Kein Problem, nur Verständnisfrage) Allgemeine Java-Themen 4
T Problem, warum macht der das so(finde kein titel.) Allgemeine Java-Themen 3
K Kein schließendes Tag bei leerem Element mit JDOM Allgemeine Java-Themen 8
D Ich ikann kein Java-Programm starten Allgemeine Java-Themen 10
B Ausführungsproblem: admin, kein admin Allgemeine Java-Themen 2
E Warum kein Import? Allgemeine Java-Themen 3
L Kein Ausführen möglich Allgemeine Java-Themen 3
A Kein finally ausführen trotz verlassen des try blocks? Allgemeine Java-Themen 14
egrath Anonyme Methode - warum hier kein Compilerfehler Allgemeine Java-Themen 2
D kann kein java installieren Allgemeine Java-Themen 2
S Kein Sound in Java Applets unter Win 9x Allgemeine Java-Themen 4
P kein sound bei freenet spielen Allgemeine Java-Themen 2
K Scanner.hasNext findet kein Ende Allgemeine Java-Themen 6
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
P Eclipse: Kein Fehler beim Debuging aber beim normalen run Allgemeine Java-Themen 3
T Feststellen ob kein extra Thread läuft Allgemeine Java-Themen 10
U Versions-Konfusion: Ist long kein object? Allgemeine Java-Themen 3
A Dateistatus abfragen und Datei löschen sobald kein Zugriff Allgemeine Java-Themen 7
M DOS-Shell kennt kein CP850!! Allgemeine Java-Themen 2
D Kein public Konstruktor Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben