集合类 重写equals()步骤和hashCode()方法 笔记一
集合类
集合类是非常有用,也是非常重要的。用法也很简单,他就像一个容器,用来装东西的,不管你要放进去的东西是对象还是基本类型都可以。
而它主要由下面的三个接口组成的:
Set:实现Set接口的类里面的内容是没有顺序,并且不能重复;
List:实现List接口的类里面的内容是有顺序,并且可以重复;
Map:实现-->Map接口的类定义了键(key)-值(value)对的方法。
除了Map接口外的两个接口都继承了Collection这个接口
怎么来区分这两个对象间是否重复呢,只要这两个对象间互相equals()就重复,这里的equals指的不是String 中的equals()方法,String中的equals是被重写过了的.
下面看一下简单的例子:
例一:
请带着一个问题去看,那就是为什么我要用父类对象指向引用对象,这会带来什么好处?(这段代码最后有说明)
源代码:
import java.util.*;
public class TestCollection
{
public static void main(String[] args)
{
Collection c=new ArrayList();
c.add(new User("dong","guo"));
c.add(new User("jxufe","Jiangxi"));
c.add(new Integer(4));
System.out.println(c);
}
}
class User
{
private String firstName;
private String lastName;
public User(String firstName,String lastName)
{
this.firstName=firstName;
this.lastName=lastName;
}
public String toString()
{
return firstName+" "+lastName;
}
}
结果:
[dong guo, jxufe Jiangxi, 4]
解释:
为什么结果会是这样呢?那是因为在调用System.out.println(c)这个方法的时候
它会自动的去调用User中的toString的方法,那么4呢,同样的,它会调用Integer类中的toString()方法
至于为什么要用Collection c=new ArrayList();这样的语句,那就好好的说一下啦。这样做的好处是当我
想要更换另一个的LinkedList类来实现的时候,我们不用再去改变下面的代码,(这里很重要)因为c这个变量只能调用它自己的方法,并不能
调用它子类的方法。所以也就成啦他子类的一个通用方法。但是能达到同样的效果
至于内部怎么操作的,我们不用去管他.这就是它的好处,以后在很多程序中
你会经常看到这样的用法的
而如果你用Arraylist al=new ArrayList();的话那就有可能会造成以后的修改不方便
而只需要改成Collection c=new LinkedList()就可以啦
例二:
这个例子,你先执行啦看看结果有什么变化再来看代码,这样效果会更好
带着这个问题去看:
那就是当我们用remove()和contains()这个方法的时候,那些值被移出啦,那些值没什么被移去。
那些值显示为true,而那些又显示为false,为什么会这样呢。这就是这个例子要解决的问题
源代码:
import java.util.*;
public class TestCollection
{
public static void main(String[] args)
{
//这里用那一个都可以,你还可以换成其它的
//Collection c=new LinkedList();
Collection c=new HashSet();
c.add("asdfg");
c.add(new User("dong","guo"));
c.add(new User("jxufe","Jiangxi"));
c.add(new Integer(4));
c.remove("asdfg");
c.remove(new Integer(4));
c.remove(new User("jxufe","Jiangxi"));
System.out.println(c.contains(new User("dong","guo")));
System.out.println(c.contains(new Integer(4)));
System.out.println(c);
}
}
class User
{
private String firstName;
private String lastName;
public User(String firstName,String lastName)
{
this.firstName=firstName;
this.lastName=lastName;
}
public String toString()
{
return firstName+" "+lastName;
}
}
结果:
[dong guo, jxufe Jiangxi]
为什么我们用啦c.remove(new User("jxufe","Jiangxi"));
并没有把它们给册掉呢?原因就是因为在用户自己定义的类中还没有重写equals和hashCode这样的方法
要使Collection中的remove()方法和contains()生效,就必须重写它们,下面是重写后的User类
代码如下:
class User
{
private String firstName;
private String lastName;
public User(String firstName,String lastName)
{
this.firstName=firstName;
this.lastName=lastName;
}
public boolean equals(Object obj)
{
if(obj instanceof User)
{
User user=(User)obj;
return firstName.equals(user.firstName) && lastName.equals(user.lastName);
}
return super.equals(obj);
}
public int hashCode()
{
return firstName.hashCode();
}
public String toString()
{
return firstName+" "+lastName;
}
}
结果:
true
false
[dong guo]