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

publicclassGenericSet{publicstaticvoidmain(String[]args){Set<String>set=newHashSet<St... 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这两个方法何时需要被重写啊?
展开
 我来答
kakarlort
推荐于2017-09-12 · 超过14用户采纳过TA的回答
知道答主
回答量:44
采纳率:0%
帮助的人:36.3万
展开全部
你应该知道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方法,反之也成立。
不懂的继续讨论
冷夜寒鸟
2011-03-12 · 超过14用户采纳过TA的回答
知道答主
回答量:46
采纳率:0%
帮助的人:26.4万
展开全部
hashset容器里面应该页重写了equels和hascode方法。。在有些容器中没有重写这两个方法,而你又想将对象存到这个容器中的时候,就得重写这两方法。。为的是保证在取出对象的时候取出的对象是你存进去的对象。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
耶稣协议
2011-03-12 · 超过19用户采纳过TA的回答
知道答主
回答量:78
采纳率:0%
帮助的人:48.9万
展开全部
当比较的是栈区的数据时,重写equals
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luyt86
2011-03-12 · 超过18用户采纳过TA的回答
知道答主
回答量:51
采纳率:0%
帮助的人:0
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式