Map接口
--1,概述
Map接口里的数据非常有特点,map里的数据都是一组 键值对.
map.put(10,20); --其中10是键 , 20是值
--键不能重复
使用泛型约束Map集合里的键值的 类型 ,,,Map<K,V>
--2,特点
--HashMap 数据无序
--TreeMap 数据有序

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
//测试 Map接口的方法
public class Test4_Map {
public static void main(String[] args) {
//1,创建对象
//Integer是key的类型 -- String是value类型
Map<Integer,String> map = new HashMap<>();
//2,调用方法
map.put(9527,"唐伯虎") ;
map.put(9528,"秋香姐") ;
map.put(9530,"祝枝山") ;
// {9527=唐伯虎, 9528=秋香姐, 9530=祝枝山}
System.out.println(map);
// map.clear(); //清空集合
System.out.println(map.containsKey(9530));//判断是否包含key
System.out.println(map.containsValue("唐伯虎"));//判断是否包含value
System.out.println(map.equals(123));//判断是否和123相等
System.out.println(map.get(9530));//根据key获取value
System.out.println(map.hashCode());//获取哈希码值
System.out.println(map.isEmpty());//判断是否为空
System.out.println(map.size());//获取元素个数
System.out.println(map.remove(9528));//根据key删除记录
System.out.println(map);//{9527=唐伯虎, 9530=祝枝山}
//TODO void putAll(Map<? extends K,? extends V> m)
//TODO 迭代map里的数据
//方式1::: Set<K> keySet() --把map里的key存入set集合
Set<Integer> set = map.keySet();
//遍历set,获取每个key
for (Integer key : set) {
//拿着key回map里找value
String value = map.get(key);
System.out.println(key+"--"+value);
}
//方式2::: Set<Map.Entry<K,V>> entrySet()
// --把map里的key和value存到set里,并封装成Entry对象
Set<Map.Entry<Integer,String>> set2 = map.entrySet();
//遍历set得到一个Entry
for(Map.Entry<Integer,String> entry : set2){
Integer key = entry.getKey();//获取key
String value = entry.getValue();//获取value
System.out.println(key+"~~"+value);
}
//方式3::: Collection<V> values() --把map里的value们存入Collection
Collection<String> values = map.values();
//遍历集合,得到每个value
for (String value : values){
System.out.println(value);
}
}
}
HashMap
--1,概述
HashMap是Map接口的实现类.
可以使用Map接口的所有方法.
--2,原理
--底层是一个哈希表/散列表
--把数据存在桶里
--由数组 和 链表组成的
--当往HashMap里存放数据时,,,,
会根据hash算法(hashCode())计算数据的存储位置(hash(key))
如果数组的位置没有数据,直接存在数组节点上.
如果数组的位置存过数据了(hash冲突),会形成链表结构.
jdk1.8对于链表结构的查询效率做了优化,当链表长度达到8时会变成红黑树来提升查询效率
--3,练习
--需求: 分析用户输入的字符串中 每个字符出现的次数
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
//测试 HashMap的使用
public class Test1_Map {
public static void main(String[] args) {
//1,统计用户输入的字符串中
String input= new Scanner(System.in).nextLine();
//定义map,存结果,类似:a=1,b=2,c=1
Map<Character,Integer> map = new HashMap<>() ;
//2,遍历字符串,获取 每个字符
for (int i = 0; i < input.length() ; i++) {
//根据下标获取每个字符
char key = input.charAt(i);
//根据key获取value,
Integer value = map.get(key) ;
//判断,是null的话就没存过,直接存1
if(value==null){
//TODO 原理:向map里存入数据时,会拿着key计算存储位置
//TODO 如果节点上没存过数据,就尽量存在数组节点上
//TODO 如果节点存过数据了,再去判断key存过吗,存过就把原来的value覆盖掉
//key不存在那就是一个新节点形成链表
map.put(key,1) ;
}else{
//判断,有值,不是null的话,就是以前存过,直接+1
map.put(key,value+1) ;
}
}
System.out.println(map);
}
}
