底层维护了一个Objec的数组,创建对象时,初始大小是0,第一次新增元素时扩容为10,再次扩容为1.5倍,扩容的时机是内部数组满了之后,再次add才会扩容。
非线程安全,线程安全的Vector。
HashMap
jdk7以前为数组+链表,搜索的时间复杂度为N,为头插法(可能出现死循环)
jdk8为数组+链表+红黑树,搜索的时间复杂度为log(n),为尾差法。
链表长度超过8,并且数据总量超过 64 会转为红黑树、
为什么 HashMap 用红黑树而不是平衡二叉树
红黑树和平衡二叉树的区别在于它们的平衡强弱不同:
平衡二叉树是一种完全平衡的状态,它的任何结点的左右子树的高度差不会超过 1,结点是很平均分配的;
红黑树让整个树最长路径不会超过最短路径的 2 倍。这样的话,红黑树虽然牺牲了一部分查找的性能效率,但是能够换取一部分维持树平衡状态的成本。
hashmap初始大小是0,第一次新增元素时数组扩容为16,超过阈值时数组扩容一倍。
文章探讨了HashMap在JDK7之前的实现,包括其数组+链表结构导致的搜索时间复杂度以及JDK8引入红黑树以优化性能。HashMap在容量不足时进行扩容,初始大小为0,首次扩容为16,后续按一定比例扩容。对比了红黑树与平衡二叉树,说明了为何选择红黑树来保持查找效率和平衡状态的平衡。
738

被折叠的 条评论
为什么被折叠?



