23. januar 2004 - 12:56Der er
21 kommentarer og 1 løsning
forskel på "lig med lig med "og equals?
Hej eksperter
Jeg er lidt i tvivl om forskellen på at bruge == og equals i forbindelse med hægtede lister - det der skal sammenlignes er strenge - kan det passe at det tager længere tid at bruge equals og hvorfor?
Man kan slet ikke sammenligne strenge med ==. En streng er et objekt og to objekter kan ikke umiddelbart sammenlignes. Derfor skal man bruge en metode kaldet equals til dette.
Man kan sagtens bruge == på String's man skal bare være opmærksom på at man tester om det er samme streng objekt ikke om strengene indeholder de samme bogstaver.
Jeg lavede engang dette lille eksempel til at vise hvor "tilfældigt" == kan virke med Strings:
public class Equals { public static void main(String[] args) { String s1 = "ab"; String s2 = new String("ab"); String s3 = "a" + "b"; String s4 = new String("a") + new String("b"); String s5 = a() + b(); System.out.println(s1=="ab"); System.out.println(s2=="ab"); System.out.println(s3=="ab"); System.out.println(s4=="ab"); System.out.println(s5=="ab"); } private static String a() { return "a"; } private static String b() { return "b"; } }
I 99.9% af tilfældene ønsker man at bruge equals med String's.
Tak for de hurtige svar. Jeg må vist hellere uddybe lidt... Det metoden skal bruges til er en søgemaskine, og det er netop væsentligt, om det går hurtigt.
Det, der søges i, er en tekstfil der består af en masse ord (et på hver linie) samt indimellem nogle url-adresser, som genkendes fordi de starter med *PAGE. Ordene omdannes alle til "lowercase" og de unikke ord omregnes til en hashværdi som placerer ordet på en indeksplads i arrayet. Hvis flere ord lander på samme indeksplads laves en hægtet liste. Hvis samme ord optræder på flere url'er laves en anden (vertikal) hægtet liste. Og det er her, det pludselig går vildt langsomt - altså hvis ordet optræder hyppigt og url-listen skal ledes igennem via equals.
I fht. det du siger erikjacobsen, er url'en så et nyt objekt eller er det egentlig kun værdien (adressen) jeg er interesseret i? Det er lidt forvirrende... I fht. Arne V's eksempel risikerer jeg så at værdien bliver en anden???
Jeg er lettere desorienteret... Håber I vil skære det lidt mere ud i pap *GG*
Værdien er jo ikke adressen. Eet objekt har een adresse, og kommer du men to variabler, der har samme adresse, så peger de jo på samme objekt. Det er den sammenligning du laver med ==
Så du skal bruge equals. Hvis din overløbsliste bliver for lang, er det fordi enten din hashfunktion er for dårlig (ikke spreder værdierne godt nok), eller din hashtabel er for lille.
Og, ja, der er indbyggede klasser til en masse ting. Javas HashMap er sikkert hurtigere end jeres.
Kan ikke huske den tekniske forklaring 100% men det er noget med måden den gemmer på... ved bare at min kære underviser lige har prædiket helt vildt om det, og at jeg blev rost meget til eksamen for 14dagesiden da jeg sagde det!
Hvis HashMap er passende dimensioneret og hash funktionen er passende god vil opslag af enkelt værdi i HashMap normalt være hurtigere end opslag af enkelt værdi i TreeMap.
Opslag i TreeMap vil være O(log(n)) mens opslag i HashMap vil kunne være O(1).
Hej erikjacobsen og arne_v - det var nogle smaddergode svar jeg fik - tak for det! I supplerer hinanden godt - er der mon mulighed for at I kan dele pointene? Jeg ved ikke helt hvordan det funger... Men I skal vist smide nogle svar, ikke?
Vi ser på det når vi når til 2005 - men ikke for gamle spørgsmål ;)
Synes godt om
Ny brugerNybegynder
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.