java 深入技术六(Map)

时间:2023-05-15 21:36:32

Map

1.map概述

map.put(key,value)里面存放的是两个相关的数据,key=value键值对

Map集合中存放的是键值对(put(key,value)),用get(key)获取集合中的元素

从get方法此时的参数还是Object类型的,get方法没有实用泛型

Map集合的操作

*添加

put(key,value) //把一个键值对存放到map集合中

*删除

remove(Object key) //删除key为指定对象的键值对

* void clear() //清空map集合中的所有元素

*判断

boolean containKey(Object key)  //判断是否包含key为指定对象的键值对

boolean containValue(Object value) //判断是否包含value为指定对象的元素

boolean isEmpty() //判断Map集合是否包含元素

* 获取

get(Object key ) //获得指定key对应的value

Set<K> keySet() //获得所有key组成的Set集合

Collection <V> values() //获得所有value组成的Set集合

Set<Map.Entry<K,V>> entrySet() //获得所有键值对对象组成的Set集合

int size() //获得map集合的大小(存了多少元素)

2.HashMap

数据结构:内部是哈希表,一次存储的是一对键值对,元素为Map.Entry类的对象,Entry里封装了一个键值对

特点:把key和value封装到Entry对象中

从Map的设计来看,是通过key找到value值的,所以在map中,key的值不能重复,但value可以重复

因为内部结构为哈希表,所以添加删除查询操作很快

由内部结构决定了HashMao不能直接遍历,需要使用Set集合的遍历方法遍历,就有了keySet(),values(),entrySet()三个方法,其中keySet(),values() 依赖entrySet()

3.遍历map的三种方式

get(Object key ) //获得指定key对应的value

Set<K> keySet() //获得所有key组成的Set集合

Collection <V> values() //获得所有value组成的Set集合

Set<Map.Entry<K,V>> entrySet() //获得所有键值对对象组成的Set集合

4.HashMap练习

1.自定义MyHashMap,可以存储三个对象,提供put(key,v1,v2),get(key),remove(key)

2.统计一票文章中每一个字符出现的次数,并打印到控制台(忽略空格符,换行符,回车符,制表符等空白符)

3.把一个字符串中的简体中文转换为繁体中文

5. TreeMap

内部结构:二叉树,元素是Map.Entry类的对象-包装了key和Value

特点:元素添加到map中时就已经按key排了顺序

添加,删除,获取操作都很快

由于按key进行排序,所以要求key具有排序性(自身实现comparable接口,或者实现比较器comparator接口)

6.TreeMap练习

1. 统记一篇文章中字符出现的次数,并且用字典顺序排序

2. 统记一篇文章中字符出现的次数,并且降序排序

7. Properties类的用法

HashTable 是jdk老版本的遗留类,内部也是哈希表,因为是线程安全的,所以各种操作都相对比较慢,已经被HashMap替代

HashTable还有一个子类Properties,具有集合的特点,又可以进行文件的读取写入操作,使用频率高

load(Reader reader) 字符流

专门用来properties文件

getProperties()

setProperties()

8. Collections 工具类

专门针对接口的一个工具类Collections

方法;sort 对List集合进行排序

binarySearch 方法,使用二分查找法查找元素,要求必须是List集合,而且必须已经排好序,返回查找元素的索引位置

fill 方法 使用指定元素填充List集合

replaceAll 方法 使用指定元素替换所有的另一个元素,只对List有效

max 方法 返回一个集合中最大的元素

min

shuffle 洗牌 打乱集合元素的顺序

unmodifiableList  返回指定集合的不可修改的包装集合(包装成一个内部类,不可修改)

synchronizedList 返回指定集合的线程安全的包装集合

9. 集合的线程安全问题

当多个线程同时对List对象进行操作时

a 线程添加元素,b线程删除元素

问题:数据错乱

解决办法:1.自己使用同步机制控制2.把普通集合对象转换为线程安全的集合对象

a线程遍历元素,b线程添加或删除元素

问题:同步修改异常

解决办法: 1.自己使用同步机制控制2.把普通集合对象转换为线程安全的集合对象,并且遍历,需要手动同步

collection中是[]

Map中是{}

1.自己使用同步机制控制,需要遍历和添加的线程中都添加同步机制控制

2..把普通集合对象转换为线程安全的集合对象,并且遍历,需要手动同步,这个只需要在遍历的时候添加同步机制控制就行

10.Java集合的工具类Arrays

方法:sort  给数组的元素排序

binarySearch 二分查找法查找元素,返回索引值

copyOf   数组复制

equals 判断两个数组的元素是否相等

fill 填充数组

hashCode 计算数组元素的哈希值

toString 返回每个数组元素组成的字符串

asList  把数组转化为结构不可改变,但可以查询修改的集合

11增强For循环

for(元素类型 类型名:需要遍历的集合对象){

System.out.println(类型名)}

12.结束练习

设计一个数据结构:可以用来存储一个学校中所有年级的所有班级的所有学生的所有课程的成绩