面试题总结——集合

面试题总结——集合

  0、集合类框架及对应数据结构
在这里插入图片描述
在这里插入图片描述

  SortSet:有序的Set
  Deque:双端队列
  SortedMap:有序的Map

  1、ArrayList与LinkedList的区别?

  ①ArrayList内部是一个数组,如果通过有参构造参数传入一个长度,ArrayList中就会开辟一个定长的数组。如果调用ArrayList的无参构造,默认会开辟一个长度为10的数组。若容量已满,ArrayList扩容1.5倍(新容量/旧容量==1.5)
  ②LinkedList是一个链表
  由于底层是链表与数组,这道题实际上是在问链表与数组的区别

  2、ArrayList与Vector的区别(两者底层均由数组实现)?

  ①产生版本:ArrayList从JOK1.2开始提供;Vector从JDK1.0开始
  ②线程安全:ArrayList采用异步处理,性能较高,线程不安全;Vector采用在方法上添加synchronized来保证线程安全,性能较低
  ③初始化策略:ArrayList使用懒加载策略,在构造方法阶段并不初始化对象数组,在第一次添加元素时才初始化数组大小为10; Vector在无参构造执行后就将对象数组大小初始化为10
  ④扩容策略:ArrayList扩容为原数组的1.5倍,Vector扩容为原数组的2倍
  ⑤遍历:ArrayList和Vector都使用Iterator,ListIterator,foreach,但Vector还会使用Enumeration。(老版迭代器)

  2*.集合中线程安全的数据结构:喂(Vector),S(Stack)H(HashTable)E(Enumation),SB(StringBuilder)

  3、Collections.sort()的实现原理是什么?

  Collections.sort()本质上是将比较器作为参数调用了Arrays.sort(),而在Arrays.sort()中采用的是归并排序,具体的执行流程请参考:sort()的排序

  4、Comparable和Comparator的区别?

  Comparable(“内部比较器”)是排序接口,若一个类实现了Comparable接口,意味着该类支持排序,类中的int compareTo(T t)是一个内部比较方法(用当前对象与传入对象进行比较),可以直接存放在TreeMap/TreeSet中
  Comparator(“外部比较器”)是比较器接口,若类本身不支持排序,可自定义一个第三方的比较器(实现Comparator的类),使用compare(T o1,T o2)进行两个对象的比较。

  5、foreach的原理

  foreach能使用的本质是各个集合类都内置了迭代器(集合类对象.iterator()即可取得迭代器),foreach被编译器编译后变为了Iterator迭代器,因此foreach就是迭代器的简化使用版。

  6、迭代器Fail-fast机制是什么?

  除Vector可以使用Enumeration(老版迭代器),其他集合可使用集合类对象.iterator()获取Iterator(普通迭代器hasNext()+next()),或ListIterator(双向迭代器),或for-each,但都必须遵循Fail-fast机制。
  “Fail-fast机制”:快速失败机制,是java集合中的一种错误检测机制,当在迭代集合的过程中该集合在结构上发生改变时,就可能会发生fail-fast机制,即抛出ConcurrentModificationException异常。让用户尽快知道有错误发生了。
  fail-fast并不保证在不同步的修改下一定会抛出异常,只是尽最大努力去抛出,所以这种机制一般仅用于检测bug。
  为什么会出现fail-fast:在复制的时候,expectedModCount=modCount,所以要是在迭代过程中,将原集合修改,则modCount+1,而副本中的expectedModCount不会变,所以两个不相等了,抛出异常。(简单提一下这句话即可,使用迭代器对集合进行的修改会对原集合有影响)
  如何避免Fail-fast机制:
   ①在Collection集合使用迭代器进行遍历时,不要使用集合类提供的修改集合内容的方法,可以使用Iterator迭代器中修改集合内容的方法(eg:remove())。(迭代器是当前集合的一个副本)
   ②使用fail-safe策略:juc包下的所有线程安全的集合都是fail-safe机制。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值