黑马程序员-----集合框架类(三) Map集合

黑马程序员-----集合框架类(三) Map集合

1.1 Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
1,添加。
put(K key, V value)
putAll(Map<? extends K,? extends V> m)

2,删除。
clear()
remove(Object key)

3,判断。
containsValue(Object value)
containsKey(Object key)
isEmpty()

4,获取。
get(Object key)
size()
values()

entrySet()
keySet()

Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

和Set很像。
其实大家,Set底层就是使用了Map集合。

示例1:

 1 import java.util.*;
 2 class  MapDemo
 3 {
 4     public static void main(String[] args)
 5     {
 6         Map<String,String> map = new HashMap<String,String>();
 7
 8         //添加元素,如果出现添加相同的键时,那么后添加的值会覆盖原有键对应值。
 9         //并且put方法会返回被覆盖的值。
10         System.out.println("put:"+map.put("01","zhangsan1"));-->put:null
11         System.out.println("put:"+map.put("01","wangwu"));-->put:zhangsan1
12         map.put("02","zhangsan2");
13         map.put("03","zhangsan3");
14
15         System.out.println("containsKey:"+map.containsKey("022"));-->containsKey:true
16         //System.out.println("remove:"+map.remove("02"));-->remove:zhangsan2//remove的时候会找02这个键并把它干掉,返回对应的值
17
18         System.out.println("get:"+map.get("023"));-->get:null
19
20         map.put("04",null);
21         System.out.println("get:"+map.get("04"));-->get:null
22         //可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。
23
24
25
26         //获取map集合中所有的值。
27         Collection<String> coll = map.values();
28
29         System.out.println(coll);-->[null,wangwu,zhangsan2,zhangsan3]
30         System.out.println(map);--><04=null,01=wangwu,02=zhangsan2,03=zhangsan3>
31
32
33     }
34 }

1.2 map集合的两种取出方式(示例2):
1,Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。

Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。

keySet图例:

2,Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry

Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。
关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。

entrySet图例:

示例2:

 1 import java.util.*;
 2
 3
 4 class MapDemo2
 5 {
 6     public static void main(String[] args)
 7     {
 8         Map<String,String> map = new HashMap<String,String>();
 9
10         map.put("02","zhangsan2");
11         map.put("03","zhangsan3");
12         map.put("01","zhangsan1");
13         map.put("04","zhangsan4");
14
15         //将Map集合中的映射关系取出。存入到Set集合中。
16         Set<Map.Entry<String,String>> entrySet = map.entrySet();
17
18         Iterator<Map.Entry<String,String>> it = entrySet.iterator();
19
20         while(it.hasNext())
21         {
22             Map.Entry<String,String> me = it.next();//返回类型为Map.Entry
23             String key = me.getKey();
24             String value = me.getValue();
25
26             System.out.println(key+":"+value);-->04:zhangsan4
27                                  01:zhangsan1
28                                  02:zhangsan2
29                                  03:zhangsan3
30
31         }
32
33         /*
34         //先获取map集合的所有键的Set集合,用keySet()方法;
35         Set<String> keySet = map.keySet();
36
37         //有了Set集合。就可以获取其迭代器。
38         Iterator<String> it = keySet.iterator();
39
40         while(it.hasNext())
41         {
42             String key = it.next();
43             //有了键可以通过map集合的get方法获取其对应的值。
44             String value  = map.get(key);
45             System.out.println("key:"+key+",value:"+value);-->key:04,value:zhangsan4
46                                                     key:01,value:zhangsan1
47                                                     key:02,value:zhangsan2
48                                                     key:03,value:zhangsan3
49         }
50
51         */
52
53     }
54 }

PS:

Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。

示例3:

 1 interface Map
 2 {
 3     public static interface Entry
 4     {
 5         public abstract Object getKey();
 6         public abstract Object getValue();
 7
 8     }
 9 }
10
11 class HashMap implements Map
12 {
13     class Hahs implements Map.Entry
14     {
15         public  Object getKey(){}
16         public  Object getValue(){}
17     }
18
19 }

需求:(示例4)。

每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。

1,描述学生。

2,定义map容器。将学生作为键,地址作为值。存入。

3,获取map集合中的元素。

