Java-verzamelingen die de invoegvolgorde behouden

Waarom behouden sommige verzamelingsgegevensstructuren de volgorde van invoeging niet? Wat is het speciale dat is bereikt in vergelijking met het handhaven van de volgorde van inbrengen?
Hebben we iets als we de bestelling niet handhaven?


Antwoord 1, autoriteit 100%

Prestaties. Als je de originele invoegvolgorde wilt, zijn er de LinkedXXX-klassen, die een extra gekoppelde lijst in invoegvolgorde bijhouden. Meestal maakt het je niet uit, dus gebruik je een HashXXX, of wil je een natuurlijke volgorde, dus gebruik je TreeXXX. Waarom zou u in beide gevallen de extra kosten van de gekoppelde lijst betalen?


Antwoord 2, autoriteit 25%

De collecties behouden de volgorde van invoegen niet. Sommige voegen gewoon standaard een nieuwe waarde toe aan het einde. Het handhaven van de volgorde van invoegen is alleen nuttig als u de objecten er prioriteit aan geeft of het gebruikt om objecten op de een of andere manier te sorteren.

De reden waarom sommige collecties het standaard onderhouden en andere niet, dit wordt meestal veroorzaakt door de implementatie en slechts soms door een deel van de definitie van collecties.

  • Lijstenbehouden de invoegvolgorde, aangezien het toevoegen van een nieuw item aan het einde of het begin de snelste implementatie is van de methode add(Object ) .

  • SetsDe HashSet- en TreeSet-implementaties behouden de invoegvolgorde niet omdat de objecten worden gesorteerd voor snel opzoeken en het handhaven van de invoegvolgorde zou extra geheugen vereisen. Dit resulteert in een prestatiewinst aangezien de invoegvolgorde bijna nooit interessant is voor Sets.

  • ArrayDequeeen deque kan worden gebruikt voor eenvoudige que en stack, dus je wilt ”first in first out” of ”first in last out”-gedrag hebben, beide vereisen dat de ArrayDeque handhaaft de invoegvolgorde. In dit geval wordt de invoegvolgorde gehandhaafd als een centraal onderdeel van het klassencontract.


Antwoord 3, autoriteit 9%

  • De invoegvolgorde wordt inherent niet gehandhaafd in hashtabellen– dat is gewoon hoe ze werken (lees het gelinkte artikel om de details te begrijpen). Het is mogelijk om logica toe te voegen om de invoegvolgorde te behouden (zoals in de LinkedHashMap), maar dat kost meer code en tijdens runtime meer geheugen en meer tijd. Het prestatieverlies is meestal niet significant, maar het kan wel.
  • Voor TreeSet/Mapis de belangrijkste reden om ze te gebruiken de natuurlijke iteratievolgorde en andere functionaliteit die is toegevoegd in de SortedSet/Map-interface.

Antwoord 4, autoriteit 2%

Afhankelijk van wat je nodig hebt om de implementatie goed te doen. De invoegvolgorde is meestal niet interessant, dus het is niet nodig om deze te behouden, zodat u de volgorde kunt wijzigen om betere prestaties te krijgen.

Voor kaarten worden meestal HashMap en TreeMap gebruikt. Door hash-codes te gebruiken, kunnen de items in kleine groepen worden geplaatst, gemakkelijk om in te zoeken. De TreeMap handhaaft een gesorteerde volgorde van de ingevoegde items ten koste van langzamer zoeken, maar gemakkelijker te sorteren dan een HashMap.


Antwoord 5, autoriteit 2%

Als u een HashSet (of een HashMap) gebruikt, worden gegevens opgeslagen in “buckets” op basis van de hash van uw object. Op deze manier zijn uw gegevens gemakkelijker toegankelijk omdat u deze specifieke gegevens niet in de hele set hoeft te zoeken, u hoeft alleen in de juiste bucket te zoeken.

Op deze manier kun je prestaties op specifieke punten verhogen.

Elke collectie-implementatie heeft zijn bijzonderheid om het beter te kunnen gebruiken in een bepaalde toestand. Elk van die bijzonderheden heeft een prijs. Dus als je het niet echt nodig hebt (bijvoorbeeld de invoegopdracht), kun je beter een implementatie gebruiken die het niet biedt en beter aansluit bij je eisen.


Antwoord 6

Waarom is het nodig om de volgorde van invoegen te handhaven? Als u HashMapgebruikt, kunt u de invoer krijgen met de key. Het betekent niet dat het geen lessen biedt die doen wat je wilt.


Antwoord 7

Er is een sectie in het O’Reilly Java Cookbook genaamd “De drang om te sorteren vermijden” De vraag die u zou moeten stellen is eigenlijk het tegenovergestelde van uw oorspronkelijke vraag … “Winnen we iets door te sorteren?” Het kost veel moeite om die volgorde te sorteren en te behouden. Natuurlijk is sorteren eenvoudig, maar in de meeste programma’s schaalt het meestal niet. Als je duizenden of tienduizenden verzoeken (insrt,del,get,etc) per seconde gaat afhandelen, of je nu niet een gesorteerde of niet-gesorteerde datastructuur gebruikt, zal het er serieus toe doen.


Antwoord 8

Oké … dus deze berichten zijn oud in vergelijking met nu, maar de volgorde van invoegen is nodig, afhankelijk van uw behoefte of toepassingsvereisten, dus gebruik gewoon het juiste type verzameling. Voor het grootste deel is het niet nodig, maar in een situatie waarin je objecten moet gebruiken in de volgorde waarin ze zijn opgeslagen, zie ik een duidelijke behoefte. Ik denk dat orde van belang is als je bijvoorbeeld een tovenaar of een flow-engine maakt of iets van dien aard waarbij je van staat naar staat moet gaan of zoiets. In die zin kun je dingen uit de lijst aflezen zonder dat het bijhoudt wat je vervolgens nodig hebt of een lijst doorloopt om te vinden wat je zoekt. Het helpt wel bij de prestaties in die zin. Het maakt wel uit, anders zouden deze verzamelingen niet veel zin hebben.


Antwoord 9

sommige collecties handhaven de volgorde niet omdat ze de hashcode van de inhoud berekenen en dienovereenkomstig opslaan in de juiste bucket.


Antwoord 10

Ik kan geen referentie noemen, maar door het ontwerp zijn de Listen Setimplementaties van de Collectioninterface in principe uitbreidbaar Arrays. Omdat Collectionsstandaard methoden aanbieden om op elk moment dynamisch elementen te toevoegenen verwijderen— die Arrays niet doen t — de invoegvolgorde blijft mogelijk niet behouden.
Dus, aangezien er meer methoden zijn voor het manipuleren van inhoud, is er behoefte aan speciale implementaties die de orde bewaren.

Een ander punt is de prestatie, aangezien de best presterende Collectionmisschien niet die is, waarbij de invoegvolgorde behouden blijft. Ik weet echter niet precies hoe Collectionshun inhoud beheren voor prestatieverbeteringen.

Kortom, de twee belangrijkste redenen die ik kan bedenken waarom er orderbehoudende Collection-implementaties zijn, zijn:

  1. Klasse-architectuur
  2. Prestaties

Other episodes