持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
基本介绍
这里主要简单介绍一下哈希表,C++里面是Unordered/UnsortedMap,java里面就是hashmap
两种使用方式:
-
是个集合,但是只有一个key -- 对应HashSet
-
key带上value,一对数据 -- 对应HashMap
下面贴两个HashSet和HashMap的示例,区别在于key的类型:
HashSet<Interger> hashSet1 = new HashSet<>();
hashSet1.add(3);
hashSet1.remove(3);
HashMap<Interger,String> mapTest = new HashMap<>();
mapTest.put(1, "first");
mapTest.put(2, "second");
mapTest.put(2, "cover");
注意基于哈希表的各个操作(增删查改)可以认为是O(1)复杂度的操作,但是注意其中常数时间是比较大的。
key的值存储
注意,如果哈希表存储的是一些基础类型,例如int,double,string等,哈希表的key直接存的就是具体的value的拷贝,可以说是按照值传递的。这个对于C++还是Java都是一样的,key占据的空间就是基础类型值占有的空间,如果基础类型值很大,那么哈希表key会占用很多空间。
但是如果你定义的是一个类,例如student类型,那么key里面不是值传递的,存储的是student实例对象所在内存地址的指针,不会把对象拷贝放到key里面而是存储内存地址,大小一律占用8字节!
另外下面的nodeA和nodeB是两个实例,虽然内部值可能一样,但是存储地址不同,所以添加到Set中不会覆盖,是不一样的key!
总结
- 哈希表在使用层面上可以理解为一种集合结构
- 如果只有key,可使用HashSet结构
- 如果既有key,也有value,可使用HashMap结构
- Set和Map底层结构是一回事
- 使用哈希表的增删查改的时间复杂度是O(1),但是常数时间比较大