Student2 student1=new Student2("李明","男");
Student2 student2=new Student2("刘丽","女");Map stu=new HashMap();
stu.put("Jack",student1);
stu.put("Rose", student2);
System.out.println("键集"+stu.keySet());
System.out.println("值集"+stu.values());
-----------------------------------------------
输出结果
键集[Jack, Rose]
值集[com.rr.test2.Student2@16caf43, com.rr.test2.Student2@66848c]
结果没问题,一起正常。
-------------------------------------------------------------通过这个结果,我发现一个问题,值输出的哈希码值?这说明输出语句"值集"+stu.values()的时候,是调用了
父类Object的toString方法,由此我得出一个结论stu.values()方法跟toString有关,于是我又查了api,
发现values()方法这么介绍的:
values
public Collection<V> values()
返回此映射所包含的值的 collection 视图。返回值这没错,我们先放一边这不是讨论的重点,重点是如何调用的父类toString方法?
我想不通public Collection<V> values()里并没有任何的Object的东西,怎么就最后调用的Object的toString方法呢?
public Collection<V> values()这个方法肯定是hashmap重写的方法,因为Hasmap是接口的一个实现类,但是HasMap重写这个方法后,方法体里到底有没有东西?写的什么东东最后就变成调用Object的toString方法了?Collection<V> values()这个代表什么?Collection<V>是个接口,里面就算有方法也都是没方法体的,那定义这样一个类型有什么用?我感觉public Collection<V> values()方法体里还有东西,肯定是返回的什么东西,反正最后就是传到Object那里,然后按toString方法输出的哈希码值就对了?是不是这样?
Student2 student2=new Student2("刘丽","女");Map stu=new HashMap();
stu.put("Jack",student1);
stu.put("Rose", student2);
System.out.println("键集"+stu.keySet());
System.out.println("值集"+stu.values());
-----------------------------------------------
输出结果
键集[Jack, Rose]
值集[com.rr.test2.Student2@16caf43, com.rr.test2.Student2@66848c]
结果没问题,一起正常。
-------------------------------------------------------------通过这个结果,我发现一个问题,值输出的哈希码值?这说明输出语句"值集"+stu.values()的时候,是调用了
父类Object的toString方法,由此我得出一个结论stu.values()方法跟toString有关,于是我又查了api,
发现values()方法这么介绍的:
values
public Collection<V> values()
返回此映射所包含的值的 collection 视图。返回值这没错,我们先放一边这不是讨论的重点,重点是如何调用的父类toString方法?
我想不通public Collection<V> values()里并没有任何的Object的东西,怎么就最后调用的Object的toString方法呢?
public Collection<V> values()这个方法肯定是hashmap重写的方法,因为Hasmap是接口的一个实现类,但是HasMap重写这个方法后,方法体里到底有没有东西?写的什么东东最后就变成调用Object的toString方法了?Collection<V> values()这个代表什么?Collection<V>是个接口,里面就算有方法也都是没方法体的,那定义这样一个类型有什么用?我感觉public Collection<V> values()方法体里还有东西,肯定是返回的什么东西,反正最后就是传到Object那里,然后按toString方法输出的哈希码值就对了?是不是这样?
import java.util.Map;
public class Student2
{ private String name; private String sex; public Student2(String name, String sex)
{
this.name = name;
this.sex = sex;
} @Override
public String toString()
{
return "[name:" + name + ";sex:" + sex + "]";
}
public static void main(String[] args)
{
Student2 student1=new Student2("李明","男");
Student2 student2=new Student2("刘丽","女"); Map stu=new HashMap(); stu.put("Jack",student1); stu.put("Rose", student2); System.out.println("键集"+stu.keySet()); System.out.println("值集"+stu.values());
}
}
看看源码不就知道了?
public Collection<V> values() {
if (values == null) {
values = new AbstractCollection<V>() {
public Iterator<V> iterator() {
return new Iterator<V>() {
private Iterator<Entry<K,V>> i = entrySet().iterator(); public boolean hasNext() {
return i.hasNext();
} public V next() {
return i.next().getValue();
} public void remove() {
i.remove();
}
};
} public int size() {
return AbstractMap.this.size();
} public boolean isEmpty() {
return AbstractMap.this.isEmpty();
} public void clear() {
AbstractMap.this.clear();
} public boolean contains(Object v) {
return AbstractMap.this.containsValue(v);
}
};
}
return values;
}values就是一个"值"的Collection集合而已
而且输出也没问题啊,System.out.....会自动调用Object的toString方法