JAVA面试题 您所在的位置:网站首页 以下哪些java容器是线程安全 JAVA面试题

JAVA面试题

2023-06-16 15:28| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有