JavaRush /Блоги Java /Random-TG /Кор бо усулҳои hashCode() ва equals() дар Java
Lenchik854
Сатҳи
Chernihiv

Кор бо усулҳои hashCode() ва equals() дар Java

Дар гурӯҳ нашр шудааст
Дар ин мақола ман фаҳмиши худро дар бораи усулҳо hashCode()ва equals(). Ман мехоҳам дар бораи татбиқи пешфарзии онҳо, инчунин чӣ гуна дуруст иваз кардани онҳо сӯҳбат кунам. Ман инчунин дар бораи татбиқи ин усулҳо бо истифода аз синфҳои ёрирасони бастаи Apache Common менависам. Кор бо усулҳои hashCode() ва equals() дар Java - 1Мундариҷаи ин паём:
  1. Истифодаи hashCode()ва equals().
  2. Рафтори пешфарзро бекор кунед.
  3. Бекор кардан hashCode()ва equals()истифодаи Apache Commons Lang.
  4. Чизе, ки дар хотир доштан муҳим аст.
  5. Диққати махсус ҳангоми истифодаи ORM.
Усулҳои hashCode()ва equals()дар синф муайян карда шуданд Object, ки синфи волидайн барои an objectҳои java мебошад. Аз ин рӯ, ҳама an objectҳои Java татбиқи пешфарзро аз ин усулҳо мерос мегиранд.

Истифодаи hashCode() ва баробар()

Ин усул hashCode()барои ба даст овардани адади ягонаи бутуни an objectи додашуда истифода мешавад. Вақте ки an object бояд ҳамчун сохтори додаҳо дар ҷадвали ҳаш нигоҳ дошта шавад (инчунин сатил номида мешавад), ин рақам барои муайян кардани ҷойгиршавии он дар ин ҷадвал истифода мешавад. Бо нобаёнӣ, усули hashCode()an object рақами макони хотираро, ки an object нигоҳ дошта мешавад, бармегардонад. Усули equals(), тавре ки аз номаш бармеояд, барои санҷидани баробарии ду an object истифода мешавад. Татбиқи пешфарзии ин усул танҳо истинодҳои ду an objectро тафтиш мекунад, то бубинад, ки онҳо баробаранд.

Бекор кардани рафтори пешфарз

Ҳама чиз хуб кор мекунад, агар шумо дар дарсҳои худ ҳеҷ яке аз ин усулҳоро бекор накунед. Аммо баъзан барномаҳо бояд рафтори пешфарзии баъзе an objectҳоро тағир диҳанд. Биёед мисолеро гирем, ки дар он шумо як Employee. Биёед сохтори ҳадди ақали имконпазири чунин синфро нависед.
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;
    }
}
Синфи дар боло тавсифшуда Employeeдорои атрибутҳои асосӣ ва усулҳои дастраскунанда мебошад. Акнун биёед вазъияти оддиеро бубинем, ки дар он ду an objectи синфро муқоиса кардан лозим аст 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));
    }
}
Барои тахмин кардани он, ки усули дар боло овардашуда "дурӯғ" -ро бармегардонад, як чашмдор лозим нест. Аммо оё ин воқеан дуруст аст, агар ин ду an object якхела бошанд? Дар вақти воқеӣ, усул бояд ҳақиқӣ баргардад. Барои ноил шудан ба рафтори дуруст, мо бояд методро, equals()ки дар зер иҷро карда мешавад, бекор кунем:
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());
}
Ин усулро ба синфи худ илова кунед Employeeва санҷиши баробарӣ "ҳақиқӣ" бармегардад. Бо вуҷуди ин, мо ҳама чизро анҷом додем? Ҳоло не. Биёед синфи тағирёфтаи худро бо як роҳи дигар санҷем.
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);
    }
}
Фармон System.out.println(employee)ду an objectро чоп мекунад. Агар ҳарду an objectҳо баробар бошанд ва Setтанҳо an objectҳои беназир дар дохor он мавҷуд бошанд, пас HashSetдар дохor он танҳо як мисол мавҷуд аст, яъне. ҳарду an objectҳо ба як мисолҳои синф ишора мекунанд Employee. Мо чиро аз даст додаем? Мо усули дуюми муҳимро аз даст додем hashCode(). Тавре ки ҳуҷҷатҳои java мегӯяд, агар шумо методро бекор кунед equals(), аз шумо талаб карда мешавад, ки методро бекор кунед hashCode(). Пас биёед ба синфи худ усули дигар илова кунем Employee.
@Override
 public int hashCode()
 {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + getId();
    return result;
 }
