Map

来源:互联网 发布:网络信息安全注意事项 编辑:程序博客网 时间:2024/05/29 13:40

Map集合

他和Collection一样,都属于集合框架中的顶层接口;

 

Map<K,V>    key-value   即同时要让里面传两个参数;

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

Map集合的特点:

该集合存储键值对,是一对一对往里存,而且要保证键的唯一性;

 

成对成对的出现,就像list一样,都有脚标;

 Collection 单列集合  Map  双列集合;

基本的集合思想   增删改查;

1、添加;

V put(K key, V value)

void putAll(Map<? extends K,? extendsV> m)

 

2、删除;

void clear()

V remove(Object key) 

3、判断;

boolean containsKey(Object key)

boolean containsValue(Object value)

boolean isEmpty()

 

4、

获取;

V get(Object key) 

int size() 

Collection<V> values() 

 

Set<Map.Entry<K,V>>entrySet() 

Set<K> keySet()

 

 

Map集合常见三个子集合

 Hashtable   特点是底层是哈希表数据结构,不可以存入null键null值的情况;该集合是线程同步的;效率低;JDK 1.0;

 HashMap   底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的;效率高;JDK1.2;

(当两个数据结构一模一样,一定有一个取代了另一个;)

TreeMap 底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序;

map集合和Set集合很像,其实Set底层就是使用的Map集合;

 

remove(key);是把key干掉后,然后返回的是其value;

也可以用get(key)来进行判断是否有value;

HashMap可以通过get的返回值来判断一个键是否存在,通过返回null来判断

HashMap可以往里面存null值,存一个也可以,但是Hashtable就不行;

 

注意:hash表数据结构的集合,肯定是没有序的;是按照hash值的顺序来排的,不是按照取值的顺序的;

 

value();表示返回所有的value值的一个集合;

 

Map集合要保证键的唯一性;

 

put()添加元素时,如果是添加的相同的key,那么对应的value值中后添加的覆盖原有的,并且put方法返回被覆盖的值;

 

get方法可以通过一个键来取回对应的value值;

 

那么如何取出所有的键值对呢?

Collection是迭代器,而这里没有这个;

 

Map集合的两种取出方式:

1、set <>  keySet:将map中所有的键存入到set集合,因为set具备迭代器;所以可以迭代方式取出所有的值,在根据get方法,获取每一个键的对应的值;

 

keySet();   set  集,把所有的键存到了set集合了;

 

map集合不需要迭代器,因为map集合的取出原理就是将map集合转成set集合中的迭代器取出;   

 

2、Set<Map.Entry<K,V>>entrySet()  将map集合中的映射关系存入到了set集合中,而这种关系的数据类型就是Map.Entry<K,V>

 

Map.Entry<K,V>  反映的是一种映射关系的数据类型;  这可以进行泛型嵌套;

 

这种方法取出的元素是一对一对的,不是一个一个的,这一对一对的类型是Map.Entry<K,V>的;

 

entrySet()将map集合中的映射关系取出;这个关系就是Map.Entry 类型,获取到后,就可以通过Map.Entry中的getKey和getValue方法获取方法中的键和值;

 

map.Entry 其实Entry也是一个接口,他是map接口中的一个内部接口;

他反应的是一种映射关系,即一种键值对,没有map就没有映射关系,所以就必须要把接口建在内部,这样就可以访问到了map的键值对了;

 

能加static的接口一定是内部接口;

static只能用在成员位置上面;

map练习:

 

key-value对中,值是可以重复的,键是不能重复的;如果重复,则会给后添加的覆盖;

所以要用的话,就要保证键的唯一性;重复了就要被踢掉;

 

学生,地址,用map演示一下,保证唯一性;;

 

覆盖toString方法,建立字符串的自定义的表现形式;

 

如果一个描述类,能够产生非常多的对象的时候,可以先把一些必要实现的类都实现,防止用到;如comparable,执行一个顺序;

 

以后在开发中,凡是要一个类要创建非常多的动作,就一定要养成这样的习惯,即一定要完成实现和覆盖必须要的方法;

 

凡是带tree的集合,都可以自定义一个比较器放在构造函数里面;

让集合容器具备比较性;不需要直接让元素具备比较性;

主要条件相等,就比较一下次要条件;

 

tree 的集合,重复的都会去掉一个,只要是无序的都是不能重复的;所以必须要踢掉一个;

 

hash数据结构的集合都是无序的,而tree什么的集合默认是按照自然顺序排序的;

 

 

练习,获取一字符串中的字母出现的次数;打印成结果,c(1)b(4)。。。。

 

通过结果发现,每一个字母都有对应的次数,说明字母和次数之间都有映射关系;

注意了,当发现有映射关系时,可以选择map集合,因为map集合中存放就是映射关系;

 

什么时候使用map集合呢?当数据之间存在着映射关系时,就要先想到map集合;

 

方法思路:

1、将字符串转换成字符数组,因为要对每一个字母进行操作;

2、定义个map集合,因为打印结果的字母有顺序,所以使用TreeMap集合;

3、遍历字符数组,将每一个字母作为键去查map集合;

如果返回null将该字母和1存入到map集合中;

如果返回不是null,说明该字母在map集合已经存在并有对应次数;

那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖调用原来的键所对应的值;

4、将map集合中的数据变成指定的字符串形式返回;

 

泛型里面接受的都是引用数据类型,如果基本数据类型要用到泛型就必须要找到其包装类;

 

要找一个临时容器,就找缓冲区,缓冲期里面什么类型的元素都可以使用;

建议用StringBuilder;

 

有一个很郁闷的地方,16-08视频17min好像没有打印他的打印藏哪里了呢?

 

 

Map集合的扩展知识:一对多的映射关系;

 

map集合被使用是因为他具备映射关系;

 

嵌套循环,大全套小圈  一对多的情况就是用这个原理;

0 0
原创粉丝点击