`

13、java.util.Map集合

阅读更多

一、Map映射

 

/**
 *java.util.Map<K,V>
 *K - 此映射所维护的键的类型
 *V - 映射值的类型
 *将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 
 *Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
 *映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。
 *某些映射实现可明确保证其顺序,如 TreeMap 类;
 *另一些映射实现则不保证顺序,如 HashMap 类。
 */
public interface Map<K,V>
{
	/**
	 *
	 *内部接口,映射项(键-值对)。
	 *映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类
	 *获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。
	 *
	 */
	public static interface Map.Entry<K,V>
	{
		//返回与此项对应的键。
		K getKey();
		
		//返回与此项对应的值。
		V getValue();

		//用指定的值替换与此项对应的值(可选操作)。
		V setValue(V value);

		//比较指定对象与此项的相等性。
		boolean equals(Object o);

		//返回此映射项的哈希码值。
		int hashCode();
	}

	//返回此映射中的键-值映射关系数。
	int size();

	//如果此映射未包含键-值映射关系,则返回 true。
    boolean isEmpty();

	//如果此映射包含指定键的映射关系,则返回 true。
    boolean containsKey(Object key);

	//如果此映射将一个或多个键映射到指定值,则返回 true
    boolean containsValue(Object value);

    //返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
    V get(Object key);

    //将指定的值与此映射中的指定键关联(可选操作)。
	//如果添加时,键相同,那么后添加的值会覆盖原有键对应值,并put方法返回被覆盖的值
    V put(K key, V value);

	//如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
    V remove(Object key);

	//从指定映射中将所有映射关系复制到此映射中(可选操作)。
    void putAll(Map<? extends K, ? extends V> m);

	//从此映射中移除所有映射关系(可选操作)。
    void clear();

	//返回此映射中包含的键的 Set 视图。
    Set<K> keySet();

    //返回此映射中包含的值的 Collection 视图。
    Collection<V> values();

    //返回此映射中包含的映射关系的 Set 视图。
    Set<Map.Entry<K, V>> entrySet();

    //比较指定的对象与此映射是否相等
    boolean equals(Object o);

	//返回此映射的哈希码值。
    int hashCode();
}

 

二、Map体系

 

Map

   |--Hashtable<K,V>:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的,jdk1.0,效率低

   |--HashMap<K,V>:底层是哈希表数据结构,允许null键和null值,该集合是不同步的,jdk1.2,效率高

   |--TreeMap<K,V>:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序

 

三、HashMap集合

 

/**
 *基于哈希表的 Map 接口的实现。
 *此实现提供所有可选的映射操作,并允许使用 null 值和 null 键
 *除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同
 *此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
  *为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
 */
public class HashMap<K,V>extends AbstractMap<K,V>
	implements Map<K,V>, Cloneable, Serializable
{
	//构造方法*********************

	//构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap
	public HashMap(){}

	//构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap
	public HashMap(int initialCapacity){}

	//构造一个带指定初始容量和加载因子的空 HashMap。
	public HashMap(int initialCapacity,float loadFactor){}

	//构造一个映射关系与指定 Map 相同的新 HashMap。
	//所创建的 HashMap 具有默认加载因子 (0.75) 和足以容纳指定 Map 中映射关系的初始容量。
	public HashMap(Map<? extends K,? extends V> m){}

	//常用方法与Map一致
}

 

四、TreeMap集合

 

/**
 *基于红黑树(Red-Black tree)的 NavigableMap 实现
 *该映射根据其键的自然顺序进行排序
 *或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法
 *不同步
 */
public class TreeMap<K,V>extends AbstractMap<K,V>
	implements NavigableMap<K,V>, Cloneable, Serializable
{
	//构造方法*********************

	//使用键的自然顺序构造一个新的、空的树映射。插入该映射的所有键都必须实现 Comparable 接口
	public TreeMap(){}

	//构造一个新的、空的树映射,该映射根据给定比较器进行排序
	public TreeMap(Comparator<? super K> comparator){}

	//构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序
	public TreeMap(Map<? extends K,? extends V> m){}

	//常用方法与Map一致
}

 

五、Map集合取出元素的两种方式

 

    原理:将map集合转成set集合,再通过迭代器取出

 

 1,Set<K> keySet:返回此映射中包含的键的 Set 视图,将Map中所有的键存入到Set集合,因为set具备迭代器,所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值

import java.util.*;

class MapDemo 
{
	public static void main(String[] args) 
	{
		HashMap<String,String> hm = new HashMap<String,String>();
		hm.put("01","zhangsan");
		hm.put("02","lisi");
		hm.put("03","wangwu");
		hm.put("04","zhaoliu");
		Set<String> set=hm.keySet();
		Iterator<String> it = set.iterator();
		while(it.hasNext())
		{
			String key = it.next();
			String value = hm.get(key);
			System.out.println(key+":"+value);
		}
	}
}

 

2,Set<Map.Entry<k,v>> entrySet():将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry

import java.util.*;

class MapDemo 
{
	public static void main(String[] args) 
	{
		HashMap<String,String> hm = new HashMap<String,String>();
		hm.put("01","zhangsan");
		hm.put("02","lisi");
		hm.put("03","wangwu");
		hm.put("04","zhaoliu");
		Set<Map.Entry<String,String>> set=hm.entrySet();
		Iterator<Map.Entry<String,String>> it = set.iterator();
		while(it.hasNext())
		{
			Map.Entry<String,String> entry = it.next();
			String key = entry.getKey();
			String value = entry.getValue();
			System.out.println(key+":"+value);
		}
	}
}

 

六、使用集合的技巧

 

  1. 看到Array就是数组结构,有角标,查询速度很快。
  2. 看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();
  3. 看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。
  4. 看到tree就是二叉树,就要想到排序,就想要用到比较。
  5. 比较的两种方式:
  6. 一个是Comparable:覆盖compareTo方法;
  7. 一个是Comparator:覆盖compare方法。
  8. LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。

七、集合什么时候用?

 

  • 当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。
  • 保证唯一,就用Set。不保证唯一,就用List。
分享到:
评论

相关推荐

    java.util包

    1. 集合框架:Java.util包是Java集合框架的基础,包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。这些集合类为存储和操作对象提供了灵活的方式。例如,ArrayList实现了...

    java.util.concurrent系列文章(1)

    本篇文章将深入探讨 `java.util.concurrent` 包中的一些核心概念和技术,特别是 `ConcurrentHashMap` 和 `CopyOnWriteArrayList` 这两个集合类。 #### 二、线程安全问题概述 线程安全性是指在多线程环境中,代码...

    Java中的`java.util.stream.Collectors.toMap()`方法有什么作用

    在Java中,java.util.stream.Collectors.toMap()方法是一个非常实用的工具,它允许我们将流(Stream)中的元素收集到一个Map中。这个方法是Collectors类中的一个静态方法,它实现了Collector接口,用于在流的终止...

    java.util 包 是Java中很大的一个集合

    运用下列类进行JAVA编程: Date Calendar Random 使用 Collection 接口及其实现类 ArrayList LinkedList 使用 HashMap 使用Vector 等方法的使用

    JBuider第七章:Java.util包.rar

    Java.util包是Java集合框架的基础,包括List、Set、Queue等接口以及ArrayList、LinkedList、HashSet、HashMap等实现类。List接口代表有序的元素集合,允许有重复元素,ArrayList和LinkedList是其具体实现,前者基于...

    java的.awt包和java.util包的区别

    ### Java的.awt包和.java.util包的区别 #### Java.util包详解 Java.util包是一个非常重要的标准库之一,其中包含了大量有用的类和接口,为开发者提供了丰富的功能。此包中的类和接口可以分为以下几大类别: 1. **...

    出现java.util.ConcurrentModificationException 问题及解决办法

    在Java编程中,`java.util.ConcurrentModificationException` 是一个常见的运行时异常,通常发生在尝试并发修改集合时。这个异常的产生是由于集合类(如HashMap)的非线程安全特性,当你在一个线程中使用迭代器遍历...

    java类源码-lambda:学习java.util,java.util.function,java.util.stream下面的源码,只要上

    这次我们将会深入学习 `java.util`、`java.util.function` 和 `java.util.stream` 这三个包下的源码,来理解这些新特性的实现原理和设计思想。 首先,Lambda 表达式是函数式编程的核心概念,它提供了一种简洁的方式...

    java.util.ConcurrentModificationException 解决方法

    `java.util.ConcurrentModificationException` 是一个在 Java 中常见的运行时异常,它通常发生在多线程环境中,当一个线程正在遍历一个集合(如 `ArrayList`, `HashMap` 等),而另一个线程同时尝试修改这个集合时。...

    android-retrostreams,Android Studio 3.0 Desugar工具链Java 9 java.util.stream API的后台端口,派生自.zip

    Java 9引入了`java.util.stream` API,这是一种处理集合数据的强大工具,允许开发者以声明性方式处理数据流,提高了代码的简洁性和可读性。然而,Android SDK并不完全支持Java 9的新特性,因此在Android项目中直接...

    Java中的`java.util.stream.Collectors.partitioningBy()`方法有什么作用

    在Java 8中引入的Stream API中,java.util.stream.Collectors.partitioningBy()方法是一个非常有用的工具,它允许开发者将流(Stream)中的元素根据某个条件分成两部分,一部分是满足条件的元素,另一部分则是不满足...

    java.util.concurrent系列文章(2)

    ### Java.util.concurrent 系列文章(2):深入理解 ConcurrentHashMap #### 一、引言 在上一篇文章中,我们简要介绍了并发集合类的基本概念及其重要性,并探讨了如何通过共享数据结构的方法来提高程序的并发性和...

    java.util源码-java-util:javautil源代码

    1. **集合框架**:Java的集合框架是`java.util`包的核心部分,包括List、Set、Queue和Map接口,以及它们的实现类。例如: - `ArrayList` 和 `LinkedList`:这两个类分别实现了List接口,它们分别基于动态数组和双向...

    28个java常用的工具类

    13. **`java.util.zip.*`**: 压缩和解压缩文件,如`ZipOutputStream`和`ZipInputStream`。 14. **`java.net.URL`** 和 **`java.net.HttpURLConnection`**: URL处理和HTTP通信。 15. **`java.util.regex.Pattern`**...

    最最常用的 100 个 Java类分享

    13. `java.util.HashSet`:HashSet是基于哈希表的Set实现,不保证元素顺序,允许空元素。 14. `java.io.BufferedReader`:BufferedReader用于高效地读取字符流,通过缓冲区进行操作。 15. `java.util.Collection`...

    30个常用java工具类

    3. **`java.util.Collections`**:与`Arrays`类似,但针对集合框架中的接口和类,如`List`、`Set`和`Map`,提供排序、搜索和转换功能。 4. **`java.util.Date`** 和 **`java.time`** 包:处理日期和时间,`java....

    java-util-1.3.1.jar.zip

    1. **集合框架扩展**:可能包含对Java内置集合类(如List、Set、Map)的增强,提供更高效的操作,例如快速排序、线程安全的实现等。 2. **日期和时间处理**:提供更加灵活和强大的日期时间操作,弥补Java 8之前的...

Global site tag (gtag.js) - Google Analytics