示例4:

 1 import java.util.*;
 2 class Student implements Comparable<Student>
 3 {
 4     private String name;
 5     private int age;
 6     Student(String name,int age)
 7     {
 8         this.name = name;
 9         this.age = age;
10     }
11
12     public int compareTo(Student s)
13     {
14         int num = new Integer(this.age).compareTo(new Integer(s.age));
15
16         if(num==0)
17             return this.name.compareTo(s.name);
18         return num;
19     }
20
21     public int hashCode()
22     {
23         return name.hashCode()+age*34;
24     }
25     public boolean equals(Object obj)
26     {
27         if(!(obj instanceof Student))
28             throw new ClassCastException("类型不匹配");
29
30         Student s = (Student)obj;
31
32         return this.name.equals(s.name) && this.age==s.age;
33
34
35     }
36     public String getName()
37     {
38         return name;
39     }
40     public int getAge()
41     {
42         return age;
43     }
44     public String toString()
45     {
46         return name+":"+age;
47     }
48 }
49
50
51
52 class  MapTest
53 {
54     public static void main(String[] args)
55     {
56         HashMap<Student,String> hm = new HashMap<Student,String>();
57
58         hm.put(new Student("lisi1",21),"beijing");
59         hm.put(new Student("lisi1",21),"tianjin");
60         hm.put(new Student("lisi2",22),"shanghai");
61         hm.put(new Student("lisi3",23),"nanjing");
62         hm.put(new Student("lisi4",24),"wuhan");
63
64         //第一种取出方式 keySet
65
66         Set<Student> keySet = hm.keySet();
67
68         Iterator<Student> it = keySet.iterator();
69
70         while(it.hasNext())
71         {
72             Student stu = it.next();
73             String addr = hm.get(stu);
74             System.out.println(stu+".."+addr);
75         }
76
77
78         //第二种取出方式 entrySet
79         Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
80
81         Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();
82
83         while(iter.hasNext())
84         {
85             Map.Entry<Student,String> me = iter.next();
86             Student stu = me.getKey();
87             String addr = me.getValue();
88             System.out.println(stu+"........."+addr);
89         }
90     }
91 }
时间: 2024-11-03 21:10:15

黑马程序员-----集合框架类(三) Map集合的相关文章

黑马程序员_Foundation框架—集合

Foundation框架-集合 一.NSArray和NSMutableArray (一)NSArray不可变数组 (1)NSArray的基本介绍 NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组. C语言数组有一个缺点即数组中只能存放同种数据类型的元素. OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等. (2)NSArray的创建 (3)NSArray的访问 (4)NSArray的遍历 数组的遍历有以下几种方式: 首先创建一个数组 第

黑马程序员-面向对象-Object类

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一.Object类中的equals(

黑马程序员-OC的类的构造方法

构造方法:用来初始化对象的:首先分解一下创建对象的过程: Person *p = [Person new]; // new方法是alloc 和 init 这两个方法的组合: 完整的创建可用对象的过程: 1:分配存储空间:  就是调用的  +alloc 方法,这个方法是类方法,返回的是一个分配好存储空间的 对象: 2:初始化:-init 方法,对象方法,由alloc方法返回的对象调用init对对象进行初始化: 所以创建一个对象的规范和常用的方式:  Person *p = [[Person all

黑马程序员——Java基础---IO(三)--File类、Properties类、打印流、序列流(合并流)

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作,因此是对流操作的一种补充 3)File类的实例是不可变的:也就是说,一旦创建,

黑马程序员(Java)---API之集合(Map及其子类、Collections)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 5.4 Map及其子类 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的.Collection集合存储元素是单独出现的,Collection的子类Set是唯一的,List是可重复的. Map集合的数据结构值针对键有效,跟值无关.Collection集合的数据结构是针对元素有效. Map |--Has

黑马程序员--Java基础学习笔记【集合-Map】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Map 接口 Map 接口定义的集合,又称查找表 Map 接口和 Collection 接口没关系 Map 集合派系,存储映射键值对 不允许重复的键,每个键最多映射 1 个值 根据内部数据结构不同,Map 接口有多种实现类: 常用的有内部为 hash 表实现的 HashMap 和内部为排序二叉树实现的 TreeMap Map 接口和 Collection 接口的不同 Map 和 Collect

黑马程序员--Obbjective-C-Foundation框架中的NSString与NSMutableString的用法-我之整理

-----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Foundation框架 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易. Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字典和集合,其他功能包括处理日期和时

黑马程序员-Java异常处理《三》

                         ------- android培训.java培训.期待与您交流! ---------- 1.异常的定义 异常是指程序在运行时期发生不正常事件,导致程序指令流程的无法正常执行. 2.异常的分类 错误(error):jvm系统的内部错误或资源耗尽等严重情况,属于jvm需要负担的责任. 异常(exception):编程的错误或其他外在的因素导致的一般性问题. 注意:程序员只需要处理异常(Exception),而无法处理错误. Error(错误):由Ja

黑马程序员----java基础---详解Collection集合

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1:集合(Collection) (1)集合的由来? 我们学习的是Java -- 面向对象 -- 操作很多对象 -- 对象需要存储 -- 容器(数组和StringBuffer) -- 数组 而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们使用. (2)集合和数组的区别? A:长度区别 数组固定 集合可变 B:内容区别 数组可以是基本类型,也可以是引用类型 集合只能是引用类型