前两天还在想hashCode()这个方法什么时候调用呢,HashSet和HashMap这两个集合不用说,为保证元素唯一性肯定会调用HashCode,我疑惑的是其他集合创建对象会不会调用这个方法呢?今天一个小程序让我发现问题了。
import java.util.*;
class Test666
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add(new Person("a1",11));
al.add(new Person("a2",12));
al.add(new Person("a2",12));
al.add(new Person("a4",13));
//System.out.println(al);我发现这句话打印不打印完全不一样,打印的话就会调用hashCode,不打印就不会调用,这也好理解toString(),这个方法会返回一个这样的值getClass().getName() + '@' + Integer.toHexString(hashCode())。这里面调用了。这说明ArrayList创建对象没有调用hashCode来分配地址,那内存总对象建立分配的地址是靠什么方法呢?
Iterator it=al.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getName()+"::"+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int hashCode()
{
System.out.println(this.name+"...hashcode..."+this.name);
System.out.println(name.hashCode()+age);
return name.hashCode()+age;
}
}
|