是否线程安全
二者均为非线程安全
hashmap :如果需要满足线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
底层结构实现
hashmap:基于哈希表实现,数组+链表+红黑树
-----------在JAVA 8中,利用了红黑树,所以在JAVA 8 是由数组+链表+红黑树组成。从JAVA 7中得知,在查找元素时候,可以根据hash值快速定位到数组具体的下标,但是后面的操作需要顺着链表一个一个的比较下去才能找到所需值,时间复杂度取决于链表的长度,为O(n),为了降低这一部分处理的开销,在JAVA 8中,当链表中的元素超过8个之后,会将链表转换为红黑树,在这些位置进行查找的时候可降低时间复杂度 为O(logn),
-----------为了优化HashMap空间的使用,您可以调优初始容量和负载因子
capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
loadFactor:负载因子,默认为 0.75。
threshold:扩容的阈值,等于 capacity * loadFactor。
treemap:红黑树
适用场景
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键