1. 程式人生 > >數據結構---Java---HashSet

數據結構---Java---HashSet

png div test eof style jdk ins override image

1、概述

    1.1  HashSet不是線程安全的;

    1.2  當向HashSet存入元素時,調用該對象的hashCode()值,根據hashCode()值來決定元素的存儲位置;

          如果hashCode()值的位置沒有元素,直接插入;

          如果hashCode()值的位置已有元素,再比較equals(),如果equals()比較相同,視為同一個元素;

              如果equals()比較不同,將試圖將元素保存到同一位置,實際上不允許(只能存一個元素);

        【解決】

          *********JDK給出重寫hashCode()的規則:***********

            1.1.1  當2個對象的equals返回true,它們的hashCode()應該相等;

            1.1.2  對象中用作equals比較的屬性,都應該用來計算hashCode()值;

2、案例

package com.exiuge.mytest.hashset;

public class Person {

    private int age;

    private String name;

    public Person(){

    }

    public Person(int age,String name){
        
this.age=age; this.name=name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override
public int hashCode() { return this.name.hashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof Person){ Person p=(Person) obj; if (p.getName().equals(this.name)){ return true; } } return false; } }
package com.exiuge.mytest.hashset;

import java.util.HashSet;
import java.util.Set;

public class Test {

    public static void main(String[] args){
        Person p1=new Person(12,"a");
        Person p2=new Person(12,"a");
        Set set=new HashSet();
        boolean a=set.add(p1);
        boolean b=set.add(p2);
        System.out.println("p1 hashCode:"+p1.hashCode());
        System.out.println("p2 hashCode:"+p2.hashCode());
        System.out.println("equals:"+p1.equals(p2));
        System.out.println(a+"====="+b);
    }
}

執行結果:

技術分享圖片

數據結構---Java---HashSet