JavaRush /Java Blog /Random-TK /HashCode () bilen işlemek we Java-da deň () usullar
Lenchik854
Dereje
Chernihiv

HashCode () bilen işlemek we Java-da deň () usullar

Toparda çap edildi
Bu ýazgyda usullara düşünişimi hashCode()we equals(). Olaryň ýerine ýetirilişi, şeýle hem nädip dogry ýok edilmelidigi barada gürleşmek isleýärin. Şeýle hem, “Apache Common” bukjasynyň kömekçi sapaklaryny ulanyp, bu usullary durmuşa geçirmek hakda ýazaryn. HashCode () bilen işlemek we Java-da deň () usullarBu ýazgynyň mazmuny:
  1. Ulanmak hashCode()we equals().
  2. Dymmaklyk häsiýetini ýok et.
  3. Apache Commons Lang-i ýok etmek hashCode()we equals()ulanmak.
  4. Rememberatda saklamaly möhüm bir zat.
  5. ORM ulanylanda aýratyn üns.
Java we obýektler üçin esasy synp bolan synpda usullar hashCode()we usullar kesgitlenildi. Şonuň üçin ähli java obýektleri bu usullardan deslapky ýerine ýetirilişi miras alýarlar.equals()Object

HashCode () ulanmak we deňdir ()

Bu usul, hashCode()berlen obýekt üçin özboluşly bitewi san almak üçin ulanylýar. Haçan-da bir obýekt hash tablisasynda (çelek hem diýilýär) maglumat gurluşy hökmünde saklanmaly bolanda, bu san şol tablisadaky ýerleşişini kesgitlemek üçin ulanylýar. Düzgüne görä, obýekt üçin usul, hashCode()obýektiň saklanýan ýadynyň sanyny görkezýär. Bu usul equals(), adyndan görnüşi ýaly, iki obýektiň deňligini barlamak üçin ulanylýar. Bu usulyň deslapky ýerine ýetirilmegi, iki obýektiň deňdigini ýa-da ýokdugyny anyklamak üçin diňe salgylanmalary barlaýar.

Dymmak häsiýetini ýok etmek

Sapaklaryňyzda bu usullaryň haýsydyr birini ýok etmeseňiz hemme zat gowy işleýär. Sometimesöne käwagt programmalar käbir obýektleriň adaty hereketini üýtgetmeli. Geliň, a bolan ýeriňize mysal alalyň Employee. Şeýle synpyň mümkin bolan iň az gurluşyny ýazalyň.
public class Employee
{
    private Integer id;
    private String firstname;
    private String lastName;
    private String department;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
}
Aboveokarda beýan edilen synpda Employeekäbir esasy häsiýetler we aksesuar usullary bar. Indi synpyň iki obýektini deňeşdirmeli ýönekeý bir ýagdaýa seredeliň Employee.
public class EqualsTest {
    public static void main(String[] args) {
        Employee e1 = new Employee();
        Employee e2 = new Employee();

        e1.setId(100);
        e2.setId(100);
        //Печатает false в консоли
        System.out.println(e1.equals(e2));
    }
}
Aboveokarda ýazylan usulyň “ýalan” gaýdyp geljekdigini çaklamak üçin bir talapçy gerek däl. Emma bu iki obýektiň birmeňzeşdigini göz öňünde tutup, hakykatdanam dogrymy? Hakyky wagt ulanylanda, usul hakykata gaýdyp gelmeli. equals()Dogry özüni alyp barmak üçin aşakda edilişi ýaly usuly ýok etmeli :
public boolean equals(Object o) {
        if(o == null)
        {
            return false;
        }
        if (o == this)
        {
           return true;
        }
        if (getClass() != o.getClass())
        {
            return false;
        }
        Employee e = (Employee) o;
        return (this.getId() == e.getId());
}
Bu usuly synpyňyza goşuň Employeewe ekwiwalentlik barlagy “hakyky” bolar. Şeýle-de bolsa, biz hemme zady etdikmi? Entäk däl. Üýtgedilen synpymyzy ýene bir usul bilen synap göreliň.
import java.util.HashSet;
import java.util.Set;

