集合类 重写equals()步骤和hashCode()方法 笔记一

集合类 重写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]