java中hashcode和equals这两个方法的用法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中hashcode和equals这两个方法的用法?相关的知识,希望对你有一定的参考价值。

public class GenericSet

public static void main(String[] args)
Set<String> set = new HashSet<String>();

set.add("aa");
set.add("bb");
set.add("cc");
set.add("dd");

for(Iterator<String> iter = set.iterator(); iter.hasNext();)
String value = iter.next();
System.out.println(value);

System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

Set<People> set2 = new HashSet<People>();

set2.add(new People("zhangsan",18,"luoyang"));
set2.add(new People("lisi",18,"zhengzhou"));
set2.add(new People("wangwu",18,"beijing"));

for(Iterator<People> iter = set2.iterator();iter.hasNext();)
People people = iter.next();

String name = people.getName();
int age = people.getAge();
String Address = people.getAddress();

System.out.println(name+","+age+","+Address);




class People
private String name;
private int age;
private String Address;

public People(String name, int age, String Address)
this.name = name;
this.age = age;
this.Address = Address;

@Override
public int hashCode()
final int prime = 31;
int result = 1;
result = prime * result + ((Address == null) ? 0 : Address.hashCode());
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;

@Override
public boolean equals(Object obj)
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (Address == null)
if (other.Address != null)
return false;
else if (!Address.equals(other.Address))
return false;
if (age != other.age)
return false;
if (name == null)
if (other.name != null)
return false;
else if (!name.equals(other.name))
return false;
return true;

public String getName()
return name;

public void setName(String name)
this.name = name;

public int getAge()
return age;

public void setAge(int age)
this.age = age;

public String getAddress()
return Address;

public void setAddress(String address)
Address = address;



这个里面people类里面 为什么要生成hashcode和equals这两个方法? 不生成这两个方法这个程序照样可以运行,没有受影响啊? hashcode和equals这两个方法何时需要被重写啊?

你应该知道HashSet实现了Set接口。而且也应该知道Set集合是不能包含重复元素的。那么怎么判断要add的对象是否是重复的元素呢?这就是用hashCode()方法判断的。hashCode()是Object类的方法(equals()方法也是),所有类都间接或直接继承了Object类,因此都继承了hashCode()方法。Object类的hashCode()方法的返回值以整数形式表示一个对象的地址(未必是真正的地址,通过某种转换表示这个地址而已),即当调用HashSet的add(Object a)时,将a的hashCode值(直接说成hashCode值)与已有元素的hashCode值进行比较,如果不同则直接加进去,如果hashCode值相同则接着调用equals方法比较,如果equals方法返回真则不加,返回true则加进去。
如果不重写这两个方法,子类都将直接继承Object的两个方法,即会直接比较两个对象的地址。这在实际项目开发中意义较少的,一般情况下都会希望以内容来判断时候能加进去(即add)。
比如当
People a = new People("zhangsan");
People b = new People("zhangsan");
set.add(a);
set.add(b);
这个时候,如果不重写hashCode方法的话,a和b两个对象都可以加进去的,因为直接继承Object类的,hashCode方法,即比较两个地址。而两个对象的地址肯定是不一样的。
而我们希望的是以name(People的一个成员变量)来判断是否能加进去(比如实际项目中希望存名字不一样的人),这个时候就需要重写hashCode方法来实现这个功能了。就是让上面的set.add(b)不能加进去,因为名字同样是张三的对象,加进去没用。。。大概这些意思吧(说的比较啰嗦,希望你能体会)
对了一般重写hashCode方法的时候也会重写equals方法,反之也成立。
不懂的继续讨论
参考技术A hashset容器里面应该页重写了equels和hascode方法。。在有些容器中没有重写这两个方法,而你又想将对象存到这个容器中的时候,就得重写这两方法。。为的是保证在取出对象的时候取出的对象是你存进去的对象。。 参考技术B 当比较的是栈区的数据时,重写equals 参考技术C 可以参考一下
http://startor.javaeye.com/blog/381627

以上是关于java中hashcode和equals这两个方法的用法?的主要内容,如果未能解决你的问题,请参考以下文章

java里equals和hashCode之间啥关系

Java中的equals和hashCode方法详解

Java中的equals和hashCode方法

JAVA中重写equals()方法的同时要重写hashcode()方法

Java中的equals和hashCode方法详解

Java中关于equals()和hashCode()的问题