说说集合的面试题

集合的面试题:

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是线程安全的(效率不高)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个胖小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值