文章目录
- 一、Map接口
- 二、哈希表
- 三、HashMap
- 四、TreeMap
- 五、感谢阅读
一、Map接口
Map就是用来存储“键(key-值(value)对)”的。Map类中存储的“键值对”通过键来识别,所以“键对象”不能重复。
Map接口的实现类有HashMap、TreeMap、HashTable、Properties等。
HashMap有以下一些常用的方法:
二、哈希表
为了下面更好的理解HashMap,我们先来简单的了解一下哈希表
我们知道数据结构中是由数组和链表来实现对数据的存储,但是数组和链表都有各自的优劣势:
数组:占用空间连续,寻址容易,查询速度快,但是,增加和删除的效率非常低。
链表:占用空间不连续,寻址困难,查询速度慢,但是,增加和删除效率非常高。
那我们把数组和链表的优点结合起来,不就能解决问题了吗,于是就有了哈希表,HashMap的底层实现原理就是哈希表。
我们在List接口的LinkedList实现类中介绍了链表Java基础之List接口,哈希表就是利用多个链表和数组结合的具有查询快,增删效率的表。
哈希表(Hash table),也叫离散表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
举个例子来说,哈希表就像我们的字典,当我们要在字典中找一个字的时候,我们只需要根据这个字的拼音(我们这里就以拼音查字发来比喻)知道这个字所在的页数,然后再到这一页一个字一个字的去找,就能找到这个字。这样比喻过来,我们就需要了解哈希表中的key、哈希值、value这三个值,key就是这个字的拼音,哈希值就是这个字的页数,value就是这个字。 key和value组成一个“键值对”,其中键(key)是唯一的。
首先我们来看看哈希表的数据结构图
再看看哈希表的存储过程
再根据我们查字典的比喻来理解我们在哈希表查找我们需要的value对象,key就是这个字的拼音,哈希值就是这个字的页数,value就是这个字。
当我们要查一个value对象
①我们就需要知道它的key,就像我们查一个字要知道他的拼音
②经过特定的算法算出他的哈希值,就像通过拼音知道这个字在哪一页或者说在哪几页
③比如算出哈希值为1,那我们就只需要在哈希值为1的这些对象中一个一个去对比我们查的那个key对象,这样就找到了,就像我们在这个拼音的范围内去找这个字,只是我们查这个字的时候我们需要字是什么样子,而我们查key对应的value的时候我们不需要知道value,只要知道key就行
三、HashMap
HashMap采用哈希算法实现,是Map接口最常用的实现类。由于底层采用了哈希表储存数据,我们要求键不能重复,新的键值对会替换旧的键值对。HashMap在查找、删除、修改方面都有非常高的效率。
下面我们用代码测试一下一些常用的方法:
public class TestMap {
public static void main(String[] args) {
Map<Integer,String> m1=new HashMap();
m1.put(1, "one");//存
m1.put(2, "two");
System.out.println( m1.get(1));//取
System.out.println(m1.size());//输出m1内存放的键值对数量
System.out.println(m1.isEmpty());//m1容器是否为空
System.out.println(m1.containsKey(2));//Map容器中是否包含值对象对应的键值对
System.out.println(m1.containsValue("four"));//Map容器中是否包含键值对对应的值对象
Map<Integer,String> m2=new HashMap<>();
m2.put(4,"四");
m1.put(5,"五");
m1.putAll(m2);//将m2的所有键值对放到m1对象
System.out.println(m1);
//map中键不能重复!如果重复(是否重复是根据equals方法来判断),则新的覆盖旧的!
m1.put(3, "三");
System.out.println(m1);
}
}
执行后的结果:
四、TreeMap
TreeMap的各种方法和HashMap的方法一样,TreeMap有一个功能就是自动排序,TreeMap会根据key的大小自增排序。
TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。HashMap效率高于TreeMap;在需要排序的Map时才选用TreeMap。
五、感谢阅读
这是我自学Java基础,在b站看高淇老师的视频后的一些理解,其中有一部分也是引用了老师的东西,如果我的理解有错误希望可以提出,一起进步。