目录
1,什么是hashmap、怎么用、hashmap底层数据结构
1,什么是hashmap、怎么用、hashmap底层数据结构
HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干,数组每一个元素的初始值都是Null。
hashmap是map接口的主要实现类;HashMap可以使用哈希算法对集合进行操作、查找,效率高,无序。
hashmap通过取余操作,将key用特定的哈希算法算出一个数,然后取余,按照数组长度-1取余,得到的数永远比数组小,永远不会越界。
JDK1.7之前hashmap的底层是数组+链表 JDK1.8之后引入红黑树
当链表长度大于8时,遍历查找效率较慢,故引入红黑树
并不是只需要链表长度大于8,同时需要满足条件数组长度大于64的时候变成红黑树 还有如果红黑树的节点个数小于6的时候,红黑树还会变成链表
hashmap为什么一开始不就使用红黑树?
这是因为红黑树相对于链表维护成本大,红黑树在插入新数据之后,可能会通过左旋、右旋、变色来保持平衡,造成维护成本过高,故链路较短时,不适合用红黑树。
2,使用hashmap注意事项
HashMap的容量,默认是16 HashMap的加载因子,默认是0.75
当HashMap中元素数超过容量 * 加载因子时,HashMap会进行扩容。
所以要注意,如果要往HashMap中放1000个元素,又不想让HashMap不停的扩容,最好一开始就把容量设为2048,设为1024不行,因为元素添加到七百多的时候还是会扩容。
如果已知向hashmap中只存放2个元素,那么就要注明初始化容量为2,否则初始化为默认的16
HashMap<Integer,Integer> map = new HashMap<>(2); map.put(1,1); map.put(2,2);
这种的hashmap存入的是个对象,则需要查看这个对象中的所有变量是否都需要hash,如果不是都需要则需重写hashCode和equals(HashMap
中value
的查找是通过key
的hashCode
来查找,所以对自己的对象必须重写hashCode
方法通过hashCode
找到对象地址后会用equals
比较你传入的对象和HashMap
中的key
对象是否相同,因此还要重写equlas
.)
HashMap<User,Integer> map = new HashMap<>();
HashMap的方法不是线程安全的。HashMap在并发执行put操作时发生扩容,可能会导致节点丢失,产生环形链表等情况。 节点丢失,会导致数据不准 生成环形链表,会导致get()方法死循环。
HashMap的设计初衷就不是在并发情况下使用,如果有并发的场景,推荐使用ConcurrentHashMap
3,为什么要用数组+链表,数组和链表的区别是什么
数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以将数组和链表结合在一起,发挥两者各自的优势,使用一种叫链地址法的方式可以解决哈希冲突。
4.map和hashmap有什么区别,如何实现。
HashMap<Integer,Integer> map = new HashMap<>();
Map<Integer,Integer> maps = new HashMap<>();
这两种写法的区别:map可以使用HashMap对象中的所有方法,而maps只能使用map接口中的方法
Hashmap的key值,无论传什么类型:Integet、String、对象、List集合等最终都会按照哈希方法取余
map
Map是一个接口。
Map一次会储存两个对象,一个key键的对象,一个value值的对象。
HashMap
HashMap是继承AbstractMap接口和实现了Map接口的类;
HashMap可以使用哈希算法对集合进行操作:查找,效率高,无序。
HashMap是Map接口的主要实现类。