{"id":32466,"date":"2025-10-22T04:31:19","date_gmt":"2025-10-22T01:31:19","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/"},"modified":"2025-10-22T04:31:19","modified_gmt":"2025-10-22T01:31:19","slug":"nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/","title":{"rendered":"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f"},"content":{"rendered":"<style>\n    body {\n        font-family: Arial, sans-serif;\n        line-height: 1.6;\n        margin: 0 auto;\n        padding: 20px;\n        max-width: 900px;\n        color: #333;\n    }\n    h1, h2, h3 {\n        color: #2c3e50;\n        margin-top: 30px;\n        margin-bottom: 15px;\n    }\n    h1 {\n        font-size: 2.2em;\n        text-align: center;\n    }\n    h2 {\n        font-size: 1.8em;\n        border-bottom: 2px solid #3498db;\n        padding-bottom: 10px;\n    }\n    h3 {\n        font-size: 1.4em;\n        color: #34495e;\n    }\n    p {\n        margin-bottom: 15px;\n    }\n    ul, ol {\n        margin-bottom: 15px;\n        padding-left: 20px;\n    }\n    li {\n        margin-bottom: 8px;\n    }\n    pre {\n        background-color: #ecf0f1;\n        padding: 15px;\n        border-radius: 5px;\n        overflow-x: auto;\n        margin-bottom: 20px;\n        font-family: \"Courier New\", Courier, monospace;\n    }\n    code {\n        font-family: \"Courier New\", Courier, monospace;\n        color: #c0392b;\n        background-color: #f9f9f9;\n        padding: 2px 4px;\n        border-radius: 3px;\n    }\n    pre code {\n        color: #2c3e50;\n        background-color: transparent;\n        padding: 0;\n        border-radius: 0;\n    }\n    table {\n        width: 100%;\n        border-collapse: collapse;\n        margin-bottom: 20px;\n    }\n    table, th, td {\n        border: 1px solid #ddd;\n    }\n    th, td {\n        padding: 10px;\n        text-align: left;\n    }\n    th {\n        background-color: #f2f2f2;\n    }\n    .expert-tip {\n        background-color: #e8f6f3;\n        border-left: 5px solid #1abc9c;\n        padding: 15px;\n        margin: 20px 0;\n        font-style: italic;\n    }\n    .qa-section {\n        background-color: #f9f9f9;\n        border: 1px solid #eee;\n        padding: 20px;\n        border-radius: 5px;\n        margin-top: 30px;\n    }\n    .qa-section h3 {\n        color: #2c3e50;\n        margin-top: 0;\n    }\n    .qa-item {\n        margin-bottom: 15px;\n    }\n    .qa-item strong {\n        color: #3498db;\n    }<\/p>\n<p>    \/* Mobil Uyumlu HTML i\u00e7in Media Query \u00d6rne\u011fi *\/\n    @media (max-width: 768px) {\n        body {\n            padding: 15px;\n        }\n        h1 {\n            font-size: 1.8em;\n        }\n        h2 {\n            font-size: 1.5em;\n        }\n        h3 {\n            font-size: 1.2em;\n        }\n        pre {\n            white-space: pre-wrap; \/* Kod bloklar\u0131n\u0131n k\u00fc\u00e7\u00fck ekranlarda kayd\u0131rma \u00e7ubu\u011fu olmadan s\u0131\u011fmas\u0131n\u0131 sa\u011flar *\/\n            word-wrap: break-word;\n        }\n        table, thead, tbody, th, td, tr {\n            display: block; \/* Tablolar\u0131 k\u00fc\u00e7\u00fck ekranlarda y\u0131\u011f\u0131n \u015feklinde g\u00f6ster *\/\n        }\n        thead tr {\n            position: absolute;\n            top: -9999px;\n            left: -9999px;\n        }\n        tr { border: 1px solid #ccc; }\n        td {\n            border: none;\n            border-bottom: 1px solid #eee;\n            position: relative;\n            padding-left: 50%;\n            text-align: right;\n        }\n        td:before {\n            position: absolute;\n            top: 6px;\n            left: 6px;\n            width: 45%;\n            padding-right: 10px;\n            white-space: nowrap;\n            text-align: left;\n            font-weight: bold;\n        }\n        \/* Her s\u00fctun i\u00e7in ba\u015fl\u0131\u011f\u0131 atayal\u0131m *\/\n        td:nth-of-type(1):before { content: \"\u00d6zellik:\"; }\n        td:nth-of_type(2):before { content: \"A\u00e7\u0131klama:\"; }\n    }\n<\/style>\n<h1>Equals, HashCode ve HashMap: Java&#8217;da Nesne E\u015fitli\u011fi ve Veri Yap\u0131lar\u0131 Y\u00f6netimi<\/h1>\n<p>Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak bir o kadar da hayati \u00f6neme sahip konular\u0131n ba\u015f\u0131nda nesne e\u015fitli\u011fi, <code>hashCode()<\/code> ve <code>HashMap<\/code> gibi koleksiyonlar\u0131n do\u011fru kullan\u0131m\u0131 gelir. Bu kavramlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve beklenen davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler. Peki, bir nesnenin di\u011ferine e\u015fit olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Ya da <code>HashMap<\/code> gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerimiz nas\u0131l do\u011fru \u015fekilde depolan\u0131r ve h\u0131zl\u0131ca eri\u015filir? Bu makale, bu temel sorular\u0131 yan\u0131tlayarak, bu mekanizmalar\u0131 derinlemesine inceleyecek ve size s\u0131f\u0131rdan ba\u015flayarak ileri seviye ipu\u00e7lar\u0131na kadar kapsaml\u0131 bir rehber sunacakt\u0131r. Amac\u0131m\u0131z, bu karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r ve pratik \u00f6rneklerle a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakt\u0131r.<\/p>\n<p>Java&#8217;da nesne e\u015fitli\u011fi, \u00f6zellikle koleksiyonlarla \u00e7al\u0131\u015f\u0131rken veya nesneleri kar\u015f\u0131la\u015ft\u0131r\u0131rken temel bir konudur. Her Java nesnesi, <code>Object<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretilir ve bu s\u0131n\u0131f, nesne e\u015fitli\u011fini kontrol etmek i\u00e7in varsay\u0131lan bir <code>equals()<\/code> metodu sa\u011flar. Ancak, bu varsay\u0131lan davran\u0131\u015f genellikle ihtiya\u00e7lar\u0131m\u0131z\u0131 kar\u015f\u0131lamaz. Peki, neden?<\/p>\n<p>Varsay\u0131lan olarak, <code>Object<\/code> s\u0131n\u0131f\u0131ndaki <code>equals()<\/code> metodu, iki nesnenin ayn\u0131 bellek adresini i\u015faret edip etmedi\u011fini, yani asl\u0131nda ayn\u0131 nesne olup olmad\u0131\u011f\u0131n\u0131 (referans e\u015fitli\u011fi) kontrol eder. \u00d6rne\u011fin, iki farkl\u0131 <code>String<\/code> nesnesi ayn\u0131 karaktere sahip olsa bile, e\u011fer bunlar farkl\u0131 bellek b\u00f6lgelerinde olu\u015fturulmu\u015flarsa, varsay\u0131lan <code>equals()<\/code> metodu i\u00e7in e\u015fit de\u011fillerdir. Bu durum, ilkel veri tipleri i\u00e7in beklenen de\u011fer e\u015fitli\u011fi davran\u0131\u015f\u0131ndan olduk\u00e7a farkl\u0131d\u0131r ve karma\u015f\u0131kl\u0131klara yol a\u00e7abilir. \u00d6zellikle i\u015f mant\u0131\u011f\u0131n\u0131zda iki farkl\u0131 nesnenin &#8220;i\u00e7sel olarak&#8221; e\u015fit kabul edilmesi gerekti\u011fi senaryolarda, varsay\u0131lan <code>equals()<\/code> metodu yetersiz kal\u0131r.<\/p>\n<p>\u00d6rne\u011fin, bir <code>Personel<\/code> s\u0131n\u0131f\u0131n\u0131z oldu\u011funu ve bu s\u0131n\u0131f\u0131n <code>id<\/code>, <code>ad<\/code> ve <code>soyad<\/code> gibi alanlar\u0131 oldu\u011funu d\u00fc\u015f\u00fcnelim. E\u011fer iki farkl\u0131 <code>Personel<\/code> nesnesinin ayn\u0131 <code>id<\/code> de\u011ferine sahip olmas\u0131 durumunda bunlar\u0131 e\u015fit kabul etmek istiyorsan\u0131z, <code>equals()<\/code> metodunu kendiniz ge\u00e7ersiz k\u0131lman\u0131z (override etmeniz) gerekir. Bu, genellikle &#8220;de\u011fer e\u015fitli\u011fi&#8221; olarak adland\u0131r\u0131l\u0131r ve nesnenin i\u00e7eri\u011fine dayal\u0131 bir kar\u015f\u0131la\u015ft\u0131rma anlam\u0131na gelir.<\/p>\n<p><code>equals()<\/code> metodunu ge\u00e7ersiz k\u0131larken uyman\u0131z gereken kat\u0131 kurallar (kontrat) bulunur. Bu kurallara uyulmamas\u0131, beklenmedik davran\u0131\u015flara, hatalara ve koleksiyonlarda veri kayb\u0131na neden olabilir:<\/p>\n<ul>\n<li><strong>Yans\u0131t\u0131c\u0131 (Reflexive):<\/strong> Herhangi bir bo\u015f olmayan referans de\u011feri <code>x<\/code> i\u00e7in, <code>x.equals(x)<\/code> metodu <code>true<\/code> d\u00f6nd\u00fcrmelidir. Bir nesne kendi kendisine e\u015fit olmal\u0131d\u0131r.<\/li>\n<li><strong>Simetrik (Symmetric):<\/strong> Herhangi bir bo\u015f olmayan referans de\u011feri <code>x<\/code> ve <code>y<\/code> i\u00e7in, <code>x.equals(y)<\/code> metodu ancak ve ancak <code>y.equals(x)<\/code> metodu <code>true<\/code> d\u00f6nd\u00fcr\u00fcyorsa <code>true<\/code> d\u00f6nd\u00fcrmelidir. Kar\u015f\u0131la\u015ft\u0131rma her iki y\u00f6nde de ayn\u0131 sonucu vermelidir.<\/li>\n<li><strong>Ge\u00e7i\u015fli (Transitive):<\/strong> Herhangi bir bo\u015f olmayan referans de\u011feri <code>x<\/code>, <code>y<\/code> ve <code>z<\/code> i\u00e7in, e\u011fer <code>x.equals(y)<\/code> metodu <code>true<\/code> ve <code>y.equals(z)<\/code> metodu <code>true<\/code> d\u00f6nd\u00fcr\u00fcrse, <code>x.equals(z)<\/code> metodu da <code>true<\/code> d\u00f6nd\u00fcrmelidir.<\/li>\n<li><strong>Tutarl\u0131 (Consistent):<\/strong> Herhangi bir bo\u015f olmayan referans de\u011feri <code>x<\/code> ve <code>y<\/code> i\u00e7in, <code>equals<\/code> metodu \u00fczerinde kullan\u0131lan bilgide bir de\u011fi\u015fiklik yap\u0131lmad\u0131\u011f\u0131 s\u00fcrece, <code>x.equals(y)<\/code> metodunun tekrar \u00e7a\u011fr\u0131lmas\u0131 her zaman ayn\u0131 de\u011feri d\u00f6nd\u00fcrmelidir.<\/li>\n<li><strong>Null ile Kar\u015f\u0131la\u015ft\u0131rma:<\/strong> Herhangi bir bo\u015f olmayan referans de\u011feri <code>x<\/code> i\u00e7in, <code>x.equals(null)<\/code> metodu <code>false<\/code> d\u00f6nd\u00fcrmelidir.<\/li>\n<\/ul>\n<p>Bu kurallar, <code>equals()<\/code> metodunun do\u011fru ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. \u015eimdi bir <code>Personel<\/code> s\u0131n\u0131f\u0131 i\u00e7in <code>equals()<\/code> metodunu nas\u0131l ge\u00e7ersiz k\u0131labilece\u011fimize dair bir \u00f6rne\u011fe g\u00f6z atal\u0131m:<\/p>\n<pre><code>\npublic class Personel {\n    private String id;\n    private String ad;\n    private String soyad;\n\n    public Personel(String id, String ad, String soyad) {\n        this.id = id;\n        this.ad = ad;\n        this.soyad = soyad;\n    }\n\n    \/\/ Getter metotlar\u0131...\n    public String getId() { return id; }\n    public String getAd() { return ad; }\n    public String getSoyad() { return soyad; }\n\n    @Override\n    public boolean equals(Object o) {\n        \/\/ 1. Referans e\u015fitli\u011fi kontrol\u00fc (performans optimizasyonu)\n        if (this == o) return true;\n        \/\/ 2. null ve s\u0131n\u0131f tipi kontrol\u00fc\n        if (o == null || getClass() != o.getClass()) return false;\n        \/\/ 3. Tip d\u00f6n\u00fc\u015f\u00fcm\u00fc\n        Personel personel = (Personel) o;\n        \/\/ 4. Alanlar\u0131n e\u015fitlik kontrol\u00fc (genellikle benzersiz alanlar kullan\u0131l\u0131r)\n        return id.equals(personel.id); \/\/ Sadece ID'ye g\u00f6re e\u015fitlik\n    }\n\n    \/\/ hashCode() metodu da burada olmal\u0131, bir sonraki b\u00f6l\u00fcmde a\u00e7\u0131klanacak.\n    \/\/ @Override\n    \/\/ public int hashCode() { ... }\n\n    @Override\n    public String toString() {\n        return \"Personel{\" +\n               \"id='\" + id + '\\'' +\n               \", ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               '}';\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, iki <code>Personel<\/code> nesnesini sadece <code>id<\/code> alanlar\u0131 \u00fczerinden kar\u015f\u0131la\u015ft\u0131r\u0131yoruz. Bu, bir\u00e7ok senaryoda uygun bir yakla\u015f\u0131md\u0131r, zira <code>id<\/code> genellikle bir varl\u0131\u011f\u0131n benzersiz tan\u0131mlay\u0131c\u0131s\u0131d\u0131r. Ancak, <code>equals()<\/code> metodunu ge\u00e7ersiz k\u0131ld\u0131\u011f\u0131n\u0131zda, <code>hashCode()<\/code> metodunu da <strong>mutlaka<\/strong> ge\u00e7ersiz k\u0131lman\u0131z gerekti\u011fini unutmay\u0131n. Bu kritik nokta, bir sonraki b\u00f6l\u00fcm\u00fcm\u00fczde ayr\u0131nt\u0131l\u0131 olarak ele al\u0131nacakt\u0131r.<\/p>\n<aside class=\"expert-tip\">Uzman \u0130pucu: <code>equals()<\/code> metodunu override ederken m\u00fcmk\u00fcnse t\u00fcm alanlar\u0131 de\u011fil, nesnenin benzersizli\u011fini sa\u011flayan anahtar alanlar\u0131 (\u00f6rne\u011fin ID) kullanmaya \u00f6zen g\u00f6sterin. \u00c7ok fazla alan\u0131 kar\u015f\u0131la\u015ft\u0131rmak performans\u0131 d\u00fc\u015f\u00fcrebilir. Ayr\u0131ca, null kontrol\u00fcn\u00fc do\u011fru yapmak ve farkl\u0131 s\u0131n\u0131flardan gelen nesneleri ele almak i\u00e7in <code>instanceof<\/code> yerine <code>getClass() != o.getClass()<\/code> kontrol\u00fcn\u00fc tercih etmek daha g\u00fcvenlidir.<\/aside>\n<h2>hashCode() Metodu: HashMap Performans\u0131n\u0131n Kilit Ta\u015f\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p><code>equals()<\/code> metodu ile birlikte, <code>hashCode()<\/code> metodu da Java'da nesne e\u015fitli\u011fi ve \u00f6zellikle karma tabanl\u0131 koleksiyonlar\u0131n (<code>HashMap<\/code>, <code>HashSet<\/code>, <code>Hashtable<\/code>) do\u011fru \u00e7al\u0131\u015fmas\u0131 i\u00e7in hayati bir rol oynar. Her Java nesnesi, <code>Object<\/code> s\u0131n\u0131f\u0131ndan miras ald\u0131\u011f\u0131 bir <code>hashCode()<\/code> metoduna sahiptir. Varsay\u0131lan <code>hashCode()<\/code> metodu genellikle nesnenin bellek adresine dayal\u0131 benzersiz bir tamsay\u0131 de\u011feri d\u00f6nd\u00fcr\u00fcr. Ancak, t\u0131pk\u0131 <code>equals()<\/code> metodunda oldu\u011fu gibi, bu varsay\u0131lan davran\u0131\u015f \u00e7o\u011fu zaman yeterli de\u011fildir ve performans sorunlar\u0131na yol a\u00e7abilir.<\/p>\n<p><code>hashCode()<\/code> metodunun temel amac\u0131, bir nesneyi temsil eden ve onu koleksiyonlarda h\u0131zl\u0131ca bulmay\u0131 sa\u011flayan bir \"karma de\u011feri\" veya \"imza\" \u00fcretmektir. Bu karma de\u011feri, genellikle <code>int<\/code> tipinde bir tamsay\u0131d\u0131r. <code>HashMap<\/code> gibi veri yap\u0131lar\u0131, bir anahtar\u0131n hangi \"kovada\" (bucket) olaca\u011f\u0131n\u0131 belirlemek i\u00e7in bu karma de\u011ferini kullan\u0131r. E\u011fer iki nesnenin <code>equals()<\/code> metodu <code>true<\/code> d\u00f6nd\u00fcr\u00fcyorsa, bu nesnelerin <code>hashCode()<\/code> metotlar\u0131 da <strong>kesinlikle ayn\u0131 de\u011feri<\/strong> d\u00f6nd\u00fcrmek zorundad\u0131r. Bu, <code>equals<\/code> ve <code>hashCode<\/code> aras\u0131ndaki kritik kontratt\u0131r. Bu kontrata uyulmamas\u0131, <code>HashMap<\/code> gibi yap\u0131larda nesnelerinizin bulunamamas\u0131na, veri kayb\u0131na ve hatal\u0131 davran\u0131\u015flara neden olabilir.<\/p>\n<p>Kontrat\u0131n neden bu kadar \u00f6nemli oldu\u011funu anlamak i\u00e7in <code>HashMap<\/code>'in \u00e7al\u0131\u015fma prensibine bakal\u0131m: bir anahtar-de\u011fer \u00e7iftini eklerken veya ararken, <code>HashMap<\/code> \u00f6nce anahtar\u0131n <code>hashCode()<\/code> de\u011ferini hesaplar. Bu de\u011fer, anahtar\u0131n hangi kovada aranaca\u011f\u0131n\u0131 veya yerle\u015ftirilece\u011fini belirlemek i\u00e7in kullan\u0131l\u0131r. E\u011fer farkl\u0131 ama <code>equals()<\/code> metoduna g\u00f6re e\u015fit olan iki nesne farkl\u0131 <code>hashCode()<\/code> de\u011ferleri d\u00f6nd\u00fcr\u00fcrse, <code>HashMap<\/code> bu nesneleri farkl\u0131 kovalara yerle\u015ftirebilir. Bu durumda, ayn\u0131 nesne i\u00e7in <code>get()<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zda, <code>HashMap<\/code> do\u011fru kovay\u0131 bulamayacak ve <code>null<\/code> d\u00f6nd\u00fcrecektir, sanki nesne hi\u00e7 eklenmemi\u015f gibi.<\/p>\n<p>Peki, <code>hashCode()<\/code> metodunu nas\u0131l do\u011fru bir \u015fekilde ge\u00e7ersiz k\u0131lmal\u0131y\u0131z? \u0130yi bir <code>hashCode()<\/code> metodunun temel \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<ul>\n<li>Ayn\u0131 nesne \u00fczerinde birden fazla \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda tutarl\u0131 olmal\u0131d\u0131r (nesnenin de\u011fi\u015fmeyen alanlar\u0131 kullan\u0131l\u0131yorsa).<\/li>\n<li><code>equals()<\/code> metoduna g\u00f6re e\u015fit olan nesneler ayn\u0131 karma kodunu \u00fcretmelidir.<\/li>\n<li><code>equals()<\/code> metoduna g\u00f6re e\u015fit olmayan nesnelerin farkl\u0131 karma kodlar\u0131 \u00fcretmesi zorunlu de\u011fildir, ancak performans\u0131 art\u0131rmak i\u00e7in farkl\u0131 olmalar\u0131 tercih edilir (\u00e7arp\u0131\u015fmalar\u0131 azaltmak i\u00e7in).<\/li>\n<\/ul>\n<p><code>hashCode()<\/code> uygularken, genellikle <code>equals()<\/code> metodunda kulland\u0131\u011f\u0131n\u0131z ayn\u0131 alanlar\u0131 kullanman\u0131z gerekir. Java 7'den itibaren <code>Objects.hash()<\/code> metodu, bu i\u015flemi kolayla\u015ft\u0131ran pratik bir y\u00f6ntem sunar. \u015eimdi, yukar\u0131daki <code>Personel<\/code> s\u0131n\u0131f\u0131 i\u00e7in <code>hashCode()<\/code> metodunu nas\u0131l ge\u00e7ersiz k\u0131labilece\u011fimize dair bir \u00f6rne\u011fe g\u00f6z atal\u0131m:<\/p>\n<pre><code>\nimport java.util.Objects; \/\/ Bu import'u eklemeyi unutmay\u0131n\n\npublic class Personel {\n    private String id;\n    private String ad;\n    private String soyad;\n\n    public Personel(String id, String ad, String soyad) {\n        this.id = id;\n        this.ad = ad;\n        this.soyad = soyad;\n    }\n\n    \/\/ Getter metotlar\u0131...\n    public String getId() { return id; }\n    public String getAd() { return ad; }\n    public String getSoyad() { return soyad; }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n        Personel personel = (Personel) o;\n        return id.equals(personel.id);\n    }\n\n    @Override\n    public int hashCode() {\n        \/\/ equals metodunda kullan\u0131lan alanlar\u0131 burada da kullanmal\u0131y\u0131z.\n        \/\/ Objects.hash() metodu, birden fazla alan\u0131 g\u00fcvenli bir \u015fekilde birle\u015ftirir.\n        return Objects.hash(id); \/\/ Sadece ID'ye g\u00f6re hash kodu\n    }\n\n    @Override\n    public String toString() {\n        return \"Personel{\" +\n               \"id='\" + id + '\\'' +\n               \", ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               '}';\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Personel<\/code> nesnemizin <code>hashCode()<\/code> de\u011feri sadece <code>id<\/code> alan\u0131na g\u00f6re hesaplanmaktad\u0131r. Bu, <code>equals()<\/code> metodumuzla uyumludur ve do\u011fru \u00e7al\u0131\u015fmay\u0131 garanti eder. Yaln\u0131zca <code>equals()<\/code> veya yaln\u0131zca <code>hashCode()<\/code> metodunu ge\u00e7ersiz k\u0131lmak, \u00e7ok ciddi sorunlara yol a\u00e7ar. Her zaman bu iki metodu birlikte ele almal\u0131s\u0131n\u0131z.<\/p>\n<p><code>hashCode()<\/code> metodunun iyi bir da\u011f\u0131l\u0131m sa\u011flamas\u0131, <code>HashMap<\/code> performans\u0131n\u0131 do\u011frudan etkiler. E\u011fer t\u00fcm nesneler ayn\u0131 veya benzer karma kodlar\u0131 \u00fcretirse, bu durum \"karma \u00e7arp\u0131\u015fmalar\u0131\" (hash collisions) art\u0131r\u0131r. Y\u00fcksek \u00e7arp\u0131\u015fma oranlar\u0131, <code>HashMap<\/code>'in kova yap\u0131s\u0131n\u0131 daha az verimli hale getirir ve arama s\u00fcresini O(1) (sabit zaman) yerine O(n) (do\u011frusal zaman) seviyelerine \u00e7\u0131karabilir, bu da b\u00fcy\u00fck veri k\u00fcmelerinde kabul edilemez bir performans d\u00fc\u015f\u00fc\u015f\u00fc anlam\u0131na gelir.<\/p>\n<h2>HashMap Nedir ve \u0130\u00e7 Yap\u0131s\u0131 Nas\u0131ld\u0131r? Verilerinizi Nas\u0131l Saklar ve Eri\u015fir?<\/h2>\n<p><code>HashMap<\/code>, Java'n\u0131n <code>java.util<\/code> paketinde bulunan, anahtar-de\u011fer \u00e7iftlerini depolayan, karma tabanl\u0131 (hash-based) bir koleksiyon s\u0131n\u0131f\u0131d\u0131r. Anahtarlar benzersizdir ve her anahtar sadece bir de\u011fere kar\u015f\u0131l\u0131k gelir. <code>HashMap<\/code>, h\u0131zl\u0131 arama, ekleme ve silme i\u015flemleri sunar ve bu nedenle Java uygulamalar\u0131nda en \u00e7ok kullan\u0131lan veri yap\u0131lar\u0131ndan biridir. Peki, bu h\u0131z\u0131n arkas\u0131ndaki sihir nedir ve <code>equals()<\/code> ile <code>hashCode()<\/code> metotlar\u0131 burada nas\u0131l bir rol oynar?<\/p>\n<p><code>HashMap<\/code>'in i\u00e7 yap\u0131s\u0131, bir dizi (array) ve ba\u011fl\u0131 listelerin (linked lists) veya Java 8'den itibaren, belirli ko\u015fullarda k\u0131rm\u0131z\u0131-siyah a\u011fa\u00e7lar\u0131n (red-black trees) bir kombinasyonuna dayan\u0131r. Bu diziye \"kovalar dizisi\" (buckets array) denir. Her bir dizin (index) bir \"kovay\u0131\" temsil eder.<\/p>\n<p>Bir anahtar-de\u011fer \u00e7ifti (<code>Entry<\/code>) <code>HashMap<\/code>'e eklendi\u011finde veya bir anahtar arac\u0131l\u0131\u011f\u0131yla de\u011ferine eri\u015filmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda a\u015fa\u011f\u0131daki ad\u0131mlar ger\u00e7ekle\u015fir:<\/p>\n<ol>\n<li><strong><code>hashCode()<\/code> Hesaplama:<\/strong> \u00d6ncelikle, anahtar nesnesinin <code>hashCode()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r ve bir tamsay\u0131 karma kodu elde edilir. Bu, nesnenin bir \"imzas\u0131\" gibidir.<\/li>\n<li><strong>Dizin (Kova) Belirleme:<\/strong> Elde edilen karma kodu, <code>HashMap<\/code>'in dahili dizi boyutuna g\u00f6re bir dizine d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Bu i\u015flem genellikle mod (%) operat\u00f6r\u00fc kullan\u0131larak yap\u0131l\u0131r (<code>index = hashCode % array_length<\/code>). Bu dizin, anahtar-de\u011fer \u00e7iftinin hangi kovada depolanaca\u011f\u0131n\u0131 veya aranaca\u011f\u0131n\u0131 g\u00f6sterir.<\/li>\n<li><strong>Kova \u0130\u00e7indeki \u0130\u015flem:<\/strong>\n<ul>\n<li><strong>Ekleme (<code>put()<\/code>):<\/strong> Belirlenen kovada zaten bir veya daha fazla eleman varsa (yani bir \u00e7arp\u0131\u015fma varsa), <code>HashMap<\/code> bu kova i\u00e7indeki elemanlar aras\u0131nda anahtar\u0131n <code>equals()<\/code> metodunu kullanarak gezinir. E\u011fer ayn\u0131 anahtara sahip bir giri\u015f bulunursa, mevcut de\u011fer yeni de\u011ferle g\u00fcncellenir. E\u011fer ayn\u0131 anahtara sahip bir giri\u015f bulunamazsa, yeni anahtar-de\u011fer \u00e7ifti bu kovan\u0131n sonuna (Java 7 ve \u00f6ncesinde ba\u011fl\u0131 liste olarak) veya kovan\u0131n i\u00e7indeki a\u011fa\u00e7 yap\u0131s\u0131na eklenir.<\/li>\n<li><strong>Eri\u015fim (<code>get()<\/code>):<\/strong> Benzer \u015fekilde, belirlenen kovada anahtara <code>equals()<\/code> metodu ile e\u015fit olan bir anahtar aran\u0131r. Bulunursa, ili\u015fkili de\u011fer d\u00f6nd\u00fcr\u00fcl\u00fcr; bulunamazsa <code>null<\/code> d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Java 8 ile birlikte, karma \u00e7arp\u0131\u015fmalar\u0131 durumunda <code>HashMap<\/code>'in performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirilmi\u015ftir. E\u011fer bir kovadaki ba\u011fl\u0131 liste belirli bir boyuta (genellikle 8) ula\u015f\u0131rsa, bu ba\u011fl\u0131 liste otomatik olarak bir k\u0131rm\u0131z\u0131-siyah a\u011faca (Red-Black Tree) d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Bu sayede, k\u00f6t\u00fc <code>hashCode()<\/code> uygulamalar\u0131ndan kaynaklanan senaryolarda bile, bir kovadaki arama s\u00fcresi O(n) yerine O(log n) seviyesine d\u00fc\u015f\u00fcr\u00fclerek performans kayb\u0131 minimize edilir.<\/p>\n<p><code>equals()<\/code> ve <code>hashCode()<\/code> metodlar\u0131n\u0131n do\u011fru bir \u015fekilde ge\u00e7ersiz k\u0131l\u0131nmas\u0131, <code>HashMap<\/code>'in beklenen davran\u0131\u015f\u0131n\u0131 ve verimlili\u011fini sa\u011flamak i\u00e7in vazge\u00e7ilmezdir. E\u011fer bu metotlar yanl\u0131\u015f uygulan\u0131rsa:<\/p>\n<ul>\n<li>Bir nesneyi <code>put()<\/code> metodu ile ekleyebilirsiniz, ancak <code>get()<\/code> metodu ile geri alamazs\u0131n\u0131z. \u00c7\u00fcnk\u00fc <code>put()<\/code> s\u0131ras\u0131nda hesaplanan karma kod ve <code>get()<\/code> s\u0131ras\u0131nda hesaplanan karma kod farkl\u0131 kovalara i\u015faret edebilir.<\/li>\n<li>Farkl\u0131 bellek adreslerine sahip, ancak i\u00e7erik olarak e\u015fit olmas\u0131 gereken nesneler, <code>HashMap<\/code> i\u00e7inde ayr\u0131 giri\u015fler olarak depolanabilir, bu da veri tutars\u0131zl\u0131\u011f\u0131na ve belle\u011fin gereksiz kullan\u0131m\u0131na yol a\u00e7ar.<\/li>\n<li><code>HashMap<\/code>'in temel avantaj\u0131 olan O(1) zaman karma\u015f\u0131kl\u0131\u011f\u0131, k\u00f6t\u00fc <code>hashCode()<\/code> da\u011f\u0131l\u0131mlar\u0131 nedeniyle O(n) veya O(log n) de\u011ferine d\u00fc\u015ferek uygulaman\u0131z\u0131n performans\u0131n\u0131 ciddi \u015fekilde etkileyebilir.<\/li>\n<\/ul>\n<p>\u00d6zetle, <code>HashMap<\/code>, arkas\u0131ndaki karma\u015f\u0131k mekanizmalar sayesinde ola\u011fan\u00fcst\u00fc performans sunar. Ancak bu performans, anahtar olarak kullan\u0131lan nesnelerin <code>equals()<\/code> ve <code>hashCode()<\/code> kontratlar\u0131na tam olarak uymas\u0131na ba\u011fl\u0131d\u0131r. Bu kontratlar ihlal edildi\u011finde, <code>HashMap<\/code>'in davran\u0131\u015f\u0131 \u00f6ng\u00f6r\u00fclemez hale gelir ve uygulaman\u0131zda ciddi sorunlar ya\u015fanabilir.<\/p>\n<aside class=\"expert-tip\">Uzman \u0130pucu: <code>HashMap<\/code> boyutunu ba\u015flang\u0131\u00e7ta tahmin edebiliyorsan\u0131z, kurucu metodunda ba\u015flang\u0131\u00e7 kapasitesini belirtmek (\u00f6rne\u011fin <code>new HashMap<>(100)<\/code>) performans i\u00e7in faydal\u0131 olabilir. Bu, s\u0131k s\u0131k yeniden boyutland\u0131rma i\u015flemlerini ve ili\u015fkili maliyetleri azalt\u0131r. Ayr\u0131ca, <code>load factor<\/code> (y\u00fck fakt\u00f6r\u00fc) de\u011feri, kova doluluk oran\u0131n\u0131 belirler ve optimize edilebilir.<\/aside>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Custom Nesneleri HashMap'te Kullanmak<\/h2>\n<p>\u015eimdiye kadar <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131n teorik olarak nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve <code>HashMap<\/code> ile ili\u015fkisini inceledik. Bu b\u00f6l\u00fcmde, bu kavramlar\u0131n ger\u00e7ek bir senaryoda nas\u0131l birle\u015fti\u011fini ve do\u011fru uygulaman\u0131n ne kadar kritik oldu\u011funu g\u00f6steren bir vaka analizine odaklanaca\u011f\u0131z. Bir e-ticaret uygulamas\u0131nda m\u00fc\u015fteri sipari\u015flerini y\u00f6netti\u011fimizi d\u00fc\u015f\u00fcnelim. Sipari\u015fler, m\u00fc\u015fterilere g\u00f6re grupland\u0131r\u0131lm\u0131\u015f ve bir <code>HashMap<\/code> i\u00e7inde saklanm\u0131\u015ft\u0131r.<\/p>\n<p>Senaryomuz: Bir al\u0131\u015fveri\u015f sitesinde m\u00fc\u015fterilerin verdi\u011fi sipari\u015fleri takip ediyoruz. Her m\u00fc\u015fterinin benzersiz bir m\u00fc\u015fteri numaras\u0131 (<code>customerNo<\/code>) var ve bu numaraya g\u00f6re m\u00fc\u015fteri nesnelerini <code>HashMap<\/code>'in anahtar\u0131 olarak kullanarak sipari\u015f listelerine eri\u015fmek istiyoruz. M\u00fc\u015fteri s\u0131n\u0131f\u0131m\u0131z\u0131 ve bir de sipari\u015f s\u0131n\u0131f\u0131m\u0131z\u0131 tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.HashMap;\n\n\/\/ M\u00fc\u015fteri s\u0131n\u0131f\u0131\nclass Musteri {\n    private String customerNo; \/\/ M\u00fc\u015fteri numaras\u0131 benzersiz kabul edilecek\n    private String ad;\n    private String soyad;\n\n    public Musteri(String customerNo, String ad, String soyad) {\n        this.customerNo = customerNo;\n        this.ad = ad;\n        this.soyad = soyad;\n    }\n\n    public String getCustomerNo() { return customerNo; }\n    public String getAd() { return ad; }\n    public String getSoyad() { return soyad; }\n\n    \/\/ equals() ve hashCode() metotlar\u0131 burada eksik!\n    \/\/ Bu durumun sonu\u00e7lar\u0131n\u0131 g\u00f6zlemleyece\u011fiz.\n\n    @Override\n    public String toString() {\n        return \"Musteri{\" +\n               \"customerNo='\" + customerNo + '\\'' +\n               \", ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               '}';\n    }\n}\n\n\/\/ Sipari\u015f s\u0131n\u0131f\u0131\nclass Siparis {\n    private String orderId;\n    private double tutar;\n\n    public Siparis(String orderId, double tutar) {\n        this.orderId = orderId;\n        this.tutar = tutar;\n    }\n\n    @Override\n    public String toString() {\n        return \"Siparis{\" +\n               \"orderId='\" + orderId + '\\'' +\n               \", tutar=\" + tutar +\n               '}';\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu s\u0131n\u0131flar\u0131 <code>HashMap<\/code> ile kullanal\u0131m ve <code>equals()<\/code>\/<code>hashCode()<\/code> ge\u00e7ersiz k\u0131l\u0131nmad\u0131\u011f\u0131nda ne olaca\u011f\u0131n\u0131 g\u00f6relim:<\/p>\n<pre><code>\npublic class HashMapSorunOrnegi {\n    public static void main(String[] args) {\n        HashMap<Musteri, List<Siparis>> musteriSiparisleri = new HashMap<>();\n\n        \/\/ \u0130lk m\u00fc\u015fteri ve sipari\u015fleri\n        Musteri musteri1 = new Musteri(\"C001\", \"Ay\u015fe\", \"Y\u0131lmaz\");\n        musteriSiparisleri.put(musteri1, new ArrayList<>(List.of(\n            new Siparis(\"ORD001\", 150.0),\n            new Siparis(\"ORD002\", 200.0)\n        )));\n\n        \/\/ Ayn\u0131 m\u00fc\u015fteri numaras\u0131nda, ancak farkl\u0131 bir nesne referans\u0131 ile ikinci m\u00fc\u015fteri\n        Musteri musteri1Tekrar = new Musteri(\"C001\", \"Ay\u015fe\", \"Y\u0131lmaz\");\n\n        \/\/ \u015eimdi, musteri1Tekrar objesi ile sipari\u015fleri almaya \u00e7al\u0131\u015fal\u0131m\n        List<Siparis> siparisler = musteriSiparisleri.get(musteri1Tekrar);\n\n        System.out.println(\"M\u00fc\u015fteri 1 (Orjinal): \" + musteri1);\n        System.out.println(\"M\u00fc\u015fteri 1 (Tekrar Olu\u015fturulan): \" + musteri1Tekrar);\n        System.out.println(\"musteri1 == musteri1Tekrar: \" + (musteri1 == musteri1Tekrar)); \/\/ Referans kar\u015f\u0131la\u015ft\u0131rmas\u0131\n        System.out.println(\"musteri1.equals(musteri1Tekrar) (Varsay\u0131lan): \" + musteri1.equals(musteri1Tekrar)); \/\/ Varsay\u0131lan equals()\n\n        if (siparisler != null) {\n            System.out.println(\"M\u00fc\u015fteri C001 i\u00e7in bulunan sipari\u015fler:\");\n            siparisler.forEach(System.out::println);\n        } else {\n            System.out.println(\"HATA: M\u00fc\u015fteri C001 i\u00e7in sipari\u015fler bulunamad\u0131!\");\n        }\n\n        \/\/ Bir de farkl\u0131 bir m\u00fc\u015fteri ekleyelim\n        Musteri musteri2 = new Musteri(\"C002\", \"Mehmet\", \"Demir\");\n        musteriSiparisleri.put(musteri2, new ArrayList<>(List.of(\n            new Siparis(\"ORD003\", 300.0)\n        )));\n\n        \/\/ musteri1Tekrar ile tekrar put yaparsak ne olur?\n        \/\/ Bu, musteri1'in sipari\u015f listesini g\u00fcncellemek yerine yeni bir giri\u015f olu\u015fturur!\n        musteriSiparisleri.put(musteri1Tekrar, new ArrayList<>(List.of(\n            new Siparis(\"ORD004\", 500.0)\n        )));\n        System.out.println(\"\\n--- \u0130kinci 'put' i\u015fleminden sonra HashMap i\u00e7eri\u011fi ---\");\n        musteriSiparisleri.forEach((m, s) -> System.out.println(m + \" -> \" + s));\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, \"HATA: M\u00fc\u015fteri C001 i\u00e7in sipari\u015fler bulunamad\u0131!\" \u00e7\u0131kt\u0131s\u0131n\u0131 g\u00f6receksiniz. Bunun nedeni, <code>musteri1<\/code> ve <code>musteri1Tekrar<\/code> nesnelerinin farkl\u0131 bellek referanslar\u0131na sahip olmas\u0131 ve varsay\u0131lan <code>equals()<\/code> ile <code>hashCode()<\/code> metotlar\u0131n\u0131n bu durumu farkl\u0131 nesneler olarak ele almas\u0131d\u0131r. <code>HashMap<\/code> i\u00e7in bunlar iki tamamen farkl\u0131 anahtard\u0131r. Hatta ikinci <code>put<\/code> i\u015flemiyle, ayn\u0131 m\u00fc\u015fteri numaras\u0131na sahip iki ayr\u0131 giri\u015f olu\u015fturulmu\u015f olur.<\/p>\n<h3>\u00c7\u00f6z\u00fcm: equals() ve hashCode() Metotlar\u0131n\u0131 Do\u011fru \u015eekilde Ge\u00e7ersiz K\u0131lmak<\/h3>\n<p>Sorunu \u00e7\u00f6zmek i\u00e7in <code>Musteri<\/code> s\u0131n\u0131f\u0131n\u0131n <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131, <code>customerNo<\/code> alan\u0131na g\u00f6re benzersizlik sa\u011flayacak \u015fekilde ge\u00e7ersiz k\u0131lmal\u0131y\u0131z:<\/p>\n<pre><code>\nimport java.util.Objects; \/\/ Musteri s\u0131n\u0131f\u0131na eklenmesi gereken import\n\nclass Musteri {\n    private String customerNo;\n    private String ad;\n    private String soyad;\n\n    public Musteri(String customerNo, String ad, String soyad) {\n        this.customerNo = customerNo;\n        this.ad = ad;\n        this.soyad = soyad;\n    }\n\n    public String getCustomerNo() { return customerNo; }\n    public String getAd() { return ad; }\n    public String getSoyad() { return soyad; }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n        Musteri musteri = (Musteri) o;\n        \/\/ customerNo alan\u0131n\u0131n e\u015fitli\u011fini kontrol ediyoruz, \u00e7\u00fcnk\u00fc bu bizim benzersiz anahtar\u0131m\u0131z.\n        return customerNo.equals(musteri.customerNo);\n    }\n\n    @Override\n    public int hashCode() {\n        \/\/ equals metodunda kullan\u0131lan ayn\u0131 alan\u0131 burada da kullan\u0131yoruz.\n        return Objects.hash(customerNo);\n    }\n\n    @Override\n    public String toString() {\n        return \"Musteri{\" +\n               \"customerNo='\" + customerNo + '\\'' +\n               \", ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               '}';\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu d\u00fczeltmeleri yapt\u0131ktan sonra <code>HashMapSorunOrnegi<\/code> kodunu tekrar \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>musteri1Tekrar<\/code> ile m\u00fc\u015fteri sipari\u015flerinin ba\u015far\u0131yla bulunabildi\u011fini ve ikinci <code>put<\/code> i\u015flemiyle mevcut sipari\u015f listesinin g\u00fcncellendi\u011fini g\u00f6receksiniz:<\/p>\n<pre><code>\n\/\/ \u00c7\u0131kt\u0131 (beklenen):\n\/\/ M\u00fc\u015fteri 1 (Orjinal): Musteri{customerNo='C001', ad='Ay\u015fe', soyad='Y\u0131lmaz'}\n\/\/ M\u00fc\u015fteri 1 (Tekrar Olu\u015fturulan): Musteri{customerNo='C001', ad='Ay\u015fe', soyad='Y\u0131lmaz'}\n\/\/ musteri1 == musteri1Tekrar: false\n\/\/ musteri1.equals(musteri1Tekrar) (Varsay\u0131lan): true  <-- Art\u0131k true d\u00f6necek!\n\/\/ M\u00fc\u015fteri C001 i\u00e7in bulunan sipari\u015fler:\n\/\/ Siparis{orderId='ORD001', tutar=150.0}\n\/\/ Siparis{orderId='ORD002', tutar=200.0}\n\/\/\n\/\/ --- \u0130kinci 'put' i\u015fleminden sonra HashMap i\u00e7eri\u011fi ---\n\/\/ Musteri{customerNo='C002', ad='Mehmet', soyad='Demir'} -> [Siparis{orderId='ORD003', tutar=300.0}]\n\/\/ Musteri{customerNo='C001', ad='Ay\u015fe', soyad='Y\u0131lmaz'} -> [Siparis{orderId='ORD004', tutar=500.0}]\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131 do\u011fru bir \u015fekilde ge\u00e7ersiz k\u0131lmak, <code>HashMap<\/code> gibi koleksiyonlar\u0131n beklenen \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in temeldir. Bu, ger\u00e7ek d\u00fcnya uygulamalar\u0131nda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan bir durumdur ve do\u011fru implementasyon, uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini ve performans\u0131n\u0131 do\u011frudan etkiler.<\/p>\n<h2>Performans\u0131 Art\u0131rmak ve Yayg\u0131n Hatalardan Ka\u00e7\u0131nmak \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h2>\n<p><code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131n do\u011fru implementasyonu, sadece kodunuzun beklendi\u011fi gibi \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda uygulaman\u0131z\u0131n performans\u0131n\u0131 da ciddi \u015fekilde etkiler. Bu b\u00f6l\u00fcmde, daha iyi performans elde etmek ve s\u0131k yap\u0131lan hatalardan ka\u00e7\u0131nmak i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131na ve p\u00fcf noktalar\u0131na de\u011finece\u011fiz.<\/p>\n<h3>1. Sadece Birini Ge\u00e7ersiz K\u0131lmay\u0131n!<\/h3>\n<p>En yayg\u0131n ve en tehlikeli hatalardan biri, sadece <code>equals()<\/code> metodunu ge\u00e7ersiz k\u0131l\u0131p <code>hashCode()<\/code> metodunu unutmakt\u0131r (veya tam tersi). Bu durum, \u00f6zellikle <code>HashMap<\/code>, <code>HashSet<\/code> gibi karma tabanl\u0131 koleksiyonlarda tahmin edilemez davran\u0131\u015flara yol a\u00e7ar. Unutmay\u0131n: e\u011fer iki nesne <code>equals()<\/code> metoduna g\u00f6re e\u015fitse, <code>hashCode()<\/code> metotlar\u0131 da ayn\u0131 de\u011feri d\u00f6nd\u00fcrmek zorundad\u0131r. Bu kontrat\u0131n ihlali, koleksiyonlar\u0131n nesneleri bulamamas\u0131na neden olur.<\/p>\n<h3>2. De\u011fi\u015fmez (Immutable) Nesneler Kullan\u0131n<\/h3>\n<p>Bir nesne <code>HashMap<\/code>'in anahtar\u0131 olarak kullan\u0131ld\u0131\u011f\u0131nda ve bu nesnenin <code>hashCode()<\/code> de\u011ferini etkileyen alanlar\u0131 sonradan de\u011fi\u015ftirilirse ne olur? Bu, nesnenin <code>HashMap<\/code>'deki \"kovas\u0131n\u0131\" de\u011fi\u015ftirebilece\u011fi anlam\u0131na gelir, ancak <code>HashMap<\/code> bu de\u011fi\u015fikli\u011fi fark etmez. Sonu\u00e7 olarak, nesne <code>HashMap<\/code>'de kaybolmu\u015f gibi g\u00f6r\u00fcn\u00fcr ve eri\u015filemez hale gelir.<\/p>\n<p>Bu t\u00fcr sorunlar\u0131 \u00f6nlemek i\u00e7in, <code>HashMap<\/code> anahtar\u0131 olarak kullan\u0131lan nesnelerin de\u011fi\u015fmez (immutable) olmas\u0131 \u015fiddetle tavsiye edilir. De\u011fi\u015fmez nesneler, olu\u015fturulduktan sonra durumlar\u0131 de\u011fi\u015ftirilemez. <code>String<\/code> s\u0131n\u0131f\u0131 buna iyi bir \u00f6rnektir. Bu, <code>hashCode()<\/code> de\u011ferinin ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca sabit kalmas\u0131n\u0131 garanti eder, b\u00f6ylece koleksiyonlarda tutarl\u0131l\u0131k sa\u011flan\u0131r.<\/p>\n<h3>3. Performansl\u0131 hashCode() ve equals() Uygulamalar\u0131<\/h3>\n<p><code>hashCode()<\/code> ve <code>equals()<\/code> metotlar\u0131n\u0131z\u0131n her zaman \u00e7ok h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131 \u00f6nemlidir, zira bu metotlar koleksiyon i\u015flemleri s\u0131ras\u0131nda s\u0131k\u00e7a \u00e7a\u011fr\u0131l\u0131r. A\u015f\u0131r\u0131 karma\u015f\u0131k veya yo\u011fun hesaplama gerektiren algoritmalar kullanmaktan ka\u00e7\u0131n\u0131n. \u00d6rne\u011fin, b\u00fcy\u00fck veri yap\u0131lar\u0131n\u0131 veya a\u011f i\u015flemlerini bu metotlar\u0131n i\u00e7ine koymak performans\u0131 d\u00fc\u015f\u00fcrecektir.<\/p>\n<p><code>hashCode()<\/code> i\u00e7in, genellikle <code>equals()<\/code> i\u00e7inde kullan\u0131lan ayn\u0131 anahtar alanlar\u0131 kullanmak yeterlidir. Java'n\u0131n <code>Objects.hash()<\/code> metodu bu konuda size yard\u0131mc\u0131 olabilir ve g\u00fcvenli, iyi da\u011f\u0131l\u0131m sa\u011flayan bir karma kodu olu\u015fturur.<\/p>\n<h3>4. Lombok ve Java Record Tipleri ile Otomasyon<\/h3>\n<p>Her s\u0131n\u0131f i\u00e7in <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131 elle yazmak, \u00f6zellikle \u00e7ok say\u0131da POJO (Plain Old Java Object) s\u0131n\u0131f\u0131n\u0131z varsa yorucu ve hata yapmaya a\u00e7\u0131k olabilir. Modern Java geli\u015ftirme ara\u00e7lar\u0131 bu s\u00fcreci basitle\u015ftirir:<\/p>\n<ul>\n<li>\n        <strong>Lombok Projesi:<\/strong> Lombok, anotasyonlar (\u00f6rne\u011fin <code>@EqualsAndHashCode<\/code>) kullanarak bu metotlar\u0131 otomatik olarak \u00fcretmenizi sa\u011flar. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve okunabilirli\u011fi art\u0131r\u0131r.<\/p>\n<pre><code>\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.AllArgsConstructor;\n\n@Getter\n@Setter\n@AllArgsConstructor\n@EqualsAndHashCode \/\/ Lombok bu anotasyon ile equals ve hashCode metotlar\u0131n\u0131 \u00fcretir.\npublic class Urun {\n    private String urunKodu;\n    private String ad;\n    private double fiyat;\n}\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Java Record Tipleri (Java 16+):<\/strong> Java 16 ile tan\u0131t\u0131lan <code>record<\/code> tipleri, veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015ft\u0131r ve varsay\u0131lan olarak de\u011fi\u015fmezdirler. Ayr\u0131ca, <code>equals()<\/code>, <code>hashCode()<\/code> ve <code>toString()<\/code> metotlar\u0131n\u0131 otomatik olarak \u00fcretirler. Bu, \u00f6zellikle veri s\u0131n\u0131flar\u0131 i\u00e7in boilerplate kodu ortadan kald\u0131r\u0131r.<\/p>\n<pre><code>\npublic record MusteriRecord(String customerNo, String ad, String soyad) {\n    \/\/ equals(), hashCode(), toString() ve getter'lar otomatik olarak \u00fcretilir.\n    \/\/ customerNo, ad, soyad alanlar\u0131na g\u00f6re e\u015fitlik kontrol\u00fc yapar.\n}\n        <\/pre>\n<p><\/code>\n    <\/li>\n<\/ul>\n<h3>5. Ge\u00e7i\u015f Kelimeleri ve Ba\u011flant\u0131l\u0131 Dil Kullan\u0131m\u0131<\/h3>\n<p>Makale boyunca \"ayr\u0131ca\", \"bununla birlikte\", \"ancak\", \"bu nedenle\", \"sonu\u00e7 olarak\", \"ek olarak\", \"\u00f6zetle\", \"\u00f6ncelikle\", \"dolay\u0131s\u0131yla\" gibi ge\u00e7i\u015f kelimelerini kullanarak paragraflar aras\u0131nda ak\u0131c\u0131 bir ge\u00e7i\u015f sa\u011flad\u0131k. Bu, okuyucunun konuyu daha kolay takip etmesine yard\u0131mc\u0131 olur ve makalenin anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>Bu ipu\u00e7lar\u0131, <code>equals()<\/code>, <code>hashCode()<\/code> ve <code>HashMap<\/code> gibi temel Java yap\u0131lar\u0131n\u0131n sadece do\u011fru de\u011fil, ayn\u0131 zamanda etkili ve performansl\u0131 bir \u015fekilde kullan\u0131lmas\u0131n\u0131 sa\u011flar. Do\u011fru uygulama, uygulaman\u0131z\u0131n uzun vadeli ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<div class=\"qa-section\">\n<h3>Equals, HashCode ve HashMap Hakk\u0131nda Merak Edilenler<\/h3>\n<div class=\"qa-item\">\n        <strong>1. Neden <code>equals()<\/code> metodunu override etti\u011fimde <code>hashCode()<\/code> metodunu da override etmek zorunday\u0131m?<\/strong><\/p>\n<p>Cevap: Bu, <code>Object<\/code> s\u0131n\u0131f\u0131n\u0131n kontrat\u0131ndan kaynaklan\u0131r. E\u011fer iki nesne <code>equals()<\/code> metoduna g\u00f6re e\u015fitse, bu nesnelerin <code>hashCode()<\/code> metotlar\u0131 da ayn\u0131 tamsay\u0131 de\u011ferini d\u00f6nd\u00fcrmek zorundad\u0131r. Bu kurala uyulmazsa, <code>HashMap<\/code> veya <code>HashSet<\/code> gibi karma tabanl\u0131 koleksiyonlarda anahtar olarak kullan\u0131lan nesneler do\u011fru \u015fekilde depolanamaz veya bulunamaz. \u00d6rne\u011fin, bir nesneyi <code>HashMap<\/code>'e ekleyip sonra e\u015fit ba\u015fka bir nesneyle almaya \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda <code>null<\/code> alabilirsiniz.<\/p>\n<\/p><\/div>\n<div class=\"qa-item\">\n        <strong>2. <code>equals()<\/code> metodunda <code>instanceof<\/code> yerine <code>getClass() != o.getClass()<\/code> kullanmak neden daha iyidir?<\/strong><\/p>\n<p>Cevap: <code>getClass() != o.getClass()<\/code> kontrol\u00fc, kar\u015f\u0131la\u015ft\u0131r\u0131lan iki nesnenin tam olarak ayn\u0131 s\u0131n\u0131ftan olmas\u0131n\u0131 zorlar. Bu, simetri kural\u0131n\u0131n ihlalini \u00f6nleyerek daha s\u0131k\u0131 bir e\u015fitlik kontrol\u00fc sa\u011flar, \u00f6zellikle kal\u0131t\u0131m (inheritance) yap\u0131s\u0131n\u0131n oldu\u011fu durumlarda. <code>instanceof<\/code> ise, bir nesnenin belirli bir s\u0131n\u0131f\u0131n bir \u00f6rne\u011fi veya onun alt s\u0131n\u0131f\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder, bu da alt s\u0131n\u0131flarla kar\u015f\u0131la\u015ft\u0131rmalarda beklenmedik simetri sorunlar\u0131na yol a\u00e7abilir.<\/p>\n<\/p><\/div>\n<div class=\"qa-item\">\n        <strong>3. <code>HashMap<\/code> neden <code>hashCode()<\/code> de\u011ferini kullan\u0131r ve <code>equals()<\/code> de\u011ferini ne zaman devreye sokar?<\/strong><\/p>\n<p>Cevap: <code>HashMap<\/code>, bir anahtar\u0131n h\u0131zl\u0131 bir \u015fekilde depolanaca\u011f\u0131 veya aranaca\u011f\u0131 \"kovay\u0131\" (bucket) belirlemek i\u00e7in \u00f6ncelikle anahtar\u0131n <code>hashCode()<\/code> de\u011ferini kullan\u0131r. Bu sayede arama alan\u0131 daralt\u0131l\u0131r. Belirlenen kovan\u0131n i\u00e7inde birden fazla eleman varsa (karma \u00e7arp\u0131\u015fmas\u0131 durumu), <code>HashMap<\/code> bu kova i\u00e7indeki her elemanla anahtar\u0131n <code>equals()<\/code> metodunu kullanarak kar\u015f\u0131la\u015ft\u0131rma yapar. Bu sayede, ayn\u0131 karma koduna sahip ancak farkl\u0131 olan nesneler aras\u0131nda do\u011fru olan\u0131 bulunur veya ekleme\/g\u00fcncelleme yap\u0131l\u0131r.<\/p>\n<\/p><\/div>\n<div class=\"qa-item\">\n        <strong>4. <code>HashMap<\/code>'in performans\u0131n\u0131 art\u0131rmak i\u00e7in ne yapmal\u0131y\u0131m?<\/strong><\/p>\n<p>Cevap: Performans\u0131 art\u0131rmak i\u00e7in birka\u00e7 yol vard\u0131r: 1) Anahtar olarak kullan\u0131lan nesneler i\u00e7in <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131 h\u0131zl\u0131 ve etkili bir \u015fekilde uygulay\u0131n, karma \u00e7arp\u0131\u015fmalar\u0131n\u0131 minimize edin. 2) <code>HashMap<\/code>'i olu\u015ftururken ba\u015flang\u0131\u00e7 kapasitesini (initial capacity) tahmin edebiliyorsan\u0131z belirtin (<code>new HashMap<>(kapasite)<\/code>). Bu, koleksiyonun s\u0131k s\u0131k yeniden boyutland\u0131r\u0131lmas\u0131n\u0131 \u00f6nler. 3) Anahtarlar\u0131n\u0131z\u0131 de\u011fi\u015fmez (immutable) yap\u0131n. Bu, <code>hashCode()<\/code> de\u011ferinin sabit kalmas\u0131n\u0131 sa\u011flar ve sorunlar\u0131 engeller.<\/p>\n<\/p><\/div>\n<div class=\"qa-item\">\n        <strong>5. Java <code>record<\/code> tipleri, <code>equals()<\/code> ve <code>hashCode()<\/code> konular\u0131na nas\u0131l bir kolayl\u0131k getiriyor?<\/strong><\/p>\n<p>Cevap: Java 16 ile tan\u0131t\u0131lan <code>record<\/code> tipleri, varsay\u0131lan olarak de\u011fi\u015fmez (immutable) veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar olu\u015fturur. Bir <code>record<\/code> tan\u0131mlad\u0131\u011f\u0131n\u0131zda, derleyici otomatik olarak bir kurucu metot, getter metotlar\u0131, <code>toString()<\/code>, <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131, t\u00fcm bile\u015fenlerine dayal\u0131 olarak \u00fcretir. Bu, \u00f6zellikle DTO'lar (Data Transfer Objects) gibi basit veri s\u0131n\u0131flar\u0131 i\u00e7in geli\u015ftiricilerin boilerplate kod yazma y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve bu metotlar\u0131n kontratlara uygun \u015fekilde uygulanmas\u0131n\u0131 garanti eder.<\/p>\n<\/p><\/div>\n<\/div>\n<p>\u00d6zetle, Java'da nesne e\u015fitli\u011fi ve koleksiyon y\u00f6netimi, <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131n do\u011fru ve tutarl\u0131 bir \u015fekilde uygulanmas\u0131na dayan\u0131r. Bu metotlar, \u00f6zellikle <code>HashMap<\/code> gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerin verimli bir \u015fekilde depolanmas\u0131, aranmas\u0131 ve al\u0131nmas\u0131 i\u00e7in kritik bir rol oynar. Varsay\u0131lan <code>Object<\/code> s\u0131n\u0131f\u0131 implementasyonlar\u0131 \u00e7o\u011fu zaman yetersiz kal\u0131rken, \u00f6zel i\u015f mant\u0131\u011f\u0131n\u0131za uygun ge\u00e7ersiz k\u0131lma (override) i\u015flemleri, uygulaman\u0131z\u0131n do\u011fru \u00e7al\u0131\u015fmas\u0131n\u0131 ve y\u00fcksek performans g\u00f6stermesini sa\u011flar. Bu makalede ele al\u0131nan prensipleri ve en iyi uygulamalar\u0131 takip ederek, Java projelerinizde kar\u015f\u0131la\u015fabilece\u011finiz olas\u0131 sorunlar\u0131n \u00f6n\u00fcne ge\u00e7ebilir ve daha sa\u011flam, g\u00fcvenilir ve performansl\u0131 yaz\u0131l\u0131mlar geli\u015ftirebilirsiniz. Unutmay\u0131n, bu iki metot her zaman el ele gider ve birini di\u011ferinden ayr\u0131 d\u00fc\u015f\u00fcnmek ciddi hatalara yol a\u00e7abilir.<\/p>\n","protected":false},"excerpt":{"rendered":"Equals, HashCode ve HashMap: Java&#8217;da Nesne E\u015fitli\u011fi ve Veri Yap\u0131lar\u0131 Y\u00f6netimi Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32466","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f<\/title>\n<meta name=\"description\" content=\"Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak bir o kadar da hayati \u00f6neme sahip konular\u0131n ba\u015f\u0131nda nesne e\u015fitli\u011fi, hashCode() ve HashMap gibi koleksiyonlar\u0131n do\u011fru kullan\u0131m\u0131 gelir. Bu kavramlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve beklenen davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler. Peki, bir nesnenin di\u011ferine e\u015fit olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Ya da HashMap gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerimiz nas\u0131l do\u011fru \u015fekilde depolan\u0131r ve h\u0131zl\u0131ca eri\u015filir? Bu makale, bu temel sorular\u0131 yan\u0131tlayarak, bu mekanizmalar\u0131 derinlemesine inceleyecek ve size s\u0131f\u0131rdan ba\u015flayarak ileri seviye ipu\u00e7lar\u0131na kadar kapsaml\u0131 bir rehber sunacakt\u0131r. Amac\u0131m\u0131z, bu karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r ve pratik \u00f6rneklerle a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakt\u0131r.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f\" \/>\n<meta property=\"og:description\" content=\"Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak bir o kadar da hayati \u00f6neme sahip konular\u0131n ba\u015f\u0131nda nesne e\u015fitli\u011fi, hashCode() ve HashMap gibi koleksiyonlar\u0131n do\u011fru kullan\u0131m\u0131 gelir. Bu kavramlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve beklenen davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler. Peki, bir nesnenin di\u011ferine e\u015fit olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Ya da HashMap gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerimiz nas\u0131l do\u011fru \u015fekilde depolan\u0131r ve h\u0131zl\u0131ca eri\u015filir? Bu makale, bu temel sorular\u0131 yan\u0131tlayarak, bu mekanizmalar\u0131 derinlemesine inceleyecek ve size s\u0131f\u0131rdan ba\u015flayarak ileri seviye ipu\u00e7lar\u0131na kadar kapsaml\u0131 bir rehber sunacakt\u0131r. Amac\u0131m\u0131z, bu karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r ve pratik \u00f6rneklerle a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakt\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-22T01:31:19+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f\",\"datePublished\":\"2025-10-22T01:31:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/\"},\"wordCount\":3587,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/\",\"name\":\"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-22T01:31:19+00:00\",\"description\":\"Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak bir o kadar da hayati \u00f6neme sahip konular\u0131n ba\u015f\u0131nda nesne e\u015fitli\u011fi, hashCode() ve HashMap gibi koleksiyonlar\u0131n do\u011fru kullan\u0131m\u0131 gelir. Bu kavramlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve beklenen davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler. Peki, bir nesnenin di\u011ferine e\u015fit olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Ya da HashMap gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerimiz nas\u0131l do\u011fru \u015fekilde depolan\u0131r ve h\u0131zl\u0131ca eri\u015filir? Bu makale, bu temel sorular\u0131 yan\u0131tlayarak, bu mekanizmalar\u0131 derinlemesine inceleyecek ve size s\u0131f\u0131rdan ba\u015flayarak ileri seviye ipu\u00e7lar\u0131na kadar kapsaml\u0131 bir rehber sunacakt\u0131r. Amac\u0131m\u0131z, bu karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r ve pratik \u00f6rneklerle a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakt\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f","description":"Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak bir o kadar da hayati \u00f6neme sahip konular\u0131n ba\u015f\u0131nda nesne e\u015fitli\u011fi, hashCode() ve HashMap gibi koleksiyonlar\u0131n do\u011fru kullan\u0131m\u0131 gelir. Bu kavramlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve beklenen davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler. Peki, bir nesnenin di\u011ferine e\u015fit olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Ya da HashMap gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerimiz nas\u0131l do\u011fru \u015fekilde depolan\u0131r ve h\u0131zl\u0131ca eri\u015filir? Bu makale, bu temel sorular\u0131 yan\u0131tlayarak, bu mekanizmalar\u0131 derinlemesine inceleyecek ve size s\u0131f\u0131rdan ba\u015flayarak ileri seviye ipu\u00e7lar\u0131na kadar kapsaml\u0131 bir rehber sunacakt\u0131r. Amac\u0131m\u0131z, bu karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r ve pratik \u00f6rneklerle a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakt\u0131r.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/","og_locale":"tr_TR","og_type":"article","og_title":"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f","og_description":"Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak bir o kadar da hayati \u00f6neme sahip konular\u0131n ba\u015f\u0131nda nesne e\u015fitli\u011fi, hashCode() ve HashMap gibi koleksiyonlar\u0131n do\u011fru kullan\u0131m\u0131 gelir. Bu kavramlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve beklenen davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler. Peki, bir nesnenin di\u011ferine e\u015fit olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Ya da HashMap gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerimiz nas\u0131l do\u011fru \u015fekilde depolan\u0131r ve h\u0131zl\u0131ca eri\u015filir? Bu makale, bu temel sorular\u0131 yan\u0131tlayarak, bu mekanizmalar\u0131 derinlemesine inceleyecek ve size s\u0131f\u0131rdan ba\u015flayarak ileri seviye ipu\u00e7lar\u0131na kadar kapsaml\u0131 bir rehber sunacakt\u0131r. Amac\u0131m\u0131z, bu karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r ve pratik \u00f6rneklerle a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakt\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-22T01:31:19+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f","datePublished":"2025-10-22T01:31:19+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/"},"wordCount":3587,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/","url":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/","name":"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-22T01:31:19+00:00","description":"Java geli\u015ftiricileri i\u00e7in s\u0131kl\u0131kla kafa kar\u0131\u015ft\u0131ran ancak bir o kadar da hayati \u00f6neme sahip konular\u0131n ba\u015f\u0131nda nesne e\u015fitli\u011fi, hashCode() ve HashMap gibi koleksiyonlar\u0131n do\u011fru kullan\u0131m\u0131 gelir. Bu kavramlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve beklenen davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler. Peki, bir nesnenin di\u011ferine e\u015fit olup olmad\u0131\u011f\u0131n\u0131 nas\u0131l anlar\u0131z? Ya da HashMap gibi karma tabanl\u0131 veri yap\u0131lar\u0131nda nesnelerimiz nas\u0131l do\u011fru \u015fekilde depolan\u0131r ve h\u0131zl\u0131ca eri\u015filir? Bu makale, bu temel sorular\u0131 yan\u0131tlayarak, bu mekanizmalar\u0131 derinlemesine inceleyecek ve size s\u0131f\u0131rdan ba\u015flayarak ileri seviye ipu\u00e7lar\u0131na kadar kapsaml\u0131 bir rehber sunacakt\u0131r. Amac\u0131m\u0131z, bu karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r ve pratik \u00f6rneklerle a\u00e7\u0131kl\u0131\u011fa kavu\u015fturmakt\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/nesne-esitligi-neden-hayati-onem-tasir-equals-metoduna-derin-bir-bakis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Nesne E\u015fitli\u011fi Neden Hayati \u00d6nem Ta\u015f\u0131r? equals() Metoduna Derin Bir Bak\u0131\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32466"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32466\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}