JavaRush /Blog Jawa /Random-JV /Nggarap metode hashCode () lan padha () ing Jawa
Lenchik854
tingkat
Chernihiv

Nggarap metode hashCode () lan padha () ing Jawa

Diterbitake ing grup
Ing kirim iki aku bakal njelaske nganggo bentuk garis pangerten babagan cara hashCode()lan equals(). Aku pengin ngomong babagan implementasine standar, uga carane ngatasi kanthi bener. Aku uga bakal nulis babagan ngleksanakake metode kasebut nggunakake kelas helper paket Apache Common. Nggarap metode hashCode () lan padha () ing Jawa - 1Isi postingan iki:
  1. Nggunakake hashCode()lan equals().
  2. Ngganti prilaku standar.
  3. Overriding hashCode()lan equals()nggunakake Apache Commons Lang.
  4. Soko sing penting kanggo elinga.
  5. Perhatian Khusus Nalika Nggunakake ORM.
Metode hashCode()lan equals()ditetepake ing kelas Object, yaiku kelas induk kanggo obyek java. Mulane, kabeh obyek java marisi implementasine standar saka cara iki.

Nggunakake hashCode () lan padha ()

Cara iki hashCode()digunakake kanggo njupuk nomer integer unik kanggo obyek tartamtu. Nalika obyek kudu disimpen minangka struktur data ing tabel hash (uga disebut ember), nomer iki digunakake kanggo nemtokake lokasi ing tabel kasebut. Kanthi gawan, cara hashCode()kanggo obyek ngasilake nomer lokasi memori ing ngendi obyek kasebut disimpen. Cara kasebut equals(), kaya jenenge, digunakake kanggo mriksa kesetaraan rong obyek. Implementasi standar metode iki mung mriksa referensi saka rong obyek kanggo ndeleng manawa padha.

Overriding prilaku standar

Kabèh bisa dianggo kanthi becik anggere sampeyan ora ngilangi salah sawijining metode ing kelas sampeyan. Nanging kadhangkala aplikasi kudu ngganti prilaku standar sawetara obyek. Ayo njupuk conto ing ngendi sampeyan duwe Employee. Ayo nulis struktur minimal saka kelas kasebut.
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;
    }
}
Kelas sing diterangake ing ndhuwur Employeeduwe sawetara atribut dhasar lan metode accessor. Saiki ayo goleki kahanan sing gampang kanggo mbandhingake rong obyek kelas 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));
    }
}
Ora njupuk clairvoyant kanggo guess sing cara ndhuwur bakal bali "palsu". Nanging apa iki bener, amarga loro obyek kasebut padha? Ing aplikasi wektu nyata, cara kasebut kudu ngasilake bener. Kanggo entuk prilaku sing bener, kita kudu ngilangi cara kasebut equals(), kaya ing ngisor iki:
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());
}
Tambahake metode iki menyang kelas sampeyan Employeelan priksa kesetaraan bakal bali "bener". Nanging, apa kita wis nindakake kabeh? durung. Ayo nyoba kelas sing diowahi kanthi cara liyane.
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);
    }
}
Printah kasebut System.out.println(employee)nyithak rong obyek. Yen loro obyek padha padha, lan Setmung obyek unik sing ana ing, banjur HashSetkudu ana mung siji Kayata nang, i.e. loro obyek nuduhake conto sing padha ing kelas Employee. Apa sing wis kita lakoni? Kita ora kejawab cara penting nomer loro hashCode(). Minangka dokumentasi java ngandika, yen sampeyan ngilangi cara equals(), sampeyan kudu ngilangi metode kasebut hashCode(). Dadi ayo nambah metode liyane ing kelas kita Employee.
@Override
 public int hashCode()
 {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + getId();
    return result;
 }
Kita nambahake metode iki sapisan ing kelas kita, lan mung siji obyek sing bakal dicithak, lan kanthi mangkono, mriksa kesetaraan e1 lan e2 nuduhake bener.

Overriding hashCode()lan equals()nggunakake Apache Commons Lang

Apache Commons nyedhiyakake rong kelas helper sing apik kanggo metode panggilan hashCode()lan equals(). Ing ngisor iki kita ndeleng panggunaan:
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();
    }
 }
Ing tangan liyane, yen sampeyan nggunakake salah siji saka editors kode, padha uga kudu bisa nelpon munggah sawetara struktur becik kanggo sampeyan. Contone, yen ing Eclipse IDE sampeyan klik-tengen ing kelas >> sumber> Generating hashCode () lan padha () ... bakal generate implementasine apik banget kanggo sampeyan. Nggarap metode hashCode() lan equals() ing Jawa - 2Soko sing penting kanggo elinga.
  1. Tansah nggunakake atribut obyek sing padha kanggo nelpon loro lan hashCode()lan equals(). Mung ing kasus kita, kita digunakake employee id.
  2. Cara kasebut equals()kudu terus-terusan (yen obyek ora diganti, metode kasebut kudu ngasilake nilai sing padha).
  3. Kapan a.equals(b), banjur a.hashCode()kudu padha karo b.hashCode().
  4. Yen sampeyan ngilangi salah siji cara, sampeyan kudu ngilangi cara liya.

Perhatian Khusus Nalika Nggunakake ORM

Yen sampeyan ngurusi ORM (ru.wikipedia.org/wiki/ORM), banjur gunakake getter lan aja nganggo referensi lapangan hashCode(). equals()Iki amarga ing ORM, sawayah-wayah kolom dimuat nggunakake lazy load lan ora bisa diakses nganti getter kasebut diarani. Contone, ing kelas kita Employee, kita nggunakake e1.id == e2.id. Bisa uga yen ikolom d dimuat kanthi nggunakake lazy loading. Salah sawijining lapangan bisa uga ana 0 utawa null lan kita bakal entuk prilaku sing salah. Nanging, yen , digunakake e1.getId() == e2.getId(), kita bisa yakin sanajan lapangan dimuat nggunakake loading puguh; nelpon getter bakal populate lapangan pisanan. Sing kabeh aku ngerti babagan hashCode()lan metode equals(). Mugi iki mbantu wong nang endi wae. Sukses kuliahmu!! ps Iki nyoba pisanan ing terjemahan. Aku nyoba kanggo ngirim kabeh minangka cedhak karo apa sing penulis arep ngomong. Yen sampeyan duwe komentar, tulis ing komentar. Aja ngadili kanthi ketat :-))) Artikel asli
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION