一、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); } } }
六、使用集合的技巧
- 看到Array就是数组结构,有角标,查询速度很快。
- 看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();
- 看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。
- 看到tree就是二叉树,就要想到排序,就想要用到比较。
- 比较的两种方式:
- 一个是Comparable:覆盖compareTo方法;
- 一个是Comparator:覆盖compare方法。
- LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。
七、集合什么时候用?
- 当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。
- 保证唯一,就用Set。不保证唯一,就用List。
相关推荐
在Java中,java.util.stream.Collectors.toMap()方法是一个非常实用的工具,它允许我们将流(Stream)中的元素收集到一个Map中。这个方法是Collectors类中的一个静态方法,它实现了Collector接口,用于在流的终止...
1. 集合框架:Java.util包是Java集合框架的基础,包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。这些集合类为存储和操作对象提供了灵活的方式。例如,ArrayList实现了...
Java.util包是Java标准库中的核心包之一,它包含了大量用于日常编程的工具类和接口。这个包在Java 2版本中得到了显著增强,引入了许多重要的数据结构和算法,为Java程序员提供了更丰富的功能。 首先,Java.util包中...
`java.util`包是Java标准库中的一个重要组成部分,提供了大量的实用工具类和接口来处理集合数据类型、日期时间操作、随机数生成等功能。这份PDF文档包含了`java.util`包内各主要类与接口的源代码,有助于开发者深入...
`java.util`包中的数据结构主要包括集合框架(Collection Framework),这是Java中最常用的数据管理工具之一。集合框架为开发者提供了多种类型的容器来存储对象,每种容器都有其特定的功能和用途。 ##### 1. ...
运用下列类进行JAVA编程: Date Calendar Random 使用 Collection 接口及其实现类 ArrayList LinkedList 使用 HashMap 使用Vector 等方法的使用
Java.util包是Java集合框架的基础,包括List、Set、Queue等接口以及ArrayList、LinkedList、HashSet、HashMap等实现类。List接口代表有序的元素集合,允许有重复元素,ArrayList和LinkedList是其具体实现,前者基于...
### Java的.awt包和.java.util包的区别 #### Java.util包详解 Java.util包是一个非常重要的标准库之一,其中包含了大量有用的类和接口,为开发者提供了丰富的功能。此包中的类和接口可以分为以下几大类别: 1. **...
在Java编程中,`java.util.ConcurrentModificationException` 是一个常见的运行时异常,通常发生在尝试并发修改集合时。这个异常的产生是由于集合类(如HashMap)的非线程安全特性,当你在一个线程中使用迭代器遍历...
这次我们将会深入学习 `java.util`、`java.util.function` 和 `java.util.stream` 这三个包下的源码,来理解这些新特性的实现原理和设计思想。 首先,Lambda 表达式是函数式编程的核心概念,它提供了一种简洁的方式...
`java.util.ConcurrentModificationException` 是一个在 Java 中常见的运行时异常,它通常发生在多线程环境中,当一个线程正在遍历一个集合(如 `ArrayList`, `HashMap` 等),而另一个线程同时尝试修改这个集合时。...
Java 9引入了`java.util.stream` API,这是一种处理集合数据的强大工具,允许开发者以声明性方式处理数据流,提高了代码的简洁性和可读性。然而,Android SDK并不完全支持Java 9的新特性,因此在Android项目中直接...
### Java.util.concurrent 系列文章(2):深入理解 ConcurrentHashMap #### 一、引言 在上一篇文章中,我们简要介绍了并发集合类的基本概念及其重要性,并探讨了如何通过共享数据结构的方法来提高程序的并发性和...
在Java 8中引入的Stream API中,java.util.stream.Collectors.partitioningBy()方法是一个非常有用的工具,它允许开发者将流(Stream)中的元素根据某个条件分成两部分,一部分是满足条件的元素,另一部分则是不满足...
1. **集合框架**:Java的集合框架是`java.util`包的核心部分,包括List、Set、Queue和Map接口,以及它们的实现类。例如: - `ArrayList` 和 `LinkedList`:这两个类分别实现了List接口,它们分别基于动态数组和双向...
13. **`java.util.zip.*`**: 压缩和解压缩文件,如`ZipOutputStream`和`ZipInputStream`。 14. **`java.net.URL`** 和 **`java.net.HttpURLConnection`**: URL处理和HTTP通信。 15. **`java.util.regex.Pattern`**...
13. `java.util.HashSet`:HashSet是基于哈希表的Set实现,不保证元素顺序,允许空元素。 14. `java.io.BufferedReader`:BufferedReader用于高效地读取字符流,通过缓冲区进行操作。 15. `java.util.Collection`...
3. **`java.util.Collections`**:与`Arrays`类似,但针对集合框架中的接口和类,如`List`、`Set`和`Map`,提供排序、搜索和转换功能。 4. **`java.util.Date`** 和 **`java.time`** 包:处理日期和时间,`java....
1. **集合框架扩展**:可能包含对Java内置集合类(如List、Set、Map)的增强,提供更高效的操作,例如快速排序、线程安全的实现等。 2. **日期和时间处理**:提供更加灵活和强大的日期时间操作,弥补Java 8之前的...