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方法输出的哈希码值就对了?是不是这样?

解决方案 »

  1.   

    其实感觉一个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());
        }
    }
      

  2.   

    你的value是个类,默认是继承Object类的,你不在你的类里面重写toString方法的,必然就是调用Object的toString方法,这个和Collection还有ArrayList是没什么关系的,values方法只是获得你的value值而已。
      

  3.   

    System.out.println("键集"+stu.keySet());会自动调toString方法的
      

  4.   


    看看源码不就知道了?
    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方法