Java 学习笔记18:深入Java HashMap
来源:互联网 发布:气体检测软件系统 编辑:程序博客网 时间:2024/05/24 06:44
- HashMap是什么?
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
- Java的HashMap
Java的HashMap主要由两种数据结构组成:一个是数组,一个是链表。
新建HashMap的时候,会新建一个数组结构,但是数组结构的长度有限,例如是1024的长度,那么我们只能放置1024个数据么?不是的,1024的长度对于传递进入hashmap的值来说,只是一个hash的基本数据值,无论这个长度多少,总会有数据存进来会和之前的数据重叠在同一个数组key上,那么用什么方法来解决hash冲突呢?
第一种就是开放地址法。开放地址法的方法是如果冲突发生就会根据一定的值逐个单元去寻找空的单元数据格,如果整个数据链都寻找一遍都被占位了怎么办?这个时候开放地方法会在原先额外开辟出的缓冲区域存放数据。
第二种就是链表法。链表的好处就是前一个数据会记录下面一个数据的内存地址,这样有冲突之后,就可以再这个链表上添加一条数据,查询的时候也只要遍历链表直到查询找到位置。
所以,数组的key值越大,hash冲突的概率越小。
之前转过一篇:http://blog.csdn.net/initphp/article/details/8078432 解决hash冲突的方法。新浪微博的转发计数就是用了开放地址法,memcache用了的链表法。
我之前用nodejs写过一个hashmap的实例:https://github.com/zhuli/hash_map
Java中两种hashMap:HashMap和TreeMap。两者的区别是:HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
- Java的 hashmap使用方法:
@RequestMapping(value="/test")@ResponseBodypublic String test() {Map map = new HashMap(); //实例化一个hashmapmap.put("username", "initphp"); //新增一个数据map.put("password", "test");map.put("age", "100");map.put("age1", "age1");map.put("age2", "age2");if (map.containsKey("username") == true) { //判断key是否存在System.out.println("key 存在");}System.out.println("用户名:" + map.get("username")); //获取一个数据System.out.println("密码:" + map.get("password"));map.remove("age"); //删除一个age数据System.out.println("年龄:" + map.get("age"));System.out.println("长度:" + map.size()); //整个hashmap数据的长度//循环输出:Iterator iterator_1 = map.keySet().iterator();System.out.println("列表:"); //整个hashmap数据的长度while (iterator_1.hasNext()) {Object key = iterator_1.next();System.out.println("tab.get(key) is :"+map.get(key));} map.clear();//清除整个hash mapreturn "test";}
结果:- hashmap和list看起来用法上有相似的地方,但是有很大的区别,一个是hash的模式,一个是列表的模式。
- list适合一些列表,有序数据。hashmap更适合k => v的数据结构。
- hashmap可以发现是无序的
- Java的TreeMap使用方法
@RequestMapping(value="/test")@ResponseBodypublic String test() {TreeMap map = new TreeMap(); //实例化一个hashmapmap.put("username", "initphp"); //新增一个数据map.put("password", "test");map.put("age", "100");map.put("age1", "age1");map.put("age2", "age2");if (map.containsKey("username") == true) { //判断key是否存在System.out.println("key 存在");}System.out.println("用户名:" + map.get("username")); //获取一个数据System.out.println("密码:" + map.get("password"));map.remove("age"); //删除一个age数据System.out.println("年龄:" + map.get("age"));System.out.println("长度:" + map.size()); //整个hashmap数据的长度//循环输出:Iterator iterator_1 = map.keySet().iterator();System.out.println("列表:"); //整个hashmap数据的长度while (iterator_1.hasNext()) {Object key = iterator_1.next();System.out.println("tab.get(key) is :"+map.get(key));} map.clear();//清除整个hash mapreturn "test";}
结果:- 结果除了列表之外,其余和HashMap结果一样
- TreeMap是有序的列表,根据key的a,b,c的字母排序
- Java 学习笔记18:深入Java HashMap
- 深入学习Java之HashMap
- Java学习笔记-HashMap
- Java学习笔记之HashMap
- 深入学习java的HashMap实现原理
- Java集合深入学习总结-HashMap
- 深入探索Java-Hashmap
- java hashmap深入分析
- 【Java基础】深入HashMap
- 深入理解HashMap-java
- Java深入之HashMap
- JAVA学习笔记7 Hashset ,TreeSet , HashMap
- java学习笔记25——HashMap
- Java HashMap学习笔记(持续更新)
- java 集合学习笔记4-HashMap TreeMap
- java学习笔记(3)-HashMap类
- 【Java学习笔记】Map,TreeMap及HashMap
- 深入Java虚拟机学习笔记
- DataStage 分区(Partition)
- Apriori算法简介及其用C++模拟实现
- 在MFC中如何选择文件名和文件夹
- 链接
- linux 备忘 (未完待续)
- Java 学习笔记18:深入Java HashMap
- UML类图画法
- Active Directory编程详解
- python 获取命令行参数小记
- ═══╬═中国最新地图[不收藏后悔]═╬═══
- 快递公司泄露买家信息最高罚3万 快递员双挨罚
- java中遍历一个Map的几种方法
- vc6操作批处理文件bat和cmd命令
- 如何获取控制台窗口句柄 (HWND)