栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

说说集合的面试题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

说说集合的面试题

集合的面试题: 1、说说你了解的集合:

集合分为两大类:

  • Conllection集合(单例集合)
    • List集合 (里面的元素可以重复)
      • ArrayList集合 :底层是数组存储,特点是查询快,增删慢
      • LinkedList集合 :底层是链表存储,特点是增删快,查询慢
    • Set集合 (里面的元素不可重复)
      • HashSet:
      • LinkedHashSet
      • TreeSet
  • Map集合 (双列集合)
    • HashMap集合
    • LinkedHashMap集合
    • TreeMap集合
    • HashTable集合
2、说说对ArrayList的理解

​ ArrayList集合是List的一个实现类,它的底层是通过数组来实现的,而数组是通过索引来进行查询的,查询的速度是比较快的,所以,ArrayList集合的查询的速度也是很快的,查询的时间复杂度是O(1)。增加删除的话是很慢的,相比另外的一个集合来说。这个集合是线程不安全的。因为在它的add()方法里,会去检查数组的第容量是否够用,不够用的话是在创建于一个新的数组,再把数组里面的内容保存到新的数里面,在把引用的数组地址赋值给新数组,到达数组扩容的问题,它的add() 操作不是原子性操作

注意: 原子(atom)本意是“不能被进一步分割的最小粒子”,

​ 原子操作(atomic operation)意为”不可被中断的一个或一系列操作”

3、说说对LinkedList的理解

LinkedList也是List的一个实现类,它的底层是双链表结构,其内部有一个next指针指向下一个元素,一个prev指针指向上一个元素,因为是双链表结构,所以他的增减删除快,查询慢。它是线程不安全的,它的添加操作也不是原子性操作,

4、说说对Vector的理解

Vector也是List集合的一个实现类,它的底层是数组,底层和ArrayList集合差不多,也就是ArrayList加上(synchironized)锁之后的,所以它是线程安全的,但是,它的使用率却是很少的,主要的原因是他的效率很低,没有ArrayList高。

5、说说List和Set的区别

List和Set的区别:List的存储是是按照存入的顺序来的,而Set的存储顺序是按照哈希值来进行存入的;

​ List是能存储重复的元素的,而Set不能存储重复的元素

6、说说对HashSet的理解

HashSet是Set的一个实现类,底层实现的是HashMap的key,他的初始容量是16,负载因子是0.75,如果进行扩容的话是扩到原来的2倍。HashSet的存储元素的顺序并不是按照存入的顺序,是按照元素的哈希值的大小来进行存储的。它不能存储相同的元素,是通过它的HashCode()方法和equals()方法俩进行比较两个元素是否为同一元素。

7、LinkedHashSet的理解

LinkedHashSet是对基础的HashSet集合进行加上双链表,使得它的存取有序

8、说说TreeSet的理解

TreeSet是使用二叉树的原理对 add 的对象按照指定的顺序进行排序(升序、降序),每添加一个元素都会进行排序,将元素插入到二叉树的指定的位置

9、聊聊HashMap的理解(重点)

在JDK1.7以前,它的底层是数组+链表实现的

在JDK1.8之后,它的底层是数组+链表+红黑树实现的,先是使用数组的结构来进行存储,在遇见相同的哈希值的元素之后,判断是否为同一个元素,不是同一个元素后,会在数组的那个位置衍生一个链表,在这个条链子上存储到8个元素之后,还有相同的哈希值的元素时候就使用红黑树来进行存储元素了,

它不能保证元素的存取顺序是一致的

线程不是安全的

10、LinkeHashMap的理解

LinkeHashMap解决了HashMap的存取元素不是一致的,他的内部添加了一条链表,保证了存取的顺序一致

11、如果想保证HashMap的线程安全,该咋办?

可以通过HashTable来保证它的线程安全,该类的出现主要是解决这个问题,解决的办法是直接使用synchironized锁机制,所以效率不是很高,所以使用的很少,也不推荐,

在JDK10.0时候,解决办法是使用并发包里面的一个类,ConcurrentHashMap,这个类是java.util.concurrent包里面的一个类,是它的一个扩展,也解决了线程不安全问题

12、Conllection和Conllections的比较

Conllection是一个集合接口,是集合里面的顶级接口,他既同==提供了集合的公共的基础操作集合的方法,它的继承接口有List和Set两个接口,

Conllections是一个集合的工具类,提供一系列的静态的方法,用于对集合里面的元素进行排序、搜索、以及线程安全等各种操作

13、ArrayList和LinkedList的比较

ArrayList集合的底层数据结构是数组,它支持数组的随机访问。时间复杂度O(1)

LinkedList的底层数据结构是双链表,不支持随机访问,使用下标访问下一个元素。时间复杂度O(n)

14、ArrayList和Vector的比较

Vector使用了synchironzied来保证线程是同步的,是线程安全, 每一次进行扩容是扩展1倍

ArrayList不是线程安全的,而且它每一次扩容只是扩展0.5倍

15、HashMap和HashTable的比较

HashMap允许空键值,而HashTable不允许,HashMap是线程不安全的(效率高),HashTable是线程安全的(效率不高)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/963701.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号