HashMap存储自定义类型键值
Map集合保证key是唯一的:
作为key的元素,必须重写hashCode和equals方法,以保证key唯一
1. HashMap存储自定义类型键值
key:String类型
String类重写了hashCode方法和equals方法,可以保证key唯一
value:Person类型
value可以重复(同名同年龄的人视为同一个)
例如: HashMap<String, Person> map = new HashMap<>();
map.put("XX", new Person("Xxx",18));
// 使用keySet加增强for遍历Map集合
Set<String> set = map.keySet();
for (String key : set) {
Person value = map.get(key);
System.out.println(key + "-->" + value);
}
2. HashMap存储自定义类型键值
key:Person类型
Person类型就必须重写hashCode方法和equals方法,以保证key唯一
value:String类型
可以重复
例如: HashMap<Person, String> map = new HashMap<>();
map.put(new Person("Xxx",18),"XX");
// 使用entrySet和增强for遍历Map集合
Set<Map.Entry<Person, String>> set = map.entrySet();
for (Map.Entry<Person, String> entry : set) {
Person key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "-->" + value);
}
LinkedHashMap集合
java.util.LinkedHashMap<K,V> extends HashMap<K,V>
Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
底层原理:
哈希表 + 链表(记录元素的顺序)
HashMap<String, String> map = new HashMap<>();
map.put("a","a");
System.out.println(map); // key不允许重复,无序
LinkedHashMap<String, String> linked = new LinkedHashMap<>();
linked.put("a","a");
System.out.println(linked);// key 不允许重复,有序
Hashtable集合
java.util.Hashtable<K,V>集合 implements Map<K,V>接口
Hashtable:底层是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap集合(之前学的所有集合):可以存储null值,null键
Hashtable集合:不能存储null值,null键
Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了
Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和IO流结合的集合
HashMap<String,String> map = new HashMap<>();
map.put(null,"a");
map.put("b",null);
map.put(null,null);
Hashtable<String,String> table = new Hashtable<>();
// table.put(null,"a"); // NullPointerException
// table.put("a",null); // NullPointerException
// table.put(null,null); // NullPointerException
Map集合练习
计算一个字符串中每个字符出现次数
- 分析
使用Scanner获取用户输入的一个字符串
aaabbbbcca
a 4
b 4
c 2
不能重复 可以重复
字符 统计个数
HashMap<Character,Integer>
遍历字符串,获取每一个字符
1. String类的方法toCharArray,把字符串转换为一个字符数组,遍历数组
2. String类的方法length() + charAt(索引)
使用Map集合中的方法判断获取到的字符是否存储在Map集合中
1. 使用Map集合中的方法containsKey(获取到的字符),返回的是boolean值
true:字符存在
通过字符(Key),获取value(统计个数)
把value++
再把新的value存储到Map集合中
false:字符不存在
把字符作为key,1作为value存储到Map集合中
2. 使用Map集合的get(key)
返回null,key不存在
不是null,可以存在
- main方法
分析:
1. 使用Scanner获取用户输入的字符串
2. 创建Map集合,key是字符串中的字符,value是字符的个数
3. 遍历字符串,获取每一个字符
4. 使用获取到的字符串,去Map集合判断key是否存在
key存在:
通过字符串(key),获取value(字符个数)
value++
put(key,value)把新的value存储到Map集合中
key不存在:
put(key,1)
5. 遍历Map集合,输出结果
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next();
HashMap<Character,Integer> map = new HashMap<>();
for(char c : str.toCharArray()){
if(map.containsKey(c)){
//key存在
Integer value = map.get(c);
value++;
map.put(c,value);
} else {
//key不存在
map.put(c,1);
}
}
for(Character key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key + "=" + value);
}
}