public class EqualsTest
{
    public static void main(String[] args)
    {
        Employee e1 = new Employee();
        Employee e2 = new Employee();

        e1.setId(100);
        e2.setId(100);

        //Печатает 'true'
        System.out.println(e1.equals(e2));

        Set employees = new HashSet();
        employees.add(e1);
        employees.add(e2);
        //Печатает два an object
        System.out.println(employees);
    }
}
Buýruk System.out.println(employee)iki obýekti çap edýär. Iki obýekt hem deň bolsa we Setdiňe üýtgeşik zatlar bar bolsa, HashSetiçinde diňe bir mysal bolmaly, ýagny. iki obýekt hem synpyň şol bir mysallaryna degişlidir Employee. Näme sypdyrdyk? Ikinji möhüm usuly sypdyrdyk hashCode(). Java resminamalarynyň aýdyşy ýaly, usuly ýok etseňiz equals(), usuly ýok etmeli bolarsyňyz hashCode(). Geliň, synpymyza başga bir usul goşalyň Employee.
@Override
 public int hashCode()
 {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + getId();
    return result;
 }
Bu usuly synpymyza bir gezek goşduk, diňe bir obýekt çap ediler we şeýlelik bilen e1 we e2 deňligini barlamak dogry görkezildi.

Apache Commons Lang-i ýok etmek hashCode()we ulanmakequals()

hashCode()Apache Commons jaň etmegiň usullary we iki sany uly kömekçi synpyny hödürleýär we equals(). Aşakda ulanylyşyny görýäris:
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Employee
{
 private Integer id;
 private String firstname;
 private String lastName;
 private String department;
public Integer getId() {
    return id;
 }
 public void setId(Integer id) {
    this.id = id;
 }
 public String getFirstname() {
    return firstname;
 }
 public void setFirstname(String firstname) {
    this.firstname = firstname;
 }
 public String getLastName() {
    return lastName;
 }
 public void setLastName(String lastName) {
    this.lastName = lastName;
 }
 public String getDepartment() {
    return department;
 }
 public void setDepartment(String department) {
    this.department = department;
 }
@Override
 public int hashCode()
 {
    final int PRIME = 31;
    return new HashCodeBuilder(getId()%2==0?getId()+1:getId(), PRIME).
           toHashCode();
 }
@Override
 public boolean equals(Object o) {
    if (o == null)
       return false;
    if (o == this)
       return true;
    if (o.getClass() != getClass())
       return false;
    Employee e = (Employee) o;
       return new EqualsBuilder().
              append(getId(), e.getId()).
              isEquals();
    }
 }
Başga bir tarapdan, kod redaktorlaryndan birini ulanýan bolsaňyz, olar size ajaýyp gurluşlary hem çagyryp bilerler. Mysal üçin, “Eclipse IDE” -de synp >> çeşmesi> HashCode () öndürmek we () deňlemek bilen sag düwmä bassaňyz, bu siziň üçin gaty gowy durmuşa geçirer. HashCode () bilen işlemek we Java-da deň () usullarRememberatda saklamaly möhüm bir zat.
  1. hashCode()Hem we , hem-de jaň etmek üçin elmydama şol bir obýekt atributlaryny ulanyň equals(). Diňe biziň ýagdaýymyzda ulanýardyk employee id.
  2. Usul equals()yzygiderli bolmaly (obýekt üýtgemese, usul şol bir bahany yzyna gaýtarmaly).
  3. Haçan bolsa a.equals(b), şol a.hashCode()bir bolmaly b.hashCode().
  4. Bir usuly ýok etseňiz, ikinjisini ýok etmeli.

ORM ulanylanda aýratyn üns

ORM (ru.wikipedia.org/wiki/ORM) bilen iş salyşýan bolsaňyz, elmydama girýänleri ulanyň we hiç haçan meýdan salgylanmalaryny ulanmaň hashCode(). equals()Sebäbi ORM-de wagtal-wagtal meýdanlar ýalta ýük bilen ýüklenýär we alýanlar çagyrylýança girip bolmaýar. Mysal üçin, synpymyzda Employeeulanýarys e1.id == e2.id. iD meýdanlarynyň ýalta ýüklemek arkaly ýüklenmegi düýbünden mümkindir . Meýdanlaryň biri 0 ýa-da null bolup biler we nädogry hereket ederis. , Öne, ulanylsa e1.getId() == e2.getId(), meýdanlar ýalta ýüklemek bilen ýüklenen hem bolsa, ynamly bolup bileris; alýan adama jaň etmek ilki bilen meýdançany doldurar. hashCode()Bular we usullar hakda bilýänlerimiň hemmesi equals(). Bu bir ýerde birine kömek eder diýip umyt edýärin. Okuwyňyz bilen üstünlik arzuw ediň !! ps Bu terjime etmekdäki ilkinji synanyşykym. Everythinghli zady awtoryň aýtmak isleýän zadyna mümkin boldugyça ýakynlaşdyrmaga synanyşdym. Teswirleriňiz bar bolsa teswirlerde ýazmagyňyzy haýyş edýäris. Gaty höküm çykarmaň :-))) Asyl makala
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION