A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈欢 中级黑马   /  2012-7-18 22:07  /  1443 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


无意中看见这样一个程序,中分别使用了HashMap和TreeMap,在这个程序中为什么这么用呢,有什么区别吗?请指教
import java.util.*;
import java.util.Map.*;
public class Test {
    public static void main(String[] args){
        String text = "Having a good day. Have a good class." +
            "Having a good visit. Have fun!";

        Map<String,Integer> hashMap = new HashMap<String,Integer>();

        String[] words = text.split("[ .!?]");
        for(int i=0;i<words.length;++i){
            if(words[i].length()>1){
                if(hashMap.get(words[i]) != null){
                    int value = hashMap.get(words[i]).intValue();
                    value ++;
                    hashMap.put(words[i],value);
                }else{
                    hashMap.put(words[i],1);
                }
            }
        }
        Map<String,Integer> treeMap = new TreeMap<String,Integer> ();
        treeMap.putAll(hashMap);        
        System.out.println("Display words and their count in"+" ascending order of the words1");
        System.out.println(treeMap);
    }
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

7 个回复

倒序浏览
1、为什么这么用?
练习两种Map子集合的用法。
2、有什么区别?
他用了HashMap来装元素,然后用TreeMap来对元素按键进行排序;

HashMap:底层是哈唏表,允许使用null键和null值。线程不同步。效率高
TreeMap:底层是二叉树,线程不同步,可以对Map集合的键排序。
回复 使用道具 举报
Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.
TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
回复 使用道具 举报
Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
        1,添加。
                put(K key, V value)
                putAll(Map<? extends K,? extends V> m)

        2,删除。
                clear()
                remove(Object key)

        3,判断。
                containsValue(Object value)
                containsKey(Object key)
                isEmpty()


        4,获取。
                get(Object key)
                size()
                values()

                entrySet()
                keySet()

Map
        |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
        |--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
        |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
我也不懂啊,这个程序就是我无意中看到的
回复 使用道具 举报
这段代码是按字母顺序输出该字母出现的次数 这样做是一种操作元素的思想   首先用hashmap添加元素是为了保证集合中添加的元素没有重复的  因为hasmap里的元素没有排序 所以搞个treemap集合把hashmap里的元素进行排序
你也可以直接通过treemap实现  把要添加进来的元素封装成对象  在让该对象继承comparable 搜寻判断key是否相等如果不相等 则比较value 如果value相等则返回key的比较
回复 使用道具 举报
本帖最后由 于星星 于 2012-7-18 22:54 编辑

HashMap是为了存放每个单词和单词出现的次数键值对,而TreeMap则是为了排序。当然这里面也可以直接用TreeMap,代码如下:
package test;
import java.util.*;
import java.util.Map.*;
public class Test {
    public static void main(String[] args){
        String text = "Having a good day. Have a good class." +
            "Having a good visit. Have fun!";

        Map<String,Integer> treeMap = new TreeMap<String,Integer>(); //直接使用TreeMap,不用HashMap

        String[] words = text.split("[ .!?]");
        for(int i=0;i<words.length;++i){
            if(words.length()>1){
                if(treeMap.get(words) != null){
                    int value = treeMap.get(words).intValue();
                    value ++;
                    treeMap.put(words,value);
                }else{
                    treeMap.put(words,1);
                }
            }
        }
        System.out.println("Display words and their count in"+" ascending order of the words1");
        System.out.println(treeMap);
    }
}
输出结果:
Display words and their count in ascending order of the words1
{Have=2, Having=2, class=1, day=1, fun=1, good=3, visit=1}

使用TreeMap后,你也可以自定义比较器TreeMap(Comparator<? super K> comparator)
实现自定义排序!
回复 使用道具 举报
陈欢 中级黑马 2012-7-18 22:49:35
8#
你们都是高手,看来我比较菜 ,嘻嘻
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马