java 深入技术六(Map)
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.结束练习
设计一个数据结构:可以用来存储一个学校中所有年级的所有班级的所有学生的所有课程的成绩
java 深入技术六(Map)的更多相关文章
- Java多线程系列六——Map实现类
参考资料: https://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-syn ...
- 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)
本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...
- 如何才能够系统地学习Java并发技术?
微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些 ...
- java 深入技术八(内省)
1. javabean的软件设计思想 2.内省:封装了java反射,提供直接操作属性的Setter和getter方法的方法 3.核心API:BeanInfo java 的描述信息,Introspect ...
- Java Web技术总结(目录)
来源于:http://www.jianshu.com/p/539bdb7d6cfa Java Web技术经验总结(一) Java Web技术经验总结(二) Java Web技术经验总结(三) Java ...
- Java 集合系列 15 Map总结
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java加密技术
相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法 ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
随机推荐
- 在WebAPI使用Session
最近在改写WebApp时要将以前用泛型处理例程写的Captcha 改成使用WebApi 来实作机制,在实作的过程中发现使用IRequiresSessionState session也无法使用(cont ...
- js 判断各种数据类型
了解js的都知道, 有个typeof 用来判断各种数据类型,有两种写法:typeof xxx ,typeof(xxx) 如下实例: typeof 2 输出 number ...
- springmvc请求接收参数的几种方法
一.通过@PathVariable获取路径中的参数 @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GE ...
- HTML5属性--(capture="camera") 上传照片或者打开手机相机
要获取手机相机拍照或者访问相册 这里贴一个相关链接:http://blog.csdn.net/jackfrued/article/details/8967667 JSP页面代码: <inp ...
- 什么是js面向对象??
简单的来说就是键值对,写一个函数,然后传值进去, function Person(name,age){ this.name = name; this.age ...
- MapReduce实现手机上网日志分析(分区)
一.问题背景 实际业务的需要,比如以移动为例,河南的用户去了北京上网,那么他的上网信息默认保存在了北京的基站,那么我们想要查询北京地区的上网日志信息默认也包含了其他地区用户的在本区的上网信息,否则只能 ...
- CUDA程序设计(一)
为什么需要GPU 几年前我启动并主导了一个项目,当时还在谷歌,这个项目叫谷歌大脑.该项目利用谷歌的计算基础设施来构建神经网络. 规模大概比之前的神经网络扩大了一百倍,我们的方法是用约一千台电脑.这确实 ...
- 单元测试与Moq
这个篇幅里面,记录单元测试与Moq模拟包的知识点. 单元测试 每一个模块,都应该有对应的单元测试.单元测试可以保证你的代码准确性,大大减少出现BUG的几率.一个好的单元测试,也是重构代码必不可少的部分 ...
- Alpha阶段项目Postmortem
以下对成员名字的简称: 陈鸿超 = 陈1 陈彦吉 = 陈2 石浩然 = 石 韩青长 = 韩 1. 设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...
- BZOJ3172: [Tjoi2013]单词
传送门 做了这么多题怎么还是无法很好的理解AC自动机呢..果然是个制杖 首先题意表述不是很清晰,这些所有的单词组成了那个文章,所以果断建个AC自动机,建的时候给每个点附加一个权值,建树是经过一次权值即 ...