Map接口和Collection接口的区别
1、Map是双列的,Collection是单列的
2、Map的键唯一,Collection的子体系Set是唯一的
3、Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
Map集合的功能
a:添加功能
V put(K key,V value):添加元素。这个其实还有另一个功能?替换
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
c:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
d:获取功能
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set keySet():获取集合中所有键的集合
Collection values():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的对数
HashMap允许插入null键 null值
HashMap的遍历方法
1、获取所有键的集合,遍历键的集合,获取到每一个键,根据键找值
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapBL {
public static void main(String[] args) {
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(1,"one");
treeMap.put(2,"two");
treeMap.put(3,"three");
Set<Integer> integers = treeMap.keySet();
for (Integer integer : integers) {
String s = treeMap.get(integer);
System.out.println(integer+" "+s);
}
2、获取所有键值对对象的集合,遍历键值对对象的集合,获取到每一个键值对对象,根据键值对对象找键和值
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapBL {
public static void main(String[] args) {
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(1,"one");
treeMap.put(2,"two");
treeMap.put(3,"three");
Set<Map.Entry<Integer, String>> entries = treeMap.entrySet();
for (Map.Entry<Integer, String> entry : entries) {
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+" "+value);
}
}
}
LinkedHashMap的特点
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序,底层的数据结构是链表和哈希表,元素有序并且唯一,元素的有序性由链表数据结构保证,唯一性由哈希表数据结构保证,Map集合的数据结构只和键有关
TreeMap的特点
键的数据结构是红黑树,可保证键的排序和唯一性,排序分为自然排序和比较器排序 ,线程是不安全的效率比较高
注意:TreeMap键不允许插入null
案例演示:统计字符串中每个字符出现的次数
思路:将字符串变成字符数组,循环遍历存入HashMap中,每次存入单个元素时检验一下,如果HashMap没有,就设为1,若果有就给这个元素的个数加上1。
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class NumSum {
public static void main(String[] args) {
String str = "dsd9d89sd8";
char[] chars = str.toCharArray();
HashMap<Object, Integer> ha = new HashMap<>();
for (int i = 0; i < chars.length; i++) {
if (!ha.containsKey(chars[i])) {
ha.put(chars[i], 1);
} else {
Integer integer = ha.get(chars[i]);
integer++;
ha.put(chars[i], integer);
}
}
Set<Map.Entry<Object, Integer>> entries = ha.entrySet();
for (Map.Entry<Object, Integer> entry : entries) {
Object key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"-"+value);
}
}
}
集合嵌套
案例:用嵌套集合输出下面内容,要求排版格式相同
jc 基础班
张三 20
李四 22
jy 就业班
王五 21
赵六 23
1、HashMap嵌套嵌套HashMap,HashMap的每个元素都是一个HashMap值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashQT {
public static void main(String[] args) {
HashMap<String, Integer> jc = new HashMap<>();
jc.put("张三",20);
jc.put("李四",22);
HashMap<String, Integer> jy = new HashMap<>();
jy.put("王五",21);
jy.put("赵六",23);
HashMap<String, HashMap> hashMap = new HashMap<>();
hashMap.put("jc 基础班",jc);
hashMap.put("jy 就业班",jy);
Set<Map.Entry<String, HashMap>> entries = hashMap.entrySet();
for (Map.Entry<String, HashMap> entry : entries) {
String key = entry.getKey();
System.out.println(key);
HashMap value = entry.getValue();
Set<Map.Entry<String,Integer>>entries1 = value.entrySet();
for (Map.Entry<String, Integer> entry1 : entries1) {
String key1 = entry1.getKey();
Integer value1 = entry1.getValue();
System.out.println("\t\t"+key1+" "+value1);
}
}
}
}
2、HashMap嵌套ArrayList
HashMap的元素是ArrayList集合
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashQT {
public static void main(String[] args) {
ArrayList<String> base = new ArrayList<>();
base.add("张三 20");
base.add("李四 22");
ArrayList<String> work = new ArrayList<>();
work.add("王五 21");
work.add("赵六 23");
HashMap hashMap = new HashMap<String,ArrayList>();
hashMap.put("jc 基础班",base);
hashMap.put("jy 就业班",work);
Set<Map.Entry<String,ArrayList>>entries = hashMap.entrySet();
for (Map.Entry<String, ArrayList> entry : entries) {
String key = entry.getKey();
ArrayList value = entry.getValue();
System.out.println(key);
for (Object o : value) {
System.out.println(" "+o);
}
}
}
}
还可以有其他嵌套,方式都相似
HashMap和Hashtable
HashMap: 线程不安全,效率高.允许null值和null键
Hashtable: 线程安全 , 效率低.不允许null值和null键