Java 学习笔记18:深入Java HashMap
HashMap是什么?
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
Java的HashMap
Java的HashMap主要由两种数据结构组成:一个是数组,一个是链表。
新建HashMap的时候,会新建一个数组结构,但是数组结构的长度有限,例如是1024的长度,那么我们只能放置1024个数据么?不是的,1024的长度对于传递进入hashmap的值来说,只是一个hash的基本数据值,无论这个长度多少,总会有数据存进来会和之前的数据重叠在同一个数组key上,那么用什么方法来解决hash冲突呢?
第一种就是开放地址法。开放地址法的方法是如果冲突发生就会根据一定的值逐个单元去寻找空的单元数据格,如果整个数据链都寻找一遍都被占位了怎么办?这个时候开放地方法会在原先额外开辟出的缓冲区域存放数据。
第二种就是链表法。链表的好处就是前一个数据会记录下面一个数据的内存地址,这样有冲突之后,就可以再这个链表上添加一条数据,查询的时候也只要遍历链表直到查询找到位置。
所以,数组的key值越大,hash冲突的概率越小。
Java中两种hashMap:HashMap和TreeMap。两者的区别是:HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
Java的 hashmap使用方法:
@RequestMapping(value="/test")
@ResponseBody
public String test() {
Map map = new HashMap(); //实例化一个hashmap
map.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"));
&nbs