- java.util.Map<k,v>集合
Map集合的特点
- Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)。
- Map集合中的元素,key和value的数据类型可以相同,也可以不同。
- Map集合中的元素,key是不允许重复的,value是可以重复的。
- Map集合中的元素,key和value是一一对应。
- java.util.HashMap<k,v>集合implement Map<k,v>接口
HashMap集合的特点
- HashMap集合底层是哈希表—————————————查询的速度特别的快。
JDK1.8之前—————————————————————数组+单向链表。
JDK1.8之后—数组+单向链表/红黑树(链表的长度超过8)—提高查询的速度。 - HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致。
- java.util.LinkedHashMap<k,v>集合extends HashMap<k,v>接口
LinkedHashMap的特点
- LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)。
- LinkedHashMap集合是一个有序的集合,存储和取出元素的顺序是一致的。
Map接口中的常用方法
- public V put(k key,v value)—————把指定的健与指定的值添加到Map集合中。
返回值—v
存储键值对的时候,key不重复,返回v是null。
存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值。 - public V remove(k key,v value)—————把指定的健所对应的键值对元素在Map集合中删除,返回被删除元素的值。
返回值—v
key存在,v返回被删除的值。
key不存在,v返回null。 - public V get(Object key)—————根据指定的健在Map集合中获取对应的值。
返回值
key存在,返回对应的value值。
key不存在,返回null。 - boolean containsKey(Object key)—————判断集合中是否包含指定的健。
包含返回true,不包含返回false。
Map集合遍历健找对值方式
- Map集合的第一种遍历方式————————通过健找值得方式。
Map集合中的方法
Set<K> keySet( )
返回映射中包含的健的Set视图。
实现步骤
- 使用Map集合中的方法 keySet( ),把Map集合所有的key取出来,存储到一个Set集合中。
- 遍历Set集合,获取Map集合中的每一个key。
- 通过Map集合中的方法get(key),通过key找到value。
Entry健值对对象
- Map集合的第二种遍历方式————————使用Entry对象遍历。
Map集合中的方法
Set<Map.Entry<k,v> entrykeySet( )返回映射中包含的映射关系的Set视图。
实现步骤
- 使用Map集合中的方法 entrykeySet( ),把Map集合中多个Entry对象取出来,存储到一个Set集合中。
- 遍历Set集合,获取每一个Entry对象。
- 使用Entry对象中的方法getKey和getValue获取健与值。
HashMap存储自定义类型健值
Map集合保证key是唯一的。
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一。
LinkedHashMap集合
- java.util.LinkedHashMap<k,v>集合extends HashMap<k,v>
Map接口的哈希表和链表连接列表实现,具有可预知的迭代顺序。
底层原理
哈希表+链表(记录元素的顺序)
HashTable集合
- java.util.HashTable<k,v>集合implement Map<k,v>接口
HashTable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢。
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快。
HashMap(之前学过的所有的集合):可以存储null值,null健。
HashTable集合,不能存储null值,null健。
HashTable集合和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了。HashTable的子类Properties依然活跃在历史的舞台。
Properties集合是唯一和IO流相结合的集合。
练习——————计算一个字符串中的每个字
import java.util.HashMap;
import java.util.Scanner;
/**
* 练习
* 计算一个字符串中每个字符出现的次数
*/
public class Demo01MapTest {
public static void main(String[] args) {
//1.使用Scanner获取用户输入的字符串
Scanner sc =new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str =sc.next();
//2.创建Map集合,key是字符串中的字符,value是字符的个数。
HashMap<Character,Integer> map = new HashMap<>();
//3.遍历字符串,获取每一个字符
for (char c : str.toCharArray()) {
//4.使用获取到的字符,去Map集合判断key是否存在
if (map.containsKey(c)){
//key存在
Integer value =map.get(c);
value++;
map.put(c,value);
}else {
//key不存在
map.put(c,1);
}
}
//5.遍历Map集合,输出结果
for (Character key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key+"="+value);
}
}
}