`

Collection -- Map

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/1562357

 

Map的底层实现

数组+链表

Note:

HashSet底层也是用HashMap实现的

 

Map

映射(map)是一个存储关键字和值的关联或者说是关键字/值对的对象。给定一个关键字,可以得到它的值。关键字和值都是对象。关键字必须是唯一的。但值是可以重复的。有些映射可以接收null关键字和null值。而有的则不行。

 

Map接口映射唯一关键字到值。关键字(key)是以后用于检索值的对象。给定一个关键字和一个值,可以存储这个值到一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它。当调用的映射中没有项存在时,其中的几种方法

会引发一个NoSuchElementException异常。而当对象与映射中的元素不兼容时,引发一个ClassCastException异常。如果试图使用映射不允许使用的null对象时,则引发一个NullPointerException异常。当试图改变一个不允许修改的映射时,则引发一个UnsupportedOperationException异常。

 

映射循环使用两个基本操作:get( )和put( )。使用put( )方法可以将一个指定了关键字和值的值加入映射。为了得到值,可以通过将关键字作为参数来调用get( )方法。调用返回该值。

MapTest01

package com.fairy.test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTest01 {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();

		map.put("a", "aa");
		map.put("b", "bb");
		map.put("c", "cc");
		map.put("d", "dd");

		Set<String> set = map.keySet();

		for (Iterator<String> iter = set.iterator(); iter.hasNext();) {
			String key = iter.next();
			String value = map.get(key);

			System.out.println(key + "=" + value);
		}
	}
}

  

映射不是类集,但可以获得映射的类集“视图”。为了实现这种功能,可以使用entrySet( )方法,它返回一个包含了映射中元素的集合(Set)。为了得到关键字的类集“视图”,可以使用keySet( )方法。为了得到值的类集“视图”,可以使用

values( )方法。类集“视图”是将映射集成到类集框架内的手段。

 

Map.Entry接口使得可以操作映射的输入。回想由Map接口说明的entrySet( )方法,调用该方法返回一个包含映射输入的集合(Set)。这些集合元素的每一个都是一个Map.Entry对象。

MapTest02

package com.fairy.test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MapTest02 {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		
		map.put("a", "aa");
		map.put("b", "bb");
		map.put("c", "cc");
		map.put("d", "dd");
		
		Set<Entry<String, String>> set = map.entrySet();
		
		System.out.println(set);
		
		for (Iterator<Entry<String, String>> iter = set.iterator(); iter.hasNext();) {
			Map.Entry<String, String> entry = iter.next();
			
			String key = entry.getKey();
			String value = entry.getValue();
			
			System.out.println(key + ":" + value);
		}
	}
}

 

Hashtable和HashMap的区别

主要是两点,还有一些琐碎的细节自行查看src

  • Hashtable线程安全;HashMap线程不安全
  • Hashtable的key、value都不可以为null;HashMap的key、value都可以为null

 

HashMap、LinkedHashMap、TreeMap和PriorityQueue的区别

HashMap

HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。

 

LinkedHashMap

LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.  (应用场景:购物车等需要顺序的)

 

TreeMap

TreeMap是基于红黑二叉树的NavigableMap的实现,取出来的是排序后的键值对。但如果要按自然顺序或自定义顺序遍历键,那么TreeMap会更好

 

PriorityQueue

PriorityQueue只保证最高或者最低优先级的元素在头部,并且是无序

package org.fool.java.test;

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Map<String, String> linkedMap = new LinkedHashMap<>();
        linkedMap.put("e", "0");
        linkedMap.put("d", "1");
        linkedMap.put("c", "2");
        linkedMap.put("b", "3");
        linkedMap.put("a", "4");

        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("e", "0");
        hashMap.put("d", "1");
        hashMap.put("c", "2");
        hashMap.put("b", "3");
        hashMap.put("a", "4");

        Queue<Integer> queue = new PriorityQueue<>();
        queue.add(6);
        queue.add(7);
        queue.add(8);
        queue.add(9);
        queue.add(1);
        queue.add(2);
        queue.add(3);
        queue.add(4);
        queue.add(5);

        System.out.println("LinkedHashMap: " + linkedMap);
        System.out.println("HashMap: " + hashMap);
        System.out.println("PriorityQueue: " + queue);
    }
}

Console Output


 

TreeMap排序

TreeMapTest.java

package org.fool.java.collections;

import java.util.*;

public class TreeMapTest {
    public static void main(String[] args) {
        // sort by key
        Map<String, Integer> keyMap = new TreeMap<>(
                (o1, o2) -> o2.compareTo(o1)    // sort by key desc
        );

        keyMap.put("a", 22);
        keyMap.put("b", 32);
        keyMap.put("c", 12);
        keyMap.put("d", 42);

        System.out.println(keyMap);    // {d=42, c=12, b=32, a=22}

        // sort by value
        Map<String, Integer> valueMap = new TreeMap<>();
        valueMap.put("a", 22);
        valueMap.put("b", 32);
        valueMap.put("c", 12);
        valueMap.put("d", 42);

        List<Map.Entry<String, Integer>> list = new ArrayList<>(valueMap.entrySet());
        Collections.sort(list, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));     // sort by value asc

        Map<String, Integer> sortedMap = new LinkedHashMap<>();
        for (Map.Entry<String, Integer> entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }

        System.out.println(sortedMap);      // {c=12, a=22, b=32, d=42}
    }
}

Note:

这个类加入了JDK8的Lambda特性来简化Comparator接口的编写

Console Output


 

使用JDK8的Stream特性重写TreeMap排序

package org.fool.java.collections;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Stream;

public class MapSortByGenericExample {
    public static void main(String[] args) {
        Map<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("z", 10);
        unsortedMap.put("b", 5);
        unsortedMap.put("a", 6);
        unsortedMap.put("c", 20);
        unsortedMap.put("d", 1);
        unsortedMap.put("e", 7);
        unsortedMap.put("y", 8);
        unsortedMap.put("n", 99);
        unsortedMap.put("j", 50);
        unsortedMap.put("m", 2);
        unsortedMap.put("f", 9);

        System.out.println("Original...");
        System.out.println(unsortedMap);

        System.out.println("Sort By Key...");
        Map<String, Integer> resultKey = compareByKey(unsortedMap);
        System.out.println(resultKey);

        System.out.println("Sort By Value...");
        Map<String, Integer> resultValue = compareByValue(unsortedMap);
        System.out.println(resultValue);
    }

    public static <K, V extends Comparable<? super V>> Map<K, V> compareByValue(Map<K, V> map) {

        Map<K, V> result = new LinkedHashMap<>();

        Stream<Map.Entry<K, V>> mapInStream = map.entrySet().stream();

        mapInStream.sorted(Map.Entry.comparingByValue())
                .forEachOrdered(x -> result.put(x.getKey(), x.getValue()));

        return result;
    }

    public static <K extends Comparable<? super K>, V> Map<K, V> compareByKey(Map<K, V> map) {

        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> mapInStream = map.entrySet().stream();

        mapInStream.sorted(Map.Entry.comparingByKey())
                .forEachOrdered(x -> result.put(x.getKey(), x.getValue()));

        return result;
    }
}

Console Output


 

Reference

http://www.mkyong.com/java/how-to-sort-a-map-in-java/

http://www.mkyong.com/java8/java-8-how-to-sort-a-map/ 

 

 

  • 大小: 14.2 KB
  • 大小: 11 KB
  • 大小: 19.5 KB
分享到:
评论

相关推荐

    css-effect-map-collection-master.zip

    本篇文章将深入探讨名为"css-effect-map-collection-master.zip"的资源包,它是一个收集了多种美观CSS效果的集合,对于提升WebUI组件和框架的设计感具有重要意义。 首先,我们来看这个压缩包的名称——"css-effect-...

    collection-core-1.1.zip

    在Java中,集合框架是处理对象数组的关键工具,它提供了接口(如List、Set、Map)以及实现这些接口的类(如ArrayList、HashSet、HashMap)。"collection-core-1.1" 可能包含了对这些接口和类的增强或扩展,提供了更...

    Collection-and-Map.zip_java list map

    关于Map,List,collection集合遍历,泛型等

    Laravel开发-collection-macros

    `collection macros` 是一种自定义扩展Laravel Collection类的方法,允许开发者添加自己的便捷功能,以满足特定项目的需求。 标题"Laravel开发-collection-macros"暗示了这个压缩包可能包含了一组自定义的...

    Laravel开发-laradeck-collection-macros

    集合是PHP的`Illuminate\Support\Collection` 类的一个实例,它是对数组的封装,提供了许多实用的链式方法,如map、filter、each、reduce等,这些方法让代码更简洁,可读性更强。集合可以被视为不可变的数组,每次...

    collection-type:库CollectionMap和子类型,其中包含检查PHP类型的信息

    CollectionType是一个库,为Collection和Map提供了它们的子类型,这些子类型正在检查PHP的数据集类型。 要求 PHP 5.5.0或更高版本 安装 CollectionType正式仅支持通过Composer进行安装。 有关Composer文档,请参阅 ...

    css-effect-map-collection一些好看的css效果图

    "css-effect-map-collection"是一个集合,包含了许多精美的CSS效果示例,这些效果可以用于提升WebUI组件或框架的视觉吸引力。这个压缩包“css_effect_map_collection-master”很可能包含了源代码、预览图像和相关的...

    Laravel开发-laravel-collection-normalize-keys

    "laravel-collection-normalize-keys"这个主题聚焦于一个特定的集合操作:确保多维集合中的键一致,这对于数据处理和规范化非常重要。本文将深入探讨Laravel集合以及如何使用宏(Macros)来实现键的一致性。 首先,...

    mi-yi-collection-bean-master_java_源码

    【标题】"mi-yi-collection-bean-master_java_源码" 涉及的主要知识点是Java集合框架中的Bean类和其在实际项目中的应用。这个压缩包可能包含了一个Java项目,其中的核心部分是对集合对象(如List、Set、Map等)进行...

    Laravel开发-collection-export

    这是一个用于处理数组和Eloquent查询结果的强大工具,提供了诸如`map`、`filter`、`reduce`等方法,使我们能够对数据进行便捷的操作和转换。在处理集合导出时,我们通常会先对数据进行清洗、筛选和格式化,然后将其...

    a-collection-of-data-structure.zip_188473.com.

    例如,STL(Standard Template Library,标准模板库)中的容器(如vector、list、set、map等)就是对常用数据结构的封装,而算法库则包含了许多常见算法的实现。 在压缩包中的"数据结构算法VC程序集",你可能会找到...

    Multi-map Generic Collection Class in C#

    Multi-map Generic Collection Class in C# - A Dictionary Collection Class that can Store Duplicate Key-value Pairs

    Laravel开发-collection-grouped-by-model

    这个`Collection`对象提供了很多实用的方法,如`map()`, `filter()`, `each()`等,使得数据操作变得简洁高效。 在描述中提到的"按模型分组",具体来说,可能是当你从数据库获取一系列相关的模型实例后,想要按照...

    Java_Collection_List-Set-Map.zip_list set map

    这些接口由Java Collection Framework提供,它是一个统一的架构,用于存储和操作各种类型的对象。接下来,我们将深入探讨这三个核心接口以及它们的相关知识点。 1. **List接口**: List是一种有序的集合,允许元素...

    java-collection-all-in-one.pdf

    Java集合框架由Collection和Map两大父接口统领。Collection接口是List、Set和Queue的父接口,用于存储单一数据类型的集合;Map接口用于存储键值对集合,由不同的实现类支持不同的访问机制和顺序特性。 List接口是...

    Collection、Map、List、Set、Iterator

    ### Collection、Map、List、Set、Iterator 的详细解析 #### Collection 接口 - **定义**:`Collection` 是 Java 集合框架的核心接口之一,几乎所有其他集合接口都直接或间接继承自它。它提供了对集合进行增删查改...

    集合框架包含collection和map的子类

    集合框架包含collection和map的子类。其中collection包含list、set和queue。map包括hashmap、hashtable和treemap

    Java-collection-frame.rar_Java集合框架

    在Java集合框架中,主要分为两大类:List(列表)、Set(集合)和Map(映射)。 1. List接口:List是一种有序的集合,允许包含重复元素。它定义了元素的插入、删除和访问方法,如add()、remove()和get()。ArrayList...

    collection-1.2.1

    js模仿JAVA 集合工具类的基本操作,里面包装有Map List/* * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key, value) 向MAP中增加元素(key, value) * remove...

    Data-collection-and-data-binding-.zip_数据集java

    这可以是数组、集合(如ArrayList、LinkedList或HashSet)、Map接口的实现(如HashMap或TreeMap),或者更复杂的数据结构,如数据库连接池。数据集的主要目标是提供一个灵活且易于操作的方式来组织和处理数据。例如...

Global site tag (gtag.js) - Google Analytics