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这两个方法何时需要被重写啊?
如果不重写这两个方法,子类都将直接继承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这两个方法的用法?的主要内容,如果未能解决你的问题,请参考以下文章