Avatar billede noxiaz Nybegynder
18. april 2009 - 15:17 Der er 13 kommentarer og
1 løsning

ArrayList vs Array

Jeg sidder og programmer en bot, hvor performce skal være helt i top.
Jeg ved forskllen på en arraylist og en array er at array har en fast size, og det har arraylist ikke. Der er også en forskel på at man kan bruge Contians i en arraylist, hvilket man ikke har mulighed for i en array (Ret mig hvis jeg tager fejl).

Som udgangs punkt så ved jeg altid hvor meget stor sizen skal være på arrayet.

Men ud fra disse ting kunne jeg godt tænke mig at vide hvilken der har den højeste performce, når det bare gælder at gemme og læse indhold. - Hvad jeg har læst mig til skulle det være Array som har den højeste perfomce, hvad det angår.

Men.. Nu har jeg også brug for at tjekke om arrayet indeholder noget bestemt, hvilket vil sige jeg bliver nød til at while arrayet igennem og tjekke om inholdet er der, og ved arraylist kan jeg lave .Contains() - Hvilken vil være hurtigst?

Håber i forstår og kan hjælpe :) - Jeg er selvfølgelig godt klar over at der skal en stor mængde data til før forskellen bliver "synlig"
Avatar billede arne_v Ekspert
18. april 2009 - 15:28 #1
Array vil sandsynligvis være en lille bitte smule hurtigere end ArrayList.

Og forskellen vil være så lille at det ikke vil betyde noget for din app.

Array klassen har iøvrigt en stribe utility metoder til arrays, så du kan spare en eksplicit for løkke (ikke while løkke).
Avatar billede erikjacobsen Ekspert
18. april 2009 - 15:53 #2
"bliver nød til at while arrayet igennem" ... uden at vide hvad du ellers skal, så kunne du overveje (også) at smide det i fx en hashtabel, hvor du får svaret om den er eller ikke er i lineær tid. Om det så kan betale sig i dit tilfælde, ved jeg ikke.
Avatar billede noxiaz Nybegynder
18. april 2009 - 16:12 #3
Hmm Arne_v, ved du hvor meget data der skal til før forskellen vil være der? Bare sådan ca.

Ved du om .Contains() i ArrayList, vil være lige så hurtig som at lave dette i et array:
  for(int i = 0;i < array.lengh;i++) {
    if (array[i] == "Data") { Data findes }
  }
Hvis det er tilfældet, kan man ligeså godt bruge almideligt array, men hvis funktionen ".Contains()" er hurtige når det glæder at tjekke indholdet vil det jo være smarter i mit tilfælde at bruge ArrayList?


Erik, Nej det kan ikke rigtig betale sig, for det enste den vil blive brugt til er bare at tjekke om det findes. Så kan arraylist bruges istedet. :)
Avatar billede erikjacobsen Ekspert
18. april 2009 - 16:16 #4
Jeg mente nu ikke lineær tid, men konstant tid.

Søgning i array eller arraylist tager lineær tid. Du skal finde ud hvad du egentlig har brug for, og hvor tit, før du kan lave den rigtige beslutning.
Avatar billede noxiaz Nybegynder
18. april 2009 - 16:31 #5
Hmm Erik, når du siger konstant tid. Mener du så at forskellen på at tjekke noget i en hasthable varier ikke efter hvor stor den er, vil altid tage lige "langtid"?
Avatar billede erikjacobsen Ekspert
18. april 2009 - 16:43 #6
Ja, det tager (næsten) samme tid, uanset hvor stor den er. Til gengæld kan det tage længere tid at ændre indholdet. Men hvis man spø'r tit, og ændrer sjældent, kan det sikkert betale sig.
Avatar billede noxiaz Nybegynder
18. april 2009 - 16:56 #7
Når du siger ændre, inkluder det også at tilføje ? - Eller tager det ingen tid at tilføje til en hashtable lige meget hvor stor den er?
Avatar billede erikjacobsen Ekspert
18. april 2009 - 21:10 #8
Det kan tage lidt længere tid at tilføje et element, end at finde et element, men det er stadig i konstant tid, i gennemsnit.
Avatar billede arne_v Ekspert
18. april 2009 - 23:55 #9
Med hensyn til forskellen mellem X[] og List<X> så er den nok et sted mellem 0.5-1.0 milliarde dele CPU sekunder per element man tilgår.

Så hvis du har 1000 elementer så sparer du ca. en milliontedel sekund.
Avatar billede arne_v Ekspert
18. april 2009 - 23:58 #10
Koden til ArrayList.Contains ser ud som følger i Reflector:

public virtual bool Contains(object item)
{
    if (item == null)
    {
        for (int j = 0; j < this._size; j++)
        {
            if (this._items[j] == null)
            {
                return true;
            }
        }
        return false;
    }
    for (int i = 0; i < this._size; i++)
    {
        if ((this._items[i] != null) && this._items[i].Equals(item))
        {
            return true;
        }
    }
    return false;
}

Så det laver stort set det samme som din løkke.
Avatar billede arne_v Ekspert
18. april 2009 - 23:59 #11
Bemærk at List<X> er meget hurtigere end ArrayList som indeholder X, hvis X er en value type.
Avatar billede noxiaz Nybegynder
20. april 2009 - 17:00 #12
Mange tak for svaret begge 2, I må gerne sende et svar, for er blevet en del klogere hvad det her angår :)
Avatar billede arne_v Ekspert
20. april 2009 - 17:36 #13
svar
Avatar billede erikjacobsen Ekspert
20. april 2009 - 18:23 #14
Ingen point til mig, tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester