日期:2014-05-20  浏览次数:20772 次

关于HashMap()里的values()方法的一个深深的问题!
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 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方法输出的哈希码值就对了?是不是这样?


看看源码不就知道了?
public Collection<V> values() {
        if (values == null) {
            values = new AbstractCollection<V>() {
                public Iterator<V> iterator() {