一、java中的容器
集合主要分为Collection和Map两大接口;Collection集合的子接口有List、Set;List集合的实现类有ArrayList底层是数组、LinkedList底层是双向非循环列表、Vector;Set集合的实现类有HashSet、TreeSet;Map集合的实现类有HashMap、TreeMap、HashTable;
(补充:HashTable与HashMap类似,线程安全,子接口有Properties接口,线程安全)
1.HashMap底层原理?
HashMap是以键值对形式存储数据的,底层由散列表组成,jdk1.8之前是数组+链表,jdk1.8之后数组+链表+红黑树组成。( 默认数组长度:16)
当添加元素时,链表的长度大于等于8,数组的长度小于64,将数组长度扩容原数组长度的2倍;当链表的长度大于等于8,并且数组的长度大于等于64时将链表转为红黑树。红黑树是平衡二叉搜索树,效率高。
当删除元素时,链表长度小于7,将红黑树转为链表。
(补充:jdk1.8之前头插法,jdk1.8及之后尾插法;1.7创建map时默认容量16,1.8创建map时默认无容量,添加后为初始化长度为16
Hash冲突:链地址法、开放地址法,再次hash法,建立公共溢出区)
2.ArrayList、LinkedList、Vector集合的区别?
ArrayList集合的底层是数组,适用于集合的遍历和随机访问某个元素的场景;添加元素时,每次扩容为原数组长度的1.5倍。(长度默认0,调用add方法后没有指定长度为10)
LinkedList集合的底层是双向非循环链表,中间插入和删除元素效率比较高,遍历效率比较低。