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