黑马程序员技术交流社区

标题: 为什么HashSet和HashMap,输出的内容外扩号不同呢 [打印本页]

作者: 臭和尚    时间: 2014-9-27 19:23
标题: 为什么HashSet和HashMap,输出的内容外扩号不同呢
  1. HashSet<String> hs = new HashSet<String>();
  2.                 hs.add("hashset");
  3.                 System.out.println(hs);
  4.                
  5.                 System.out.println("--------");
  6.                
  7.                 HashMap<String,String> hm = new HashMap<String,String>();
  8.                 hm.put("hashmap", "");
  9.                 System.out.println(hm);
  10.                
复制代码
HashSet输出是[],中括号
HashMap输出是{},大括号
[hashset]
--------
{hashmap=}

谁帮忙解释一下,谢谢!

作者: 依然超级赛亚人    时间: 2014-9-27 22:51
我感觉这应该是它们的toString方法不一样的缘故,你如果重写toString方法也可以按照你想要的方式输出。
作者: 臭和尚    时间: 2014-9-28 00:20
依然超级赛亚人 发表于 2014-9-27 22:51
我感觉这应该是它们的toString方法不一样的缘故,你如果重写toString方法也可以按照你想要的方式输出。 ...

集合分为3种,List、Set、Map。。前面2种存储数据跟数组类似,只能同时存一种,所以用[ ]表示类似数组,而后面那种是映射关系,是以成对出现的,跟数组完全不一样,所以以是区分就用{ }了。这可能是一种代码规范吧。。。HashMap继承自AbstractMap,AbstractMap实现了Map....


刚问的一个学的比较好的同学,他给的说法
作者: Fightin黑马    时间: 2014-9-28 10:48
翻了下源码
hashSet里的toString方法是继承自AbstractCollection,里面重写了toString方法
public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }
hashMap里的toString继承自AbstractMap,里面重写了toString
public String toString() {
        Iterator<Entry<K,V>> i = entrySet().iterator();
        if (! i.hasNext())
            return "{}";

        StringBuilder sb = new StringBuilder();
        sb.append('{');
        for (;;) {
            Entry<K,V> e = i.next();
            K key = e.getKey();
            V value = e.getValue();
            sb.append(key   == this ? "(this Map)" : key);
            sb.append('=');
            sb.append(value == this ? "(this Map)" : value);
            if (! i.hasNext())
                return sb.append('}').toString();
            sb.append(',').append(' ');
        }
    }
作者: 更上一层    时间: 2014-9-28 10:57
Systen.out.println()    输出之前会调用对象的toString()方法,HashSet与HashMap的toString方法是不同的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2