Vraag over uitlezen List

  • Onderwerp starter Onderwerp starter puli
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

puli

Gebruiker
Lid geworden
14 jan 2008
Berichten
9
Hallo iedereen,

Ik heb een vraag ivm met java List, mijn vraag gaat over het volgende.
via een methode vul ik een List op met objecten :

List gebruikersList = etc.....

De gebruikersList heeft als voorbeeld 3 objecten.
Hoe kan ik die 3 objecten uitlezen, en in een String plaatsen?

Kan iemand mij hiermee helpen, graag jullie mening.
 
met een for lus kan je over de elementen lopen.

for (int i = 0 ; i<lijst.size();i++){

}

Met list.get(i) krijg je de elementen terug..

Met stringbuilder kan het beste een string maken.

StringBuilder sb = new StringBuilder():
sb.append("hallo"),
sb.append(" allemaal"):
String s + sb.toString();
 
Dit:

i<lijst.size()

Is niet echt heel praktisch. Met hele grote arrays kan dit tijd kosten. Je kunt beter een regel erboven een Integer j aanmaken, met lijst.size() en deze gebruiken in je loep.
 
Praktisch genoeg...

Ga met java nooit te vroeg beginnen met optimaliseren... (Lees eens het boek "effective java" van Joshua bloch.)

een klein test programmaatje geeft voor mij de volgende resultaten..

100.000.000 iteraties.
list.size() in for loop: 2.5 sec
list.size() voor for loop: 1.5 sec,

en aangezien hij hoogst waarschijnlijk toch geen 100.000.000 elementen in de array heeft zal ik zeker nog niet druk over maken...
 
iterators nog beter :P maar lukt het met wat skinflowers zei puli?
 
over de zelfde 100.000.000 iteraties doet de iterator (ik heb de for-each loop gebruikt) er 4 seconden over niet sneller dus...:p
 
i know maar je moet de schijn hoog houden want ze horen sneller te zijn :P
 
en aangezien hij hoogst waarschijnlijk toch geen 100.000.000 elementen in de array heeft zal ik zeker nog niet druk over maken...
Nee, dat denk ik ook niet. Lijkt me best knap als hem dat lukt, want van 100 miljoen integers in één array gaat de JVM onderuit. Iets met een heap die te klein is :D:D 100 miljoen iteraties kan wel, dat ziet eruit zoals hieronder. Foreaches zijn dus sneller dan fori's, en niet zo'n beetje ook.

Code:
public class LoopTester {
	public static void main(String argss[]){

		//because really large arrays make the JVM 
		//run out of heap space, we use two arrays
		//so we can expand the max number of 
		//iterations
		int[] smallArray = new int[1000];
		int[] largeArray = new int[100000];
		
		//do 10 milion iterations utilizing forloops
		long startTime = System.currentTimeMillis();
		for(long i = 0; i < largeArray.length; i++)
			for(long j = 0; j < smallArray.length; j++)
				;//do nothing
		System.out.println(System.currentTimeMillis()-startTime);
		
		
		//do 10 milion iterations utilizing foreach loops
		startTime = System.currentTimeMillis();
		for(@SuppressWarnings("unused") int i : largeArray)
			for(@SuppressWarnings("unused") int j : smallArray)
				;//do nothin'
		System.out.println(System.currentTimeMillis()-startTime);
		
	}
}
 
Laatst bewerkt:
Sorry, ik lees nu de vraag pas goed. Als je een array met objecten hebt kun je, ongeacht het object-type, de toString methode van die objecten aanroepen. Ieder object heeft een toString methode, omdat die gedefinieerd is in het object Object, en alle anderen deze dus erven.

Code:
Vector<Object> objectList = new Vector<Object>();
String objectString = new String();
for(Object currentObject : objectList)
    objectString += currentObject.toString() + "\t";

Ik weet niet hoever je al bent met java, maar het is de bedoeling dat als je je eigen klassen definieert, je de toString methode overschrijft.
 
Laatst bewerkt:
Je speelt vals... Array's zijn veel sneller dan ArrayList...
Niets daarvan! Het ging hier toch om het testen van de snelheid van de loops, en niet om het testen van de snelheid van de datastructuur. Zolang je bij beide loops dezelfde datastructuur gebruikt, zal de foreach altijd sneller zijn dan de fori.

