CodeGym /Blog Jawa /Acak /Java hashCode()
John Squirrels
tingkat
San Francisco

Java hashCode()

Diterbitake ing grup

Prinsip Hash

Kaping pisanan, sadurunge nemtokake kode hash Jawa, kita kudu ngerti apa hashing lan kanggo apa. Hashing minangka proses nglamar fungsi hash kanggo sawetara data. Fungsi hash mung minangka fungsi matematika. Aja kuwatir babagan iki! "Matematika" ora mesthi tegese "rumit". Ing kene tegese mung ana sawetara data lan aturan tartamtu sing ngepetake data kasebut dadi sakumpulan karakter (kode). Contone, bisa dadi cipher heksadesimal. Kita duwe sawetara data saka ukuran apa wae ing input, lan aplikasi fungsi hash kasebut. Ing output, kita entuk data ukuran tetep, umpamane, 32 karakter. Biasane, fungsi kasebut ngowahi potongan data gedhe dadi nilai integer cilik. Asil karya fungsi iki diarani kode hash. Fungsi hash akeh digunakake ing kriptografi, lan sawetara wilayah liyane. Fungsi hash bisa beda-beda,
  • Objek tartamtu duwe kode hash tartamtu.
  • Yen rong obyek padha, kode hash padha. Kosok baline ora bener.
  • Yen kode hash beda-beda, mula obyek kasebut ora padha.
  • Objek sing beda bisa uga duwe kode hash sing padha. Nanging, iku acara banget ora mungkin. Ing titik iki, kita duwe tabrakan, kahanan, sing bisa ilang data.
Fungsi hash "tepat" nyuda kemungkinan tabrakan.

Hashcode ing Jawa

Ing Java, fungsi hash biasane disambungake menyang metode hashCode () . Persis, asil nglamar fungsi hash menyang Obyek yaiku kode hash. Saben obyek Jawa nduweni kode hash. Umumé Kode Hash minangka nomer sing diwilang kanthi metode hashCode () kelas Object. Biasane, programer override cara iki kanggo obyek uga related kanggo hashCode () cara padha () kanggo Processing luwih efisien data tartamtu. Metode hashCode () ngasilake nilai int (4 bita), sing minangka representasi numerik saka obyek kasebut. Kode hash iki digunakake, umpamane, koleksi kanggo panyimpenan data sing luwih efisien lan, kanthi mangkono, akses sing luwih cepet. Secara default, kode hash()fungsi kanggo obyek ngasilake nomer sel memori ngendi obyek disimpen. Mulane, yen ora ana owah-owahan ing kode aplikasi, fungsi kasebut kudu ngasilake nilai sing padha. Yen kode rada owah, nilai hashcode uga owah. Apa kode hash digunakake ing Jawa? Kaping pisanan, kode hash Jawa mbantu program mlaku luwih cepet. Contone, yen kita mbandhingaké loro obyek o1lan o2sawetara jinis, operasi o1.equals(o2)njupuk bab 20 kaping luwih saka o1.hashCode() == o2.hashCode().

Jawa padha ()

Ing kelas induk Object, bebarengan karo cara hashCode () , ana uga padha () , fungsi sing digunakake kanggo mriksa podo loro obyek. Implementasi standar fungsi iki mung mriksa pranala saka rong obyek kanggo padha karo. witjaksono () lan hashCode () duwe kontrak sing, supaya yen sampeyan ngalahake salah siji saka wong-wong mau, sampeyan kudu ngalahake liyane, supaya ora break kontrak iki.

Ngleksanakake metode hashCode().

Tuladha

Ayo nggawe Karakter kelas kanthi siji lapangan — jeneng . Sawise iku, kita nggawe rong obyek kelas Karakter , karakter1 , lan karakter2 lan nyetel jeneng sing padha. Yen kita nggunakake standar hashCode () lan witjaksono () saka kelas Obyek , kita bakal temtunipun njaluk beda, ora obyek witjaksono.Mangkene carane hashcode ing Jawa dianggo. Dheweke bakal duwe kode hash sing beda amarga ana ing sel memori sing beda lan asil operasi sing padha () bakal palsu.

import java.util.Objects;

public class Character {
    private String Name;

    public Character(String name) {
        Name = name;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    } 

