Jdk8中hashMap有哪些改动?
7中链表加数组的方式,8中增加的红黑数做数据结构 ,扩容机制,增加了
ConcurrentHashMap线程安全集合
Jdk8为什么要使用红黑树?
介于两者之间,插入效率高的链表和查询快的二叉树优势 ,而红黑树 插入比二叉树高,查询比链表快
hashMap 扩容机制是怎么样的,7和8的有什么不同
8中如果对象超过了8就使用红黑树来存储,没超过就用链表。通过法值来控制
为什么重写对象的equals方法 时,要重写hashCode方法。跟hashMap有关系吗?
对象的比较单独用equals时,会拿不到值,因为源码中使用的是hash值来判断这个对象是不是同一个对象
hashMap是线程安全的吗,concurrentModificationException 如何解决?
线程不安全,用CurrentHahMap 解决了这个问题,如 remove时报错
要注意什么?
对象使用时,尽量用final , 如 User user = new User(); 别人也new 会拿不到值 所以 :final User user = new User();
HashMap,LinkedHashMap,TreeMap都属于Map的子接口.Map用于存储键值对.键不可以重复,但是值可以重复
HashMap好是根据hashCode值存储数据.可以为空
LinkedHashMap也是一个HashMap.但是内部维持了一个双向链表,可以保持顺序,先进先出
性能:遍历的时候比hashMap慢. 因为保持插入的顺序要额外的开销. 当HashMap的容量很大的时候,实际数据很少,遍历起来就可能比LinkedHashMap慢.因为LinkedHashMap遍历速度只和实际数据有关,和容量无关.而HashMap和他的容量有关.
TreeMap实现的是SortMap接口.能够使保存的记录根据键排序,默认是升序的.使用Iterator遍历得到的结果也是排过序的
一般情况下,我们用的最多的是HashMap 在Map中插入\删除,定位元素.hashMap是最好的选择.
如果要按顺序遍历键.(自然或者自定义),TreeMap是最好的选择
如果需要输出的顺序和输入的相同,那就使用LinkedHashMap来实现.它还可以按读取顺序来排序.
HashTable是线程安全的一个Colletion,不允许空值的存在,这个接口已经被淘汰了.如果要用线程安全,就使用ConcurrentHashMap