java常用集合的初始容量+扩容倍数

最近也面试了很多家,发现公司考察的都是集合和多线程等java基础,所以我在下面做一些总结

StringBuilder

初始容量16
扩容乘2+2
线程不安全
可变

StringBuffer

初始容量16
扩容乘2+2
线程安全
可变

ArrayList

初始容量为10
扩容为原来的容量的1.5倍
jdk7是一开始就创建了初始为10的数组,jdk8是调用add方法时,才创建容量为10的数组
线程不安全
底层是数组

Vector

初始容量为10
扩容为原来的容量的2倍
线程安全
加载因子为1

ArrayList和Vector的区别

Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack。

HashMap

Hashmap的默认容量是:16
负载因子为:0.75
扩容为原来的两倍
线程不安全
jdk7是一开就创建容量为16,jdk8是先创建{}当调用put方法时才初始化容量为16
jdk7是数组+链表 jdk8是数组+链表+红黑树
jdk7的节点是entry ,jdk8节点是node
jdk7是头插法,jdk8是尾插法 七上八下
当链表长度大于8就转化成红黑树

Hashtable

Hashtable 初始容量为:11
负载因子为:0.75
扩容为原来的两倍+1
线程安全

HashMap和Hashtable的区别

  • Hashtable 是线程安全的,HashMap 不是线程安全的。
  • Hashtable 所有的元素操作都是 synchronized 修饰的,而 HashMap 并没有。
    既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。如果要线程安全又要保证性能,建议使用 JUC 包下的 ConcurrentHashMap
  • Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。
  • 两者继承的类不一样,Hashtable 继承了 Dictionary类,而 HashMap 继承的是 AbstractMap类。
  • HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。
  • HashMap扩容为原来的两倍,Hashtable扩容为原来两倍+1
    在这里插入图片描述

HashMap装填因子,负载因子,加载因子为什么是0.75

装填因子设置为1:空间利用率得到了很大的满足,很容易碰撞,产生链表,导致查询效率低
装填因子设置为0.5: 碰撞的概率低,扩容,产生链表的几率低,查询效率高,空间利用率低

HashMap的长度为什么必须为2^n

  1. h&(length-1)等效 h%length 操作,等效的前提是:length必须是2的整数倍
  2. 防止哈希冲突,位置冲突

HashSet

初始容量为16
加载因子为0.75
扩容为原来的两倍
线程不安全
底层其实是HashMap

你可能感兴趣的:(面试,java,哈希算法,面试)