一、Map集合
1.1 Map集合概述和特点
-
Map集合概述
interface Map<K,V> // K:键的类型;V:值的类型
-
Map集合的特点
- 双列集合,一个键对应一个值
- 键不可以重复,值可以重复
1.2Map集合的基本功能
-
方法介绍
方法名 说明 V put(K key,V value)
元素不存在则添加元素,存在则修改并返回旧值 V remove(Object key)
根据键删除键值对元素,并返回删除的值 void clear()
移除所有的键值对元素 boolean containsKey(Object key)
判断集合是否包含指定的键 boolean containsValue(Object value)
判断集合是否包含指定的值 boolean isEmpty()
判断集合是否为空 int size()
集合的长度,也就是集合中键值对的个数 -
示例代码
import java.util.HashMap; import java.util.Map; public class Demo01 { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); // V put(K key,V value) // 添加元素 map.put("001", "zhangsan"); map.put("002", "lisi"); map.put("003", "wangwu"); System.out.println(map); // {001=zhangsan, 002=lisi, 003=wangwu} // V remove(Object key) // 根据键删除键值对元素 map.remove("001"); System.out.println(map); // void clear() // 移除所有的键值对元素 // map.clear(); System.out.println(map); // boolean containsKey(Object key) // 判断集合是否包含指定的键 boolean result0 = map.containsKey("001"); boolean result1 = map.containsKey("002"); System.out.println(result0); System.out.println(result1); System.out.println("==========="); // boolean containsValue(Object value) // 判断集合是否包含指定的值 boolean result2 = map.containsValue("zhangsan"); boolean result3 = map.containsValue("lisi"); System.out.println(result2); System.out.println(result3); // boolean isEmpty() // 判断集合是否为空 System.out.println(map.isEmpty()); // int size() // 集合的长度,也就是集合中键值对的个数 System.out.println(map.size()); map.clear(); System.out.println(map.isEmpty()); System.out.println(map.size()); } }
1.3 Map集合的获取功能
-
方法介绍
方法名 说明 V get(Object key)
根据键获取值 Set<K> keySet()
获取所有键的集合 Collection<V> values()
获取所有值的集合 Set<Map.Entry<K,V>> entrySet()
获取所有键值对对象的集合 -
示例代码
import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Demo02 { public static void main(String[] args) { Map<String,String> map = new HashMap<>(); map.put("001","zhangsan"); map.put("002","lisi"); // V get(Object key) // 根据键获取值 String s = map.get("001"); System.out.println(s); // Set<K> keySet() // 获取所有键的集合 Set<String> keys = map.keySet(); System.out.println(keys); // Collection<V> values() // 获取所有值的集合 Collection<String> values = map.values(); System.out.println(values); // Set<Map.Entry<K,V>> entrySet() // 获取所有键值对对象的集合 System.out.println("=========="); Set<Map.Entry<String, String>> entries = map.entrySet(); System.out.println(entries); } }
1.4Map集合的遍历(法一)
-
步骤分析
- 获取所有键的集合。用
keySet()
方法实现 - 遍历键的集合,获取到每一个键。用增强
for
实现 - 根据键去找值。用
get(Object key)
方法实现
- 获取所有键的集合。用
-
代码实现
import java.util.HashMap; import java.util.Map; import java.util.Set; public class Demo03 { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("001", "zhangsan"); map.put("002", "lisi"); map.put("003", "wangwu"); // 先获取所有的键的集合 Set<String> keySet = map.keySet(); for (String s : keySet) { // 分别用键去获取值 String s1 = map.get(s); System.out.println(s + "=" + s1); } } }
1.5 Map集合的遍历(法二)
-
步骤分析
- 获取所有键值对对象的集合
Set<Map.Entry<K,V>> entrySet()
:获取所有键值对对象的集合
- 遍历键值对对象的集合,得到每一个键值对对象
- 用增强
for
实现,得到每一个Map.Entry
- 用增强
- 根据键值对对象获取键和值
- 用
getKey()
得到键 - 用
getValue()
得到值
- 用
- 获取所有键值对对象的集合
-
代码实现
import java.util.HashMap; import java.util.Map; import java.util.Set; public class Demo04 { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("001", "zhangsan"); map.put("002", "lisi"); map.put("003", "wangwu"); // Entry是Map接口内的接口,用getKey和getValue方法返回键和值 Set<Map.Entry<String, String>> entries = map.entrySet(); for (Map.Entry<String, String> entry : entries) { System.out.println(entry.getKey()); System.out.println(entry.getValue()); } } }
二、HashMap集合
2.1 HashMap集合概述和特点
HashMap
底层是哈希表结构的- 依赖
hashCode
方法和equals
方法保证键的唯一 - 如果键要存储的是自定义对象,需要重写
hashCode
和equals
方法
2.2HashMap集合应用案例
-
案例需求
- 创建一个
HashMap
集合,键是学生对象(Student
),值是居住地 (String
)。存储多个元素,并遍历。 - 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象
- 创建一个
-
代码实现
学生类
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }
- 测试类
public class HashMapDemo { public static void main(String[] args) { //创建HashMap集合对象 HashMap<Student, String> hm = new HashMap<Student, String>(); //创建学生对象 Student s1 = new Student("林青霞", 30); Student s2 = new Student("张曼玉", 35); Student s3 = new Student("王祖贤", 33); Student s4 = new Student("王祖贤", 33); //把学生添加到集合 hm.put(s1, "西安"); hm.put(s2, "武汉"); hm.put(s3, "郑州"); hm.put(s4, "北京"); //遍历集合 Set<Student> keySet = hm.keySet(); for (Student key : keySet) { String value = hm.get(key); System.out.println(key.getName() + "," + key.getAge() + "," + value); } } }
三、TreeMap集合
3.1 TreeMap集合概述和特点
TreeMap
底层是红黑树结构- 依赖自然排序或者比较器排序,对键进行排序
- 如果键存储的是自定义对象,需要实现
Comparable
接口或者在创建TreeMap
对象时候给出比较器排序规则
3.2TreeMap集合应用案例一
-
案例需求
- 创建一个
TreeMap
集合,键是学生对象(Student
),值是籍贯(String
),学生属性姓名和年龄,按照年龄进行排序并遍历 - 要求按照学生的年龄进行排序,如果年龄相同则按照姓名进行排序
- 创建一个
-
代码实现
学生类
public class Student implements Comparable<Student> { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Student o) { //按照年龄进行排序 int result = o.getAge() - this.getAge(); //次要条件,按照姓名排序。 result = result == 0 ? o.getName().compareTo(this.getName()) : result; return result; } }
测试类
import java.util.TreeMap; public class Test1 { public static void main(String[] args) { // 创建TreeMap集合对象 TreeMap<Student, String> tm = new TreeMap<>(); // 创建学生对象 Student s1 = new Student("xiaohei", 23); Student s2 = new Student("dapang", 22); Student s3 = new Student("xiaomei", 22); // 将学生对象添加到TreeMap集合中 tm.put(s1, "江苏"); tm.put(s2, "北京"); tm.put(s3, "天津"); // 遍历TreeMap集合,打印每个学生的信息 tm.forEach((Student key, String value) -> { System.out.println(key + "---" + value); }); } }
3.3TreeMap集合应用案例二
-
案例需求
- 给定一个字符串,要求统计字符串中每个字符出现的次数。
- 举例:给定字符串是
aababcabcdabcde
,在控制台输出:a(5)b(4)c(3)d(2)e(1)
-
代码实现
import java.util.TreeMap; public class Test2 { public static void main(String[] args) { // =给定字符串是`aababcabcdabcde`,在控制台输出:`a(5)b(4)c(3)d(2)e(1)` String s = "aababcabcdabcde"; // 创建TreeMap集合对象,键是Character,值是Integer TreeMap<Character, Integer> tm = new TreeMap<>(); //遍历字符串,得到每一个字符 for (int i = 0; i < s.length(); i++) { //c依次表示字符串中的每一个字符 char c = s.charAt(i); // 判断当前遍历到的字符是否在集合中出现过 if (!tm.containsKey(c)) { //表示当前字符是第一次出现。 tm.put(c, 1); } else { //存在,表示当前字符已经出现过了 // 先获取这个字符已经出现的次数 Integer count = tm.get(c); //自增,表示这个字符又出现了依次 count++; //将自增后的结果再次添加到集合中。 tm.put(c, count); } } System.out.println(tm); // 打印TreeMap的内容 // 按照要求格式打印 tm.forEach((Character key, Integer value) -> { System.out.print(key + "(" + value + ")"); }); } }
四、可变参数
4.1 可变参数
-
可变参数介绍
- 可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
- 方法的参数类型已经确定,个数不确定,我们可以使用可变参数
-
可变参数定义格式
修饰符 返回值类型 方法名(数据类型… 变量名) { }
-
可变参数的注意事项
- 这里的变量其实是一个数组
- 如果一个方法有多个参数,包含可变参数,可变参数要放在最后
-
可变参数的基本使用
public class ArgsDemo01 { public static void main(String[] args) { System.out.println(sum(10, 20)); System.out.println(sum(10, 20, 30)); System.out.println(sum(10, 20, 30, 40)); System.out.println(sum(10, 20, 30, 40, 50)); System.out.println(sum(10, 20, 30, 40, 50, 60)); System.out.println(sum(10, 20, 30, 40, 50, 60, 70)); System.out.println(sum(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)); } // public static int sum(int b, int... a) { // return 0; // } public static int sum(int... a) { int sum = 0; for (int i : a) { sum += i; } return sum; } }
4.2创建不可变集合
-
方法介绍
- 在
List
、Set
、Map
接口中,都存在of
方法,可以创建一个不可变的集合- 这个集合不能添加,不能删除,不能修改
- 但是可以结合集合的带参构造,实现集合的批量添加
- 在
Map
接口中,还有一个ofEntries
方法可以提高代码的阅读性- 首先会把键值对封装成一个
Entry
对象,再把这个Entry
对象添加到集合当中
- 首先会把键值对封装成一个
- 在
-
示例代码
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; public class MyVariableParameter4 { public static void main(String[] args) { method1(); method2(); method3(); method4(); } private static void method4() { Map<String, String> map = Map.ofEntries( Map.entry("zhangsan", "江苏"), Map.entry("lisi", "北京") ); System.out.println(map); } private static void method3() { // static <K , V> Map<K,V> of(E…elements) 创建一个具有指定元素的Map集合对象 Map<String, String> map = Map.of("zhangsan", "江苏", "lisi", "北京", "wangwu", "天津"); System.out.println(map); } private static void method2() { // static <E> Set<E> of(E…elements) 创建一个具有指定元素的Set集合对象 //传递的参数当中,不能存在重复的元素。 Set<String> set = Set.of("a", "b", "c", "d"); System.out.println(set); } private static void method1() { // static <E> List<E> of(E…elements) 创建一个具有指定元素的List集合对象 List<String> list = List.of("a", "b", "c", "d"); System.out.println(list); // list.add("Q"); // list.remove("a"); // list.set(0,"A"); // System.out.println(list); // 集合的批量添加。 // 首先是通过调用List.of方法来创建一个不可变的集合,of方法的形参就是一个可变参数。 // 再创建一个ArrayList集合,并把这个不可变的集合中所有的数据,都添加到ArrayList中。 ArrayList<String> list2 = new ArrayList<>(List.of("a", "b", "c", "d")); System.out.println(list2); } }