Toon posts:

[Java] Discussie over Java FAQ

Pagina: 1
Acties:

Verwijderd

Topicstarter
In de Java FAQ voor Programming & Webscripting zie ik o.a staan:

Gebruik een Iterator ipv een Enumeration, ArrayList ipv Vector, HashMap ipv Hashtable

Laat ik nu altijd een Enumeration, Vector en Hashtables gebruiken.....Wat is er mis met een Vector of Hashtable? En is het verschil dan zo groot dat de 1 echt af te raden is?

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Van wat ik begrepen heb is het grootste verschil dat het ze minder snel zijn (maar wel synchronized)

Verwijderd

Topicstarter
Maar wat moet ik me voorstellen bij sneller? Als ik wat data in een vector stop (Strings ofzo) en ik wil alle data uit die Vector ergens opvragen met bijv:
Java:
1
2
3
4
public String getData()
{
   return vector.toString();
}

dan duurt dat een paar milliseconden ofzo, so what is the big deal?
(Er van uitgaande dat je niet 100MB gaat staan inlezen)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Gebruik een Iterator ipv een Enumeration, ArrayList ipv Vector, HashMap ipv Hashtable
Het is vooral een historisch verschil: voor dat er echt goede Java Collections kwam in java.util.* waren er slechts een Vector, Enumeration en een Hashtable. Er waren geen goede interfaces voor de diverse verzamelingen en er was geen goede klasse-structuur met hergebruik van implementatie.

Met de Java Collections kwamen er onder andere Iteratoren, ArrayList en HashMap. Deze verzamelingen zijn beter ontworpen en kunnen alles wat je ook kan met de oude verzamelingen. De methode namen vaak beter gekozen en je kan er vanuit gaan dat implementaties efficienter zijn. Om de oude collections niet helemaal buiten te sluiten, importeren deze via work-arounds ook de nieuwe interfaces. Nieuwe APIs werken op deze interfaces en daarom kan je nog steeds alle verzamelingen gebruiken. Als je echter toch moet kiezen, kies dan vooral de nieuwe en niet de oude.

Synchronized verzamelingen maken kan je doen met de diverse methoden van de Collections klasse.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je het inderdaad 1 keer in je programma doet haalt het niet zoveel uit. Maar stel dat je een groot programma hebt waar je per seconde 10000 keer wat in en uit een Vector wil halen. Dan haalt zo'n fractie van een verschil wel degelijk uit. En het enige verschil is inderdaad dat een Vector en een Hashtable gesynchroniseerd zijn. Dit brengt natuurlijk wat overhead mee en dus zijn ze langzamer.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
De performance nadelen van directe synchronized implementaties is niet mijn argument om de nieuwe collections te gebruiken: beter design is de belangrijkste reden. Wat betreft synchronized verzamelingen houdt dit bijvoorbeeld in dat je elke verzameling synchronized kan maken als je dat wilt en dat dit niet afhangt van de concrete implementatie die je eerst had gekozen.
Dennis26: Weet iemand in hoeverre synchronized methoden de boel vertragen?
Zie dit artikel: Urban performance legends (IBM developerWorks)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
[rml]Glimi in "[ /14] nette code release versie *FAQ Upd"[/rml]

Daar schreef ik:
9. Gebruik een Iterator ipv een Enumeration, ArrayList ipv Vector, HashMap ipv Hashtable

Ik hoor veel mensen altijd maar roepen dat ze niet begrijpen wat nou het verschil is tussen Vector en ArrayList. Hiervoor moet ik een klein stukje geschiedenis oprakelen.

In de tijd voor Java 1.2 ( heeeeeel erg vroeger ) programmeerde je Java met allerlei losse datastructuren. Al deze datastructuren hadden weinig gemeen en waren dus totaal niet uitwisselbaar. Als jij in je class een Vector had staan en je wou toch een LinkedList gaan gebruiken, dan mocht jij mooi op verschillende punten in je code gaan hakken met alle risico's vandien.

Toen kwam Java 1.2 en Sun had het licht gezien. Er kwamen opeens gezamelijke interfaces waar een datastructuur aan moest voldoen. Bijvoorbeeld de List voor DataLijsten, Set voor DataLijsten waar geen duplicaten in zitten. Sun had zelfs een overkoepelende interface gemaakt waar alle datastructuren zich aan moeten houden. De 'Collections' waren geboren.

Omdat Vector en HashTable bestonden voordat de Collection interface bestond, zijn deze classes aangepast om te voldoen aan deze interface. Vector implementeert List en HashTable implementeert de interface Map. Echter er waren eerst ook vervangers voor deze classes gemaakt, nl. ArrayList en HashMap (welke qua naam beter beschrijven dan Vector en HashTable) Eigenlijk zijn Vector en HashMap toen om 'legacy' redenen blijven hangen toen.

Het enige verschil wat nog overbleef was dat Vector en HashTable beide syncronized (en dus thread safe waren) en de 'nieuwe' implementaties ArrayList en HashMap niet, net als alle andere collection classes.

Waarom nu HashMap en ArrayList gebruiken?
• Consitentie met de rest van de rest van de collections
• Beter uitwisselbaar met de rest van de collections ( door synchronisatie 'oude' )
• Ontbreken legacy methodes

Door het gebruik van Collection classes ben je eigenlijk ook verplicht Enummeration te laten vallen en Iterator te gaan gebruiken. Simpelweg omdat Collections Iteratoren geven ipv Enummerations. (Gebruik die ook, om je los te koppelen van de implementatie!)

Wat is er enorm verbeterd aan Enummeraties in Iteratoren dan?
Sun zegt er dit over.
An iterator over a collection. Iterator takes the place of Enumeration in the Java collections framework. Iterators differ from enumerations in two ways:

Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.

Method names have been improved.
Feitelijk komt het neer op een optie om Objecten uit een Collection te verwijderen, zodat je niet alleen de Collectie kan lezen zonder de implementatie te kennen, maar ook kan wijzigen.

--------------
Wat martin zegt dus :P
Hmmmz, ik moet dat stukje eigenlijk nog es afmaken :P

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Wauw, Glimi kan dat veel uitgebreider dan ik ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
hmm met die verwijderen tijdens iteration kreeg ik onlangs niets dan 'violations' - ie: concurrent modifaction. Aangezien ik helemaal geen threads gebuikte (behalve main) 'Kon' dat niet. Wat ie wel deed was een element aanpassen die nog geiterate moest worden (ie niet de 'pointer' gewoon wat data). Omdat ie er echt niet mee overweg kon moest ik zelfs [] gebruiken. Heel gek.

dus
code:
1
2
3
4
5
6
7
8
List: A - B - C - D

Foreach (X in List)
{
    X.link.test = 5; //en Link was een 'pointer' naar C ofzo
}

-> Error


ben daar nooit wijs uit geraakt wou toen nog posten maar aangezien [] werkte maar van afgezien, maar nu dat de post er toch kwam, is dit behaviour normaal? en nog weirder: hoe weet Java dat ik een ander object in de iteration aan het aanpassen ben ???
Pagina: 1