    public static void main(String[] args) {
        Character character1 = new Character("Arnold");
        System.out.println(character1.getName());
        System.out.println(character1.hashCode());
        Character character2 = new Character("Arnold");
        System.out.println(character2.getName());
        System.out.println(character2.hashCode());
        System.out.println(character2.equals(character1));
    }
}
Asil saka mbukak program:

Arnold
1595428806
Arnold
1072408673
false
Loro nomer 10 digit ing console minangka kode hash. Apa yen kita pengin duwe obyek sing padha yen padha duwe jeneng sing padha? Apa sing kudu kita lakoni? Wangsulan: Bab ingkang utama kita kudu ngatasi hashCode () lan padha () metode kelas Obyek kanggo kelas Karakter . Kita bisa nindakake kanthi otomatis ing IDEA IDE, mung pencet alt + insert ing keyboard banjur pilih Generate -> equals() lan hashCode() . Apa Java hashCode() - 2Ing kasus conto, kita entuk kode sabanjure:

import java.util.Objects;

public class Character {
    private String Name;

    public Character(String name) {
        Name = name;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Character)) return false;

        Character character = (Character) o;

        return getName() != null ? getName().equals(character.getName()) : character.getName() == null;
    }

    @Override
    public int hashCode() {
        return getName() != null ? getName().hashCode() : 0;
    }

    public static void main(String[] args) {
        Character character1 = new Character("Arnold");
        System.out.println(character1.getName());
        System.out.println(character1.hashCode());
        Character character2 = new Character("Arnold");
        System.out.println(character2.getName());
        System.out.println(character2.hashCode());
        System.out.println(character2.equals(character1));
    }
}
Asil saka mbukak kode iki:

Arnold
1969563338
Arnold
1969563338
true
Dadi saiki program kasebut ngenali obyek kita padha lan duwe kode hash sing padha.

Tuladha kode hash Jawa:

Kode hash sampeyan dhewe () lan padha karo ()

Sampeyan uga bisa nggawe padha dhewe () lan hashCode () realisasi, nanging ati-ati lan elinga nyilikake tabrakan hashcode. Iki minangka conto metode hashCode () lan padha () ing kelas Siswa :

import java.util.Date;

public class Student {
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }
//Java hashcode example
   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
Lan kelas Utama kanggo nduduhake karyane:

import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;

public class Main {
   static HashMap<Student, Integer> cache = new HashMap<Student, Integer>(); // <person, targetPriority>

   public static void main(String[] args) {
       Student sarah1 = new Student("Sarah","Connor", "Jane", null);
       Student sarah2 = new Student("Sarah","Connor", "Jane", new Date(1970, 01-1, 01));
       Student sarah3 = new Student("Sarah","Connor", "Jane", new Date(1959, 02-1, 28)); // date not exists
       Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       Student johnny = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       System.out.println(john.hashCode());
       System.out.println(johnny.hashCode());
       System.out.println(sarah1.hashCode());
       System.out.println();
       cache.put(sarah1, 1);
       cache.put(sarah2, 2);
       cache.put(sarah3, 3);
       System.out.println(new Date(sarah1.birthday));
       System.out.println();
       cache.put(john, 5);
       System.out.println(cache.get(john));
       System.out.println(cache.get(johnny));
       cache.put(johnny, 7);
       System.out.println(cache.get(john));
       System.out.println(cache.get(johnny));
   }
}

Apa hashcode digunakake?

Kaping pisanan, kode hash mbantu program mlaku luwih cepet. Contone, yen kita mbandhingaké loro obyek o1lan o2sawetara jinis, operasi o1.equals(o2)njupuk bab 20 kaping luwih saka o1.hashCode () == o2.hashCode (). Ing prinsip hashing Jawa ngadeg konco sawetara koleksi populer, kayata HashMap , HashSet lan HashTable .

Kesimpulan

Saben obyek Jawa nduweni metode hashCode () lan padha () sing diwarisake saka kelas Obyek . Kanggo entuk mekanisme kesetaraan kerja sing apik, sampeyan kudu ngilangi metode hashcode () lan padha () kanggo kelas sampeyan dhewe. Nggunakake kode hash ndadekake program bisa mlaku luwih cepet.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION