Avatar billede louiselahn Nybegynder
23. januar 2004 - 12:56 Der 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?

En god forklaring ønskes... :-)
Avatar billede erikjacobsen Ekspert
23. januar 2004 - 12:57 #1
Ja, det tager længere tid med equals, men det gør jo ikke noget hvis det er det du skal bruge.

== mellem objekter siger om det er **det samme objekt**
equals mellem objekter siger de har **samme værdi**

Det er forskellen
Avatar billede viciodk Praktikant
23. januar 2004 - 12:59 #2
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.
Avatar billede arne_v Ekspert
23. januar 2004 - 13:06 #3
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.
Avatar billede louiselahn Nybegynder
23. januar 2004 - 18:05 #4
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*

Louise :-)
Avatar billede arne_v Ekspert
23. januar 2004 - 19:27 #5
Jeg er stadig helt overbevist om at du skal bruge equals.

Det burde ikke tage lang tid at lave equals.

Du burde kunne lave en million i sekundet eller noget i den stil.
Avatar billede arne_v Ekspert
23. januar 2004 - 19:27 #6
Har I overvejet at bruge nogle af Java's indbyggede klasser.

F.eks. en HashMap af ArrayList ?
Avatar billede erikjacobsen Ekspert
23. januar 2004 - 19:32 #7
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.
Avatar billede arne_v Ekspert
23. januar 2004 - 19:52 #8
Simpelt eksempel:

import java.util.*;

public class HashList {
    private HashMap hm;
    public HashList() {
        hm = new HashMap();
    }
    public void add(String word, String url) {
        ArrayList al = (ArrayList)hm.get(word);
        if(al == null) {
            al = new ArrayList();
            hm.put(word, al);
        }
        al.add(url);
    }
    public Object[] get(String word) {
        ArrayList al = (ArrayList)hm.get(word);
        if(al == null) {
            return null;
        } else {
            return al.toArray();
        }
    }
    public static void main(String[] args) {
        HashList hl = new HashList();
        hl.add("a", "http://www.1.dk/");
        hl.add("a", "http://www.2.dk/");
        hl.add("b", "http://www.2.dk/");
        hl.add("a", "http://www.3.dk/");
        hl.add("b", "http://www.3.dk/");
        hl.add("c", "http://www.3.dk/");
        Object[] hits = hl.get("b");
        for(int i = 0; i < hits.length; i++) {
            System.out.println((String)hits[i]);
        }
    }
}
Avatar billede asgerz.dk Nybegynder
30. januar 2004 - 18:56 #9
Til arne v... vil du ikke netop i dette eksempel vælge at bruge treeMap??? Da dette giver en hurtigere søgning?
Avatar billede arne_v Ekspert
30. januar 2004 - 19:02 #10
Hvorfor skulle den være hurtigere ?

TreeMap's fordel i forhold til HashMap er at den er sorteret.

Hvilket vel ikke spiller nogen rolle i denne kontekst.
Avatar billede erikjacobsen Ekspert
30. januar 2004 - 19:03 #11
Hvorfor give Treemap en hurtigere søgning?
Avatar billede asgerz.dk Nybegynder
30. januar 2004 - 19:11 #12
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!
Avatar billede erikjacobsen Ekspert
30. januar 2004 - 19:42 #13
Selvfølgelig er TreeMap hurtigere end så meget andet. Men ikke nødvendigvis hurtigere end en HashMap.
Avatar billede arne_v Ekspert
30. januar 2004 - 20:47 #14
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).

TreeMap's fordele er at den er sorteret.
Avatar billede louiselahn Nybegynder
31. januar 2004 - 00:44 #15
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?

Louise
Avatar billede arne_v Ekspert
31. januar 2004 - 01:01 #16
Ja - man kan godt dele point.
Avatar billede arne_v Ekspert
31. januar 2004 - 01:01 #17
svar
Avatar billede louiselahn Nybegynder
31. januar 2004 - 02:17 #18
shiiit der dummede jeg mig - det var hensigten I skulle have 30 point hver. Hvad gør jeg nu?
Avatar billede louiselahn Nybegynder
31. januar 2004 - 02:18 #19
Hvorfor er der ikke en undo-knap??? Ævæv
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 07:58 #20
Hvis det var mig du tænkte på, så gør det ikke noget. Jeg samler slet ikke på point.
Avatar billede arne_v Ekspert
31. januar 2004 - 16:36 #21
Erik hvis du ombestemmer dig, så fløjter du bare, så overfører jeg halvdelen
af pointene til dig.
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 16:43 #22
Vi ser på det når vi når til 2005 - men ikke for gamle spørgsmål ;)
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
Kurser inden for grundlæggende programmering

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