Map (双列集合的根接口)
特点:
1.以键值对形式保存数据 一个key对应一个value
2.键保持唯一
HashMap
HashSet 和 HashMap
底层都是哈希算法,也就是一套算法两个类使用
HashSet底层是依赖HashMap去实现的,添加到Set中的值实际上是添加到Map中键的位置
HashMap 有去重功能 键位可以去重
基本方法:
// 添加方法
HashMap<String, Integer> map = new HashMap<>();
Integer i1 = map.put("zs", 20);
map.put("zw", 20);
map.put("zl", 20);
map.put("zq", 20);
Integer i5 = map.put("zs", 21);
// put返回的是 被覆盖的值
System.out.println(map);
System.out.println(i1);
System.out.println(i5);
HashMap<String, Integer> map = new HashMap<>();
map.put("zs", 20);
map.put("zw", 20);
map.put("zl", 20);
map.put("zq", 20);
// 是否包含key
boolean containsKey = map.containsKey("zs");
System.out.println(containsKey);
// 是否包含value
boolean containsValue = map.containsValue(20);
System.out.println(containsValue);
// 通过key获取对应的value
Integer value = map.get("zl");
Integer value1 = map.get("zm");
System.out.println(value);
System.out.println(value1);
// 获取所有key的Set集合
Set<String> keySet = map.keySet();
System.out.println(keySet);
// 获取所有value的集合
Collection<Integer> values = map.values();
System.out.println(values);
// 通过key删除整个键值对
Integer remove = map.remove("zm");
System.out.println(remove);
// 清空Map
map.clear();
System.out.println(map);
自定义对象时,通过重写equals和hashCode之后,key相同value会被新值覆盖保持Map键的唯一性
// 创建一个map
HashMap<Student, String> map = new HashMap<>();
map.put(new Student("pp", 21), "安徽");
map.put(new Student("bb", 21), "河南");
map.put(new Student("xx", 21), "江苏");
map.put(new Student("xx", 21), "江北");
System.out.println(map);
遍历:
HashMap<String, Integer> map = new HashMap<>();
map.put("zs", 22);
map.put("zw", 21);
map.put("zl", 20);
map.put("zq", 19);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
Integer integer = map.get(next);
System.out.println(next + "=" + integer);
}
Set<String> keySet = map.keySet();
for (String string : keySet) {
Integer value = map.get(string);
System.out.println(string + "=" + value);
}
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + "=" + value);
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + "=" + value);
}
例子:键盘输入字符串 统计字符串中每个字符出现的次数(使用map完成)
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
char[] charArray = string.toCharArray();
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < charArray.length; i++) {
if (map.containsKey(charArray[i])) {
Integer value = map.get(charArray[i]);
value++;
map.put(charArray[i], value);
} else {
map.put(charArray[i], 1);
}
}
System.out.println(map);
LinkedHashMap
LinkedHashMap 特点:有序(怎么存怎么取)
例如:
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
map.put("dp", 11);
map.put("gs", 11);
map.put("jz", 11);
map.put("xm", 11);
System.out.println(map);
TreeMap
// Student类实现Comparable接口 按年龄排序
TreeMap<Student, String> map = new TreeMap<>();
map.put(new Student("gs", 21), "浙江");
map.put(new Student("zb", 22), "河南");
map.put(new Student("xx", 20), "江苏");
map.put(new Student("dp", 23), "安徽");
System.out.println(map);
Collections
Collections 类中方法(静态方法)
ArrayList<Integer> list = new ArrayList<>();
list.add(12);
list.add(18);
list.add(14);
list.add(17);
Collections.shuffle(list);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
int index = Collections.binarySearch(list, 18);
System.out.println(index);
Collections.reverse(list);
System.out.println(list);
Map集合 嵌套
需求:
public static void main(String[] args) {
HashMap<Student, String> classes1 = new HashMap<>();
classes1.put(new Student("SC", 20), "山西");
classes1.put(new Student("gs", 20), "浙江");
classes1.put(new Student("dp", 20), "安徽");
HashMap<Student, String> classes2 = new HashMap<>();
classes2.put(new Student("ww", 20), "山西");
classes2.put(new Student("wl", 20), "河南");
classes2.put(new Student("wq", 20), "江西");
HashMap<HashMap<Student, String>, String> javaMap = new HashMap<>();
javaMap.put(classes1, "Java1班");
javaMap.put(classes2, "Java2班");
for (HashMap<Student, String> ban: javaMap.keySet()) {
String string = javaMap.get(ban);
System.out.println(string);
for (Student student: ban.keySet()) {
String string2 = ban.get(student);
System.out.println(student + " " + string2);
}
System.out.println();
}
}