关于HashMap()里的values()方法的一个深深的问题!

沧海苍龙 2013-06-24 07:41:35
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方法输出的哈希码值就对了?是不是这样?





...全文
316 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gary_sin 2013-06-24
  • 打赏
  • 举报
回复
你的value是个类,默认是继承Object类的,你不在你的类里面重写toString方法的,必然就是调用Object的toString方法,这个和Collection还有ArrayList是没什么关系的,values方法只是获得你的value值而已。
oh_Maxy 2013-06-24
  • 打赏
  • 举报
回复
其实感觉一个Map<K,V> 模型,类似两个List:List<K>和List<V>,将他们俩对应起来而已。这里恰好K是String,toString方法明确,因此会有个比较清晰的打印。 另外,我们用keySet和values方法也不多,保证各自的toString设计好即可。如果想知道具体Map里的Collection的toString咋实现的,可以跟下源码。 LZ试试这样的:

import java.util.HashMap;
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());
    }
}
LCore 2013-06-24
  • 打赏
  • 举报
回复
引用 楼主 aaalongaaa 的回复:
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() {
                    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方法
ss36290109 2013-06-24
  • 打赏
  • 举报
回复
System.out.println("键集"+stu.keySet());会自动调toString方法的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