一、Map
(一)Map概述
1、Map集合:将键映射到值的对象。
1)一个映射不能包含重复的键;
2)每个键最多只能映射到一个值。
2、Map集合和Collection集合的区别
1)Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对 。
2)Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
3、注意:
1)Map集合的数据结构只针对键有效,跟值无关 ,HashMap,TreeMap。
2)Collection集合的数据结构是针对元素有效 。
(二)功能
1、添加功能
1)V put(K key,V value):添加元素。这个其实还有另一个功能
- 如果键是第一次存储,就直接存储元素,返回null
- 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
2、删除功能
1)void clear():移除所有的键值对元素
2)V remove(Object key):根据键删除键值对元素,并把值返回
3、判断功能 (有意思)
1)boolean containsKey(Object key):判断集合是否包含指定的键
2)boolean containsValue(Object value):判断集合是否包含指定的值
3)boolean isEmpty():判断集合是否为空
4、长度功能
int size():返回集合中的键值对的对数
5、获取功能
1)基本方法:
- Set<Map.Entry<K,V>> entrySet():遍历获取
- V get(Object key):根据键获取值
- Set<K> keySet():获取集合中所有键的集合
- Collection<V> values():获取集合中所有值的集合
2)遍历Map的方法
- 方法1:先拿到所有的key,然后遍历获取所有的value
- keySet()
- get(Object key)
- 方法2:先拿到所有的键值对,然后遍历,获取每一个键值对对象-Entry(推荐)。
- entrySet()
- Map.Entry
4)具体代码
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /*
* Map集合的遍历。
* 方法1:先拿到所有的key,然后遍历获取所有的value
* 方法2:先拿到所有的键值对,然后遍历,获取每一个键和值(推荐)
*
*/
public void test3(){
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 创建元素并添加到集合
map.put("杨过", "小龙女");
map.put("郭靖", "黄蓉");
map.put("杨康", "穆念慈");
map.put("陈玄风", "梅超风");
// 方法1:获取所有的键,然后根据键获取值(键找值)
Set<String> set = map.keySet();
// 遍历键的集合,获取得到每一个键
for (String key : set) {
// 根据键去找值
String value = map.get(key);
System.out.println(key + "---" + value);
}
// 方法2: 直接拿到所有的键值
Set<Map.Entry<String, String>> entrySet = map.entrySet();//拿到键值的Set集合
for (Map.Entry<String, String> entry : entrySet) {//遍历集合,拿到每一对的键值
System.out.println(entry.getKey() + ":" + entry.getValue());
}
// 方法2: 直接拿到所有的键值
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= "
+ entry.getValue());
}
}
</span></span>
二、HashMap
1、概述:
1)HashMap是基于哈希表的Map接口实现。
2)哈希表的作用是用来保证键的唯一性的,即键是唯一的,值是可重复的。
2、Hashtable和HashMap的区别?
1)Hashtable:线程安全,效率低。不允许null键和null值
2)HashMap:线程不安全,效率高。允许null键和null值
<span style="font-size:18px;"> // hm.put(null, "world"); //NullPointerException
// hm.put("java", null); // NullPointerException</span>
3、实例:键的唯一性
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /*
* HashMap:是基于哈希表的Map接口实现。
* 哈希表的作用是用来保证键的唯一性的。
*
* HashMap<String,String>
* 键:String
* 值:String
*/
public void test1(){
// 创建集合对象
HashMap<String, String> hm = new HashMap<String, String>();
// 创建元素并添加元素
// String key1 = "it001";
// String value1 = "马云";
// hm.put(key1, value1);
hm.put("it001", "马云");
hm.put("it003", "马化腾");
hm.put("it004", "乔布斯");
hm.put("it005", "张朝阳");
hm.put("it002", "裘伯君"); // wps
hm.put("it001", "比尔盖茨");
// 遍历
Set<String> set = hm.keySet();
for (String key : set) {
String value = hm.get(key);
System.out.println(key + "---" + value);
}
}</span></span>
三、LinkedHashMap
1、特性:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
1)由哈希表保证键的唯一性
2)由链表保证键盘的有序(存储和取出的顺序一致)
2、实例:
<span style="font-size:18px;">/*
* LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
* 由哈希表保证键的唯一性
* 由链表保证键盘的有序(存储和取出的顺序一致)
*/
public class LinkedHashMapDemo {
public static void main(String[] args) {
// 创建集合对象
LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();
// 创建并添加元素
hm.put("2345", "hello");
hm.put("1234", "world");
hm.put("3456", "java");
hm.put("1234", "javaee");
hm.put("3456", "android");
// 遍历
Set<String> set = hm.keySet();
for (String key : set) {
String value = hm.get(key);
System.out.println(key + "---" + value);
}
}
}
</span>
四、TreeMap
1、TreeMap:是基于红黑树的Map接口的实现。
2、实现:需要排序比较接口同TreeSet
3、实例:"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果
<span style="font-size:18px;"> /*
* 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
*
* 分析:
* A:定义一个字符串(可以改进为键盘录入)
* B:定义一个TreeMap集合
* 键:Character
* 值:Integer
* C:把字符串转换为字符数组
* D:遍历字符数组,得到每一个字符
* E:拿刚才得到的字符作为键到集合中去找值,看返回值
* 是null:说明该键不存在,就把该字符作为键,1作为值存储
* 不是null:说明该键存在,就把值加1,然后重写存储该键和值
* F:定义字符串缓冲区变量
* G:遍历集合,得到键和值,进行按照要求拼接
* H:把字符串缓冲区转换为字符串输出
*
*/
public void test3() {
String line = "aababcabcdabcde";
// 定义一个字符串(可以改进为键盘录入)
// Scanner sc = new Scanner(System.in);
// System.out.println("请输入一个字符串:");
// String line = sc.nextLine();
// 定义一个TreeMap集合
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
//把字符串转换为字符数组
char[] chs = line.toCharArray();
//遍历字符数组,得到每一个字符
for(char ch : chs){
//拿刚才得到的字符作为键到集合中去找值,看返回值
Integer i = tm.get(ch);
//是null:说明该键不存在,就把该字符作为键,1作为值存储
if(i == null){
tm.put(ch, 1);
}else {
//不是null:说明该键存在,就把值加1,然后重写存储该键和值
i++;
tm.put(ch,i);
}
}
//定义字符串缓冲区变量
StringBuilder sb= new StringBuilder();
//遍历集合,得到键和值,进行按照要求拼接
Set<Character> set = tm.keySet();
for(Character key : set){
Integer value = tm.get(key);
sb.append(key).append("(").append(value).append(")");
}
//把字符串缓冲区转换为字符串输出
String result = sb.toString();
System.out.println("result:"+result);
}</span>