JAVA面试题 | 您所在的位置:网站首页 › 以下哪些java容器是线程安全 › JAVA面试题 |
Java中的集合主要是由两个接口Collection和Map派生而来。面试常问的集合有Linklist,ArrayList,HashMap和HashTable。 ArrayList是基于动态数组实现的。它的容量可以动态增长,当大量插入数据的时候,它会通过ensurecapacity操作对ArrayList进行扩容。简单来说,ArrayList的扩容机制就是计算出扩容后的大小(默认扩容为原数组的1.5倍),进行实例化后,将旧数组复制到新数组中。 再提一句,ArrayList不是线程安全的,Java提供了同样通过数组实现的Vector,它是线程安全的。ArrayList和Vector的区别: 1、ArrayList默认扩容1.5倍,Vector默认2倍。 2、Vector是线程安全的,但使用不多,效率比ArrayList低。 LinkList和ArrayList的区别: LinkList是基于链表实现的,ArrayList是基于数组实现的,所以,它们的区别,基本就是链表和数组的区别。 1、LinkList在增和删上的效率比ArrayList效率高,适合用于增删比较频繁的场景。 2、ArrayList提供使用下标的随机访问,而LinkList需要从头指针开始遍历,适合用于读取比较频繁的场景。 再谈谈HashMap,HashMap底层是由数组、链表和红黑树实现的。在新增时,若某处链表上的元素大于8,HashMap会将该链表转换为红黑树。在删除时,为防止在元素个数在8附近的链表或者红黑树频繁转换,当红黑树个数小于6时,才会转换为链表。 HashMap采用的冲突处理方法:链地址法,将Hash值相同的元素,放到数组下标为Hash值处的链表下(数组的元素相当于链表的头指针)。这样处理节省了解决冲突的时间,适用于增删比较频繁的场景。 HashMap是线程安全的吗?为什么? HashMap不是线程安全的,多线程下扩容死循环。JDK1.7中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。 在JDK1.8中,在多线程环境下,会发生数据覆盖的情况。 HashMap和HashTable的区别? HashMap可以接受为null的key和value,key为null的键值对放在下标为0的头结点的链表中,而Hashtable则不行。 HashMap是非线程安全的,HashTable是线程安全的。 Hashtable很多方法是同步方法,在单线程环境下它比HashMap要慢。 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。 本文只是简单介绍一些面试常问的集合,这也是我第一篇博客,有问题的欢迎大神评论区指正,谢谢。 |
CopyRight 2018-2019 实验室设备网 版权所有 |