Мо ин усулро як маротиба ба синфи худ илова кардем ва танҳо як an object чоп карда мешавад ва ҳамин тавр, санҷиши эквивалентии e1 ва e2 дуруст аст.

Бекор кардан hashCode()ва equals()истифодаи Apache Commons Lang

Apache Commons ду синфи ёрирасонро барои усулҳои занг hashCode()ва equals(). Дар зер мо истифодаи онро мебинем:
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();
    }
 }
Аз тарафи дигар, агар шумо яке аз муҳаррирони codeро истифода баред, онҳо инчунин метавонанд барои шумо якчанд сохторҳои хубро даъват кунанд. Масалан, агар дар Eclipse IDE шумо бо тугмаи рости муш клик кунед класс >> сарчашма > тавлиди hashCode() ва equals() ... он барои шумо амалисозии хеле хуб тавлид мекунад. Кор бо усулҳои hashCode() ва equals() дар Java - 2Чизе, ки дар хотир доштан муҳим аст.
  1. Ҳамеша як атрибутҳои an objectро барои занг задан ба ҳарду ва hashCode()ва истифода баред equals(). Танҳо дар ҳолати мо, мо истифода мебурдем employee id.
  2. Метод equals()бояд доимӣ бошад (агар an object тағир наёфта бошад, усул бояд ҳамон арзишро баргардонад).
  3. Ҳар вақте ки a.equals(b), пас a.hashCode()бояд ҳамон тавре бошад b.hashCode().
  4. Агар шумо як усулро бекор кунед, шумо бояд дуюмро бекор кунед.

Диққати махсус ҳангоми истифодаи ORM

Агар шумо бо ORM (ru.wikipedia.org/wiki/ORM) сару кор дошта бошед, он гоҳ ҳамеша гитерҳоро истифода баред ва ҳеҷ гоҳ истинодҳои саҳроиро истифода набаред hashCode(). equals()Сабаб дар он аст, ки дар ORM вақт аз вақт майдонҳо бо истифода аз сарбории танбалӣ бор карда мешаванд ва то он даме, ки қабулкунандагони онҳо даъват карда нашаванд, дастрас нестанд. Масалан, дар синфи мо Employeeмо e1.id == e2.id. Ин комилан имконпазир аст, ки iмайдонҳои d бо истифода аз боркунии танбал бор карда шаванд. Яке аз майдонҳо метавонад 0 ё нул бошад ва мо рафтори нодуруст мегирем. Аммо, агар истифода шавад e1.getId() == e2.getId(), мо боварӣ дошта метавонем, ки ҳатто агар майдонҳо бо истифода аз боркунии танбалӣ бор карда шуда бошанд; даъват кардани қабулкунанда аввал майдонро пур мекунад. Ин ҳама чизест, ки ман дар бораи усулҳо hashCode()ва усулҳо медонам equals(). Умедворам, ки ин ба касе дар ҷое кӯмак мекунад. Муваффақият дар таҳсилатон!! ps Ин аввалин кӯшиши ман дар тарҷума аст. Ман кӯшиш кардам, ки ҳама чизро ба қадри имкон ба он чизе, ки муаллиф гуфтан мехоҳад, наздик расонам. Агар шумо ягон шарҳ дошта бошед, лутфан дар шарҳҳо нависед. Қатъиян ҳукм накунед :-))) Мақолаи аслӣ
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION