Map集合
Map集合特点
- Map集合是一个双列集合,一个元素包括两个值(一个key,一个value)
- Map集合中的元素,key和value数据类型可以相同,也可以不同
- Map集合中的元素,key是不可以重复的,value可以
- Map集合中的元素,key和value一一对应
Map常用的子类
- HashMap<k,v>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致
- LinkedHashMap<k,v> : HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
Map接口常用的方法
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。public V get(Object key)
根据指定的键,在Map集合中获取对应的值。boolean containsKey(Object key)
判断集合中是否包含指定的键。
Map接口的方法演示
public class Deom01 {
public static void main(String[] args) {
show03();
}
private static void show03() {
/*
``boolean containsKey(Object key) ` 判断集合中是否包含指定的键。
*/
Map<String,Integer> map = new HashMap<>();
map.put("小夫",170);
map.put("小刘",175);
map.put("小王",183);
boolean b1 = map.containsKey("小王");
System.out.println(b1);//true
boolean b2 = map.containsKey("小贾");
System.out.println(b2);//false
}
private static void show02() {
/*`public V remove(Object key)`: 把
指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
返回值:v
key存在返回被删除的值
不存在 返回null
*/
//创建map集合
Map<String,Integer> map = new HashMap<>();
map.put("小夫",170);
map.put("小刘",175);
map.put("小王",183);
System.out.println(map);//{小刘=175, 小夫=170, 小王=183}
Integer v1 = map.remove("小夫");
System.out.println(v1);//170
System.out.println(map);//{小刘=175, 小王=183}
}
/*
返回值:v
存储值对的时候,key不重复,返回值是value
存储之对的时候,会使用新的value
*/
private static void show01() {
/*
返回值:v
存储值对的时候,key不重复,返回值是value
存储之对的时候,会使用新的value
*/
//创建map集合
Map<String,String>map = new HashMap<>();
String v1 = map.put("小夫", "胖虎");
System.out.println("v1:"+v1);//v1:null
String v2 = map.put("小夫", "胖虎2");
System.out.println("v2:"+v2);//v2:胖虎
System.out.println(map);//{小夫=胖虎2}
}
}
Map集合遍历找值方式
Map集合第一种遍历方式:通过找值的方式
实现步骤:
- 使用Map集合中的方法keyset(),把Map集合中所有key取出来,存储到一个set集合中
- 遍历set集合
- 通过map集合中的方法get(key),通过key找到value
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("小夫",170);
map.put("小刘",175);
map.put("小王",183);
//使用keySet()方法,把Map集合中的key取出来,存储到set集合中
Set<String> set = map.keySet();
//2.遍历set集合,获取Map集合中的每一个key
//使用迭代器遍历Set集合
Iterator<String> it = set.iterator();
while (it.hasNext()){
String key = it.next();
//3.通过map集合中的方法get(key),通过key找到value
Integer value = map.get(key);
System.out.println(key+value); }//小刘175
//小夫170
//小王183
//使用增强for循环
for(String key:map.keySet()){
//3.通过map集合中的方法get(key),通过key找到value
Integer value = map.get(key);
System.out.println(key+value); }//小刘175
//小夫170
//小王183
}
Map集合的第二种遍历方式:使用Entry对象
实现步骤:
- 使用Map集合中的方法entrySet(),把map集合中的多个Entry对象取出来,存到一个set集合
- 遍历集合,获取每一个Entry对象
- 使用Entry对象中的方法getkey()和getvalue()获取键与值
代码
{
public static void main(String[] args) {
//创建map集合
Map<String,Integer> map = new HashMap<>();
map.put("小夫",170);
map.put("小刘",175);
map.put("小王",183);
//1.使用Map集合中的方法entrySet(),把map集合中的多个Entry对象取出来,存到一个set集合
Set<Map.Entry<String, Integer>> set = map.entrySet();
//2.遍历集合,获取每一个Entry对象
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while (it.hasNext()){
Map.Entry<String, Integer> entry = it.next();
//3.使用Entry对象中的方法getkey()和getvalue()获取键与值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+value);
}
for (Map.Entry<String,Integer>entry:set){
//3.使用Entry对象中的方法getkey()和getvalue()获取键与值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+value);
}
}
}
LinkedHashMap集合
是在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。
代码
public class LinkedHashMap {
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put("yi","er");
map.put("san","si");
map.put("wu","liu");
map.put("s","s");
System.out.println(map);//{yi=er, san=si, s=s, wu=liu} 不重复 无序
java.util.LinkedHashMap<String,String> linked = new java.util.LinkedHashMap<>();
map.put("yi","er");
map.put("san","si");
map.put("wu","liu");
map.put("s","s");
System.out.println(map);//{yi=er, san=si, s=s, wu=liu} 不重复 有序
}
}
java.util.LinkedHashMap<String,String> linked = new java.util.LinkedHashMap<>();
map.put("yi","er");
map.put("san","si");
map.put("wu","liu");
map.put("s","s");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for(Map.Entry<String,String> entry : entrySet){
System.out.println(entry.getKey()+" "+entry.getValue());}
// yi er
// san si
// s s
// wu liu
Hashtable集合
-
Hashtable底层也是一个哈希表,是一个线程安全的集合,是单线程的集合,速度慢
-
Hashtable集合,不能存储null值,null键
-
Hashtable和Vector集合一样,在jdk1.2之后被更先进的集合(Hashmap,ArrayList)取代了
-
Hashtable的子类Properties依然活跃在历史舞台
-
Properties集合是唯一一个和IO流结合的集合
Map集合练习
**需求:**计算一个字符串中每个字符出现次数。
分析:
- 获取一个字符串对象
- 创建一个Map集合,键代表字符,值代表次数。
- 遍历字符串得到每个字符。
- 判断Map中是否有该键。
- 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。
- 打印最终结果
代码
public class MapTest {
public static void main(String[] args) {
//输入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//创建Map集合,key是字符串的字符,value是字符的个数
HashMap<Character,Integer> map = new HashMap<>();
//遍历字符串,获取字符
for (char c :str.toCharArray()){
//shi用获取到的字符,去Map集合判断是否存在
if(map.containsKey(c)){
//key存在
Integer value = map.get(c);
value++;
map.put(c,value);
}else {
//key不存在
map.put(c,1);
}
}
//遍历Map集合,输出结果
for ( Character key :map.keySet()){
Integer value = map.get(key);
System.out.println(key+"= "+value);
}
}
}