Map
1.概述
--- java.util接口 Map<K,V>
--- Map接口里的数据非常有特点,map里的数据都是一组 键值对.
--- 例如:map.put(10,20); -- 其中10是键 , 20是值
-- 键不能重复,值可以
-- 如果key重复了,后面的会覆盖前面的
--- 一般使用泛型约束Map集合里的键值的 类型 ,,,Map<K,V>
2.特点
--- 可以根据键 提取对应的值
--- 键不允许重复,如果重复值会被覆盖
--- 存放的都是无序数据
--- 初始容量是16,默认的加载因子是0.75
3.常用方法
--- void clear() 从此映射中移除所有映射关系(可选操作)。
--- boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
--- boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
--- V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
--- boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 true。
--- V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。
--- void putAll(Map<? extends K,? extends V> m)从指定映射中将所有映射关系复制到此映射中(可选操作)。
--- V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
--- int size() 返回此映射中的键-值映射关系数。
--- Set<Map.Entry<K,V>> entrySet() 返回此映射所包含的映射关系的 Set 视图。
4.测试代码
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(3, "孙悟空");
map.put(4, "韩信");
map.put(2, "赵云");
map.put(1, "李白");
System.out.println(map);
System.out.println(map.containsKey(3));
System.out.println(map.containsValue("韩信"));
System.out.println(map.size());
System.out.println(map.isEmpty());
System.out.println(map.get(1));
System.out.println(map.hashCode());
System.out.println(map.equals(123));
System.out.println(map.remove(1));
Map<Integer,String> map2 = new HashMap<>();
map2.putAll(map);
System.out.println(map2);
Set<Integer> set = map.keySet();
for (Integer key : set) {
System.out.println(key + "...foreach..." + map.get(key));
}
Set<Map.Entry<Integer, String>> entry = map.entrySet();
for (Map.Entry<Integer, String> mapEntry : entry) {
System.out.println(mapEntry.getKey() + "~~~ Map.Entry ~~~" + mapEntry.getValue());
}
Collection<String> values = map.values();
for (String value : values) {
System.out.println(value + "/// Collection ///");
}
}
HashMap
1.概述
--- HashMap是Map接口的实现类.
--- 可以使用Map接口的所有方法.
2.原理
--- 底层是一个哈希表/散列表
--- 把数据存在桶里
--- 由数组 和 链表组成的
--- 当往HashMap里存放数据时,,,,
会根据hash算法(hashCode())计算数据的存储位置(hash(key))
如果数组的位置没有数据,直接存在数组节点上.
如果数组的位置存过数据了(hash冲突),会形成链表结构.
jdk1.8对于链表结构的查询效率做了优化,当链表长度达到8时会变成红黑树来提升查询效率
3.测试代码
--- 需求:分析用户输入的字符串中 每个字符出现的次数
public static void main(String[] args) {
String s = new Scanner(System.in).nextLine();
Map<Character,Integer> map = new HashMap<>();
for (int i=0; i<s.length(); i++) {
char key = s.charAt(i);
Integer value = map.get(key);
if (value == null) {
map.put(key, 1);
} else {
map.put(key, value+1);
}
}
System.out.println(map);
}