`

Java 集合--Map、HashMap、HashTable、TreeMap

阅读更多

1. Map基础

 

    Map接口提供3种集合的视图:
    map的key不能够重复,value可以
    (1)key-value映射集合 — entrySet() 返回包含映射的Set视图。Set中的每个元素都是一个Map.Entry对象,可以使用 getKey()和getValue()方法(还有一个setValue() 方法)访问后者的键元素和值元素
    (2)key集合 — keySet() 包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值)
    (3)value集合,values() 是值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值)
    我们还必须获得一个Iterator对象,进而取得相应的key-value映射、key和value。

Iterator keyValuePairs = aMap.entrySet().iterator();
Iterator keys = aMap.keySet().iterator();//keys.remove();删除当前键值对
Iterator values = aMap.values().iterator();//values.remove();删除当前键值对

     Map增删方法
    clear() 从 Map 中删除所有映射 
    remove(Object key) 从 Map 中删除键和关联的值 
    put(Object key, Object value) 将指定值与指定键相关联


    Map访问方法
    get(Object key) 返回与指定键关联的值 
    containsKey(Object key) 如果 Map 包含指定键的映射,则返回true
    containsValue(Object value) 如果此 Map 将一个或多个键映射到指定值,则返回 true
    isEmpty() 如果 Map 不包含键-值映射,则返回 true 
    size() 返回 Map 中的键-值映射的数目

 

2. HashMap和HashTable的区别

 

    Hashtable继承自Dictionary类, size()表示包含了多少元素;isEmpty()判断是否包含了元素;put(Object key, Object value)添加一个值;get(Object key)获得与某个键对应的值;而remove(Object Key)从列表中删除“键-值”对。还可以使用枚举技术:keys()产生对键的一个枚举(Enumeration);而elements()产生对所有值的一个枚举。这便是一个Dictionary(字典)的全部。


    (1) 继承和实现区别
    Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
    (2) 线程安全不同
    HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。HashMap效率高
    (3) 对null的处理不同
    HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
    HashTable 不允许null值,编译期不会检查,运行期会出现空指针异常。HashMap允许 null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
    (4) 方法不同   

    HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
    (5) HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

 

    HashTable

 public static void hashTableTest(){
        Hashtable hash = new Hashtable();
        hash.put("abc", "1");
        hash.put("ddd", "1");
        hash.put("asdf", "2");
        // hash.put("asdfsad", null); NullPointerException
        System.out.println("迭代方法1:entrySet");
        Set entrySet = hash.entrySet();
        for(Iterator i=entrySet.iterator();i.hasNext();){
            Entry entry = (Entry)i.next();
            System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
        }
        Set set = hash.keySet();
        System.out.println("迭代方法2:keySet");
        for(Iterator i=set.iterator();i.hasNext();){
            String key = (String)i.next();
            System.out.println("key:"+key+",value:"+hash.get(key));
        }
        System.out.println("迭代方法3: values");
        Collection values = hash.values();
        for(Iterator i=values.iterator();i.hasNext();){
            System.out.println("value:"+i.next());
        }
        System.out.println("迭代方法4: keys");
        Enumeration enumkey = hash.keys();
        while (enumkey.hasMoreElements()) {
            String str = (String) enumkey.nextElement();
            System.out.println(str + " --- " + hash.get(str));
            if ("1".equals(hash.get(str)))
                hash.remove(str);
        }
        System.out.println("asdf:" + hash.get("asdf"));
        enumkey = hash.elements();
        while (enumkey.hasMoreElements()) {
            String str = (String) enumkey.nextElement();
            System.out.println(str );
        }  
    }  

 

2. Map排序

 

    Map排序,可以按key排序,也可以按value排序,示例代码如下:

public static void main(String[] args) {
        Map<String, Integer> maps = new HashMap<String, Integer>();
        maps.put("boy", 8);
        maps.put("cat", 7);
        maps.put("dog", 1);
        maps.put("apple", 5);
        //排序前的输出
        Iterator i = maps.entrySet().iterator();
        while (i.hasNext()) {
            Map.Entry<String, Integer> entry1 = (Map.Entry<String, Integer>) i.next();
            System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
        }
        System.out.println("排序后的输出:");
        List<Map.Entry<String, Integer>> info = new ArrayList<Map.Entry<String, Integer>>(maps
                .entrySet());
        Collections.sort(info, new Comparator<Map.Entry<String, Integer>>() {

            public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2) {
                return obj1.getKey().compareTo(obj2.getKey());//按key排序
                //return obj2.getValue() - obj1.getValue(); //按value排序
            }
        });

        for (int j = 0; j < info.size(); j++) {
            System.out.println(info.get(j).getKey() + "------->" + info.get(j).getValue());
        }
    }
 

3. Map遍历

 

public static void iterationTest() {
        Map<String, Integer> tempMap = new HashMap<String, Integer>();
        tempMap.put("a", 1);
        tempMap.put("b", 2);
        tempMap.put("c", 3);
        // JDK1.4中
        // 遍历方法一 hashmap entrySet() 遍历
        System.out.println("方法一");
        Iterator it = tempMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println("key=" + key + " value=" + value);
        }
        System.out.println("");
        // JDK1.5中,应用新特性For-Each循环
        // 遍历方法二
        System.out.println("方法二");
        for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {
            String key = entry.getKey().toString();
            String value = entry.getValue().toString();
            System.out.println("key=" + key + " value=" + value);
        }
        System.out.println("");

        // 遍历方法三 hashmap keySet() 遍历
        System.out.println("方法三");
        for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {
            Object obj = i.next();
            System.out.println(obj);// 循环输出key
            System.out.println("key=" + obj + " value=" + tempMap.get(obj));
        }
        for (Iterator i = tempMap.values().iterator(); i.hasNext();) {
            Object obj = i.next();
            System.out.println(obj);// 循环输出value
        }
        System.out.println("");

        // 遍历方法四 treemap keySet()遍历
        System.out.println("方法四");
        for (Object o : tempMap.keySet()) {
            System.out.println("key=" + o + " value=" + tempMap.get(o));
        }
        System.out.println("11111");

        // java如何遍历Map <String, ArrayList> map = new HashMap <String,ArrayList>();

        Map<String, ArrayList> map = new HashMap<String, ArrayList>();
        Set<String> keys = map.keySet();
        Iterator<String> iterator = keys.iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            ArrayList arrayList = map.get(key);
            for (Object o : arrayList) {
                System.out.println(o + "遍历过程");
            }
        }
        System.out.println("2222");
        Map<String, List> mapList = new HashMap<String, List>();
        for (Map.Entry entry : mapList.entrySet()) {
            String key = entry.getKey().toString();
            List<String> values = (List) entry.getValue();
            for (String value : values) {
                System.out.println(key + " --> " + value);
            }
        }
    }
 

 

分享到:
评论

相关推荐

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Map接口用于保存具有key-value映射关系的数据,常见的Map实现包括HashMap、TreeMap、HashTable和LinkedHashMap等。Queue是Java提供的队列实现。 本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    ### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...

    Java集合类List-Set-Map的区别和联系.doc

    HashMap 是一个基于哈希表的集合类,HashTable 是一个线程安全的基于哈希表的集合类,TreeMap 是一个基于树形结构的集合类。 三、Collections Collections 是 Java 中提供的一个工具类,提供了对集合类的操作方法...

    【IT十八掌徐培成】Java基础第11天-04.Map集合-集合整理.zip

    在IT领域,尤其是在Java编程中,Map集合是一个至关重要的数据结构。Map集合不同于List或Set,它不存储单一元素,而是存储键值对(key-value pairs)。在Java中,Map接口是所有映射类型的父接口,它定义了映射的基本...

    HashMap,HashTable,LinkedHashMap,TreeMap的区别

    其中,HashMap, HashTable, LinkedHashMap, TreeMap 是四种常用的 Map 实现类,每种类都有其特点和用途。本文将对这四种 Map 实现类进行比较和分析。 HashMap HashMap 是 Java 中最常用的 Map 实现类,它根据键的 ...

    java 集合----Map、Collection

    Java集合框架是编程中不可或缺的一部分,它提供了多种数据结构,如列表(List)、集(Set)以及映射(Map),便于我们高效地存储、管理和操作数据。本文将深入探讨Map和Collection接口,以及它们的实现类,特别是HashSet和...

    JSP应用开发-Java集合类-Map接口.pptx

    总的来说,理解并熟练运用Java集合框架中的Map接口及其实现,对于JSP应用开发来说至关重要。正确选择和使用这些类可以帮助我们编写出高效、可维护的代码。在实际项目中,应根据具体需求和场景来决定使用哪种集合类型...

    Java集合框架常见面试题.pdf

    - Map的主要实现类有HashMap、TreeMap、Hashtable和Properties。 - HashMap是基于哈希表实现,不保证映射的顺序。 - TreeMap基于红黑树实现,可以保持键的排序状态。 - Hashtable是线程安全的,但因为是同步的,...

    40道java集合面试题含答案(很全很详细)

    - Map接口的实现类有HashMap、TreeMap、Hashtable、ConcurrentHashMap和Properties。 6. **List、Set、Map的区别**: - List:有序,元素可重复,允许多个null,通过索引访问。 - Set:无序,元素唯一,仅允许一...

    Java集合部分面试题.docx

    Java集合框架是Java编程语言中的核心部分,它提供了对数据组织和操作的高效机制。面试中,Java集合框架的相关问题经常出现,以下是一些关键知识点的详细解释: 1. **集合框架的基本接口**: - **Collection**: 是...

    精通java集合框架--List,Set..

    ### 精通Java集合框架——List, Set, Map #### 概述 Java集合框架是一种高度抽象且灵活的数据组织工具,它通过一系列接口来定义不同类型的数据容器,并提供了丰富的操作这些容器的方法。本文将深入探讨Java集合...

    【IT十八掌徐培成】Java基础第11天-01.Map集合.zip

    Map接口的主要实现类有HashMap、TreeMap、LinkedHashMap、Hashtable等,它们各自有不同的特性和使用场景。 1. HashMap:HashMap是最常用的Map实现,它允许null键和null值。基于哈希表实现,因此具有快速的插入、...

    2024年java面试题-java集合相关面试题

    根据给定文件的信息,我们可以总结出以下关于Java集合的相关知识点: ### 一、集合容器概述 #### 1. 什么是集合? 集合(Collection)是指在Java中用来存储、检索及操作一组对象的一种容器。它是一种高级的数据...

    Java集合面试题 52道.pdf

    - Map接口的实现类:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties。 4. 关于集合的线程安全问题,有如Vector和Hashtable这样的类,它们通过内部同步机制(synchronized关键字)提供了线程安全的...

    Java 72道面试题和答案.docx

    - `Map`接口的实现类:HashMap、TreeMap、Hashtable、ConcurrentHashMap和Properties等。 - `Collection`接口的子接口:Set接口和List接口。 - Set接口的实现类:HashSet、TreeSet、LinkedHashSet等。 - List...

    第9讲 对比Hashtable、HashMap、TreeMap有什么不同?1

    HashMap、Hashtable和TreeMap都是Java中实现Map接口的类,它们用于存储键值对数据,但各自具有不同的特点和使用场景。 HashMap是最常用的Map实现,它通过哈希表(散列表)实现,提供快速的插入、查找和删除操作,...

    Java Map 集合类简介

    Java的核心类库提供了多种Map实现,如HashMap、TreeMap、LinkedHashMap、Hashtable等。HashMap是默认的无序、非同步实现,适合大多数情况;TreeMap基于红黑树,提供了有序的键值对,但性能略低于HashMap;...

Global site tag (gtag.js) - Google Analytics