Niet als je het op een computer test met 32Gb ram.. :)
Precies ja, ik zei toch dat ik het erg knap zou vinden als ie het kon? Zei niet dat het onmogelijk was =) Als ie een computer met 32gb ram in zijn woonkamer heeft staan vind ik dat dus best knap. Zijn best duur, dus heeft 'ie dan lang voor gewerkt. :p

Ik zou het nog knapper hebben gevonden, als ie gewoon had gecompiled met de parameter "-Xmx". Had ie ook een grotere heap-space gehad. :evil:
 
Laatst bewerkt:
Niets daarvan! Het ging hier toch om het testen van de snelheid van de loops, en niet om het testen van de snelheid van de datastructuur. Zolang je bij beide loops dezelfde datastructuur gebruikt, zal de foreach altijd sneller zijn dan de fori.

ik heb je code aangepast en gebruikt nu een ArrayList ipv een Array... en zie het verschil...

Code:
List<Integer> smallArray = new ArrayList<Integer>(1000);
		List<Integer> largeArray = new ArrayList<Integer>(100000);
                
                for (int i = 0; i<1000 ; i++) {
                    smallArray.add(Integer.valueOf(i));
                }
                
                for (int i = 0; i<100000 ; i++) {
                    largeArray.add(Integer.valueOf(i));
                }
		//do 10 milion iterations utilizing forloops
		long startTime = System.currentTimeMillis();
		for(int i = 0; i < largeArray.size(); i++)
			for(int j = 0; j < smallArray.size(); j++) {
				;
                        }
		System.out.println(System.currentTimeMillis()-startTime);
		
		
		//do 10 milion iterations utilizing foreach loops
		startTime = System.currentTimeMillis();
		for(@SuppressWarnings("unused") Integer i : largeArray)
			for(@SuppressWarnings("unused") Integer j : smallArray) {
                            ;
                        }
		System.out.println(System.currentTimeMillis()-startTime);

Helaas is de laatste code echt 4x langzamer dan de eerste.... Dit betekent niet dat je de For each loop niet meer moet gebruiken... Zelf gebruik ik nooit meer for i constructie.. :)

Ps. je moet geen vector meer gebruiken:.. Deze zijn verouderd. gebruik ipv daarvan ArrayList. Deze zijn niet synchronised en daardoor ook iets sneller. Gebruik List list = Collections.synchronizedList(new ArrayList(...)); als je synchronized list nodig hebt...
 
Helaas is de laatste code echt 4x langzamer dan de eerste.... Dit betekent niet dat je de For each loop niet meer moet gebruiken... Zelf gebruik ik nooit meer for i constructie.. :)

ik ben bang dat je gedeeltelijk gelijk hebt. Fori's zijn dus sneller, als je arraylists/objecten gebruikt, foreaches zijn sneller bij arrays/primitieve types. Toch ben ik het met je code niet helemaal eens. Bij de fori gebuik je een 'int', terwijl je bij de foreach een 'Integer' neemt. Als je bij de fori ook een Integer gebruikt, is de fori nog maar half zo snel als de foreach.


Ps. je moet geen vector meer gebruiken:.. Deze zijn verouderd. gebruik ipv daarvan ArrayList. Deze zijn niet synchronised en daardoor ook iets sneller. Gebruik List list = Collections.synchronizedList(new ArrayList(...)); als je synchronized list nodig hebt...
Vectors zijn niet deprecated. Het woord ArrayList is meer typewerk :rolleyes: Wacht maar tot je threads gaat implementeren, en concurrencyproblemen krijgt met je ArrayList.... over debuggen gesproken.

Maar het is wel mierenneuken over niets: ik ben trots op je dat jij weet wat het verschil is tussen een arraylist en een vector! Fijn dat je me daar even op wijst... *lol*
 
Laatst bewerkt:
Toch ben ik het met je code niet helemaal eens. Bij de fori gebuik je een 'int', terwijl je bij de foreach een 'Integer' neemt.
Je moet wel bij de foreach een Integer gebruiken, het zijn de object uit de lijst. Als je hier int gebruikt zal het nog langerzamer worden omdat er je dan autoboxing krijgt... En in de for i gebruik je int omdat dit de index is... en niet het object zoals de for each..

Conclusie gebruik "for each" is veel duidelijker in gebruik. Minder kans op fouten en die paar milliseconden zal toch niet zo vaak belangrijk zijn..

Die vector fobie.. heb ik overgehouden aan van m'n werk, we hebben een een strenge code conventie en als je er niet aan houdt moet je trakteren... :(.
 
Alle offtopic berichten verwijderd
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan