由于 Java 中的集合框架的内容比较多,在这里分为三个部分介绍 Java 的集合框架,内容是从浅到深,如果已经有 java 基础的小伙伴可以直接跳到 <浅入深出之 Java 集合框架(下)>。
浅入深出之 Java 集合框架(上)
浅入深出之 Java 集合框架(中)
浅入深出之 Java 集合框架(下)努力赶制中。。关注后更新会提醒哦!
在 < 浅入深出之 Java 集合框架(上)> 中介绍了 List 接口和 Set 接口的基本操作,在这篇文章中,我将介绍关于 Map 接口的基本操作。使用的示例是在 < 浅入深出之 Java 集合框架(上)> 中的模拟学生选课的小程序,不清楚的朋友可以先去阅读 < 浅入深出之 Java 集合框架(上)>。
1. Map 接口提供了一中映射关系,其中的元素是键值对(key-value)的形式存储的,能够实现根据 Key 快速查找 value。Key-value 可以是任何对象,是以 Entry 类型的对象实例存在的。
2.Key 是不可以重复的,Value 是可以重复的。Key-value 都可以为 null,不过只能有一个 key 是 null。
3.Map 支持泛型,Map<K,V>
4. 每个键最多只能映射到一个值
5.Map 接口提供了分别返回 key 值集合、value 值集合以及 Entry(键值对)集合的方法
6. 通过 put<K key,V value>,remove<Object key> 操作数
1. HashMap 中的 Entry 对象是无序排列的,HashMap 是 Map 的一个重要实现类,也是最常用的,基于哈希表是实现
2. Key 值和 value 值都可以为 null,但是一个 HashMap 只能有一个 key 值为 null 的映射(key 不可重复)
1. 通过 Map<String,Student> 进行学生信息管理,其中 key 为学生 ID,value 为学生对象。
2. 通过键盘输入学生信息
3. 对集合中的学生信息进行增删该查操作
首先创建一个 StuMap 类来测试 Map 的使用方法。如下:
- 1
- /**
- 2 * 学生类的Map集合类
- 3 *
- 4 * @author acer
- 5 *
- 6 */
- 7 public class StuMap {
- 8 // 用来承装学生类型对象
- 9 private Map students;
- 10 private static Scanner in ;
- 11 {
- 12 in =new Scanner(System. in );
- 13
- }
- 14 15 public StuMap() {
- 16 students = new HashMap();
- 17 18
- }
- 19 //省略方法,下面的方法会逐个列出
- 20
- }
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
和 List 接口不同,向 Map 添加对象使用的是 put(key,value) 方法。以下是使用示例:
- 1
- /*
- 2 * 添加学生类 输入学生id,
- 3 * 判断是否被占用 若未被占用,则输入姓名,创建新的学生对象,并且把该对象添加到Map中
- 4 * 否则,则提示已有该id
- 5 */
- 6 public void AddStu() {
- 7 System.out.println("请输入要添加的学生id:");
- 8 String Id = in.next(); // 接受输入的id
- 9 Student st = students.get(Id);
- 10
- if (st == null) {
- 11 12 System.out.println("请输入要添加的学生姓名:");
- 13 String name = in.next(); // 接受输入的name
- 14 this.students.put(Id, new Student(Id, name));
- 15
- } else {
- 16 System.out.println("此Id已被占用!");
- 17
- }
- 18 19
- }
再写一个打印输出的测试函数,如:
- 1
- /*
- 2 * 打印学生类
- 3 *
- 4 */
- 5 public void PrintStu() {
- 6 System.out.println("总共有" + this.students.size() + "名学生:");
- 7 //遍历keySet
- 8
- for (String s: this.students.keySet()) {
- 9 Student st = students.get(s);
- 10
- if (st != null) {
- 11 System.out.println("学生:" + students.get(s).getId() + "," + students.get(s).getName());
- 12
- }
- 13
- }
- 14
- }
上面的例子是使用 Map 的 keySet() 返回 Map 中的 key 的 Set 集合再用 if 进行判断输出,在 Map 还可以用 entrySet() 的方法返回 Map 中的键值对 Entry,如:
- 1
- /*
- 2 * 通过entrySet方法遍历Map
- 3 */
- 4 public void EntrySet() {
- 5 Set > entrySet = students.entrySet();
- 6
- for (Entry entry: entrySet) {
- 7 System.out.println("取得建:" + entry.getKey());
- 8 System.out.println("对应的值:" + entry.getValue().getName());
- 9 10
- }
- 11
- }
最后我们用主函数调用一下这些函数来看看效果如何
- 1 public static void main(String[] args) {
- 2 StuMap stu = new StuMap();
- 3
- for (int i = 0; i < 3; i++) {
- 4 stu.AddStu();
- 5
- }
- 6 stu.PrintStu();
- 7 stu.EntrySet();
- 8
- }
代码分析:
1.student.get(ID) 是采用 Map 的 get()方法,检测是否存在值为 ID 的学生,如果没有,则返回 null。这里的案例是把 Map 中的 key 值设为学生的 ID 值,所以可以用这样的方式来检测,如果 key 值是学生其他属则性另当别论!!
2.keySet() 方法,返回所有键的 Set 集合。
3.keyset() 返回 Map 中所有的 key 以集合的形式可用 Set 集合接收,HashMap 当中的映射是无序的。
3.Map 还可以用 entrySet() 的方法返回 Map 中的键值对 Entry,Entry 也是 Set 集合,它可以调用 getKey() 和 getValue() 方法来分别得到键值对的" 键 "和" 值 "。
运行结果:
删除 Map 中的键值对是调用 remove(object key) 方法,下面是它的使用示例:
- 1
- /*
- 2 * 删除map中映射
- 3 */
- 4 public void RemoveStu() {
- 5 do {
- 6 System.out.println("请输入要删除的学生id:");
- 7 String Id = in.next(); // 接受输入的id
- 8 Student st = students.get(Id);
- 9
- if (st == null) {
- 10 System.out.println("此id不存在!");
- 11 12
- } else {
- 13 this.students.remove(Id);
- 14 System.out.println("成功删除" + st.getId() + "," + st.getName() + "同学");
- 15
- break;
- 16
- }
- 17
- } while ( true );
- 18
- }
运行结果:
修改 Map 中的键值对有两种方法,第一种就是用 put 方法。其实就是添加方法中的 put,使用方法跟添加无异,这里的本质就是利用 put 把原来的数据给覆盖掉,即修改。
- 1
- /*
- 2 * 利用put方法修改Map中的value值
- 3 */
- 4 public void ModifyStu() {
- 5 do {
- 6 System.out.println("请输入要修改的学生id:");
- 7 String Id = in.next(); // 接受输入的id
- 8 Student st = students.get(Id);
- 9
- if (st == null) {
- 10 System.out.println("此id不存在!");
- 11 12
- } else {
- 13 System.out.println("学生原来的姓名:" + st.getName() + ",请输入修改后的姓名:");
- 14 String name = in.next(); // 接受输入的name
- 15 st = new Student(Id, name);
- 16 this.students.put(Id, st);
- 17 System.out.println("成功修改!修改后的学生为:" + st.getId() + "," + st.getName() + "同学");
- 18
- break;
- 19
- }
- 20
- } while ( true );
- 21 22
- }
除了用 put 方法外,Map 中提供一个叫做 replace 的方法,知名知其意,就是 "替换" 的意思。replace 的方法使用和 put 方法一样,这是因为它的内部源码如下:
- 1
- if (map.containsKey(key)) {
- 2
- return map.put(key, value);
- 3
- } else 4
- return null;
- 5
可以看出 replace 方法就是调用 put 方法来完成修改操作的,但是我们为了和添加 put 进行区分,最好在使用修改的时候用 replace 方法进行修改。这样的代码可读性和维护性就增强了。
那么使用 replace 修改 Map 中的 value 值如下:(推荐使用 replace 方法)
- 1
- /*
- 2 * 利用replace方法修改Map中的value值
- 3 */
- 4 public void Modify() {
- 5 do {
- 6 System.out.println("请输入要修改的学生id:");
- 7 String Id = in.next(); // 接受输入的id
- 8 Student st = students.get(Id);
- 9
- if (st == null) {
- 10 System.out.println("此id不存在!");
- 11 12
- } else {
- 13 System.out.println("学生原来的姓名:" + st.getName() + ",请输入修改后的姓名:");
- 14 String name = in.next(); // 接受输入的name
- 15 st = new Student(Id, name);
- 16 this.students.replace(Id, st);
- 17 System.out.println("成功修改!修改后的学生为:" + st.getId() + "," + st.getName() + "同学");
- 18
- break;
- 19
- }
- 20
- } while ( true );
- 21
- }
运行结果:
Map - 特点:元素成对出现,key-value,是映射关系,key 不能重复,但 value 可以重复,也就是说,可以多 key 对一个 value。支持泛型如 Map
- 实现类:HashMap 是最常用的,HashMap 中是无序排列,其元素中 key 或 value 可为 null(但只能有一个为 null)。
- 声明 (泛型) 举例: 在类中声明 public Map <类型 1, 类型 2> xxx; 然后再构造方法中 this.xxx = new HashMap <类型 1, 类型 2();
- 获取:yy temp = xxx.get(key)
- 添加:xxx.put(key(xx 型), zz(yy 型) );
- 返回 map 中所有 key(返回是 set 型集合形式) set xxxxx = xxx.keyset(); 用于遍历。
- 返回 map 中所有 entry 对(key-value 对)(返回是 set 型集合形式) set
- 删除:xxx.remove(key);
- 修改:可以用 put,当 put 方法传入的 key 存在就相当于是修改(覆盖);但是推荐使用 replace 方法!
本章主要介绍了 Map 接口的基本操作,发出下一篇预告:集合的基本操作不够用怎么办?如何判断集合中的某个元素对象是否存在?如何对 List 集合进行排序呢?这些问题是否困扰着你呢,在下一篇中博主将会针对这些问题来给大家介绍 java 集合框架的其他成员,后续如何请关注~~
来源: http://www.cnblogs.com/hysum/p/7138806.html