meta|Java集合面试题看这篇就够了

meta|Java集合面试题看这篇就够了

文章图片


1.说说Java中常用的容器有哪些?容器主要包括 Collection 和 Map 两种 , Collection 存储着对象的集合 , 而 Map 存储着键值对(两个对象)的映射表 。
如图:

???面试官追问:说说集合有哪些类及他们各自的区别和特点?

  • Set
    TreeSet
    HashSet
    LinkedHashSet

  • List
    ArrayList
    Vector
    LinkedList

  • Queue
    【meta|Java集合面试题看这篇就够了】LinkedList
    PriorityQueue
    ArrayQueue

???面试官追问:说说Map有哪些类及他们各自的区别和特点?
TreeMap
HashMap
HashTable
LinkedHashMap

2.详细说说 Arraylist 和 LinkedList的区别?
  • ArrayList :底层是基于 数组 实现的 ,查找快 , 增删较慢  。LinkedList 不支持高效的随机元素访问 , 而 ArrayList 支持 。 快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index) 方法) 。
  • LinkedList :底层是基于 链表 实现的 。 确切的说是循环双向链表(JDK1.6之前是双向循环链表、JDK1.7之后取消了循环) ,查找慢、增删快  。 LinkedList链表由一系列表项连接而成 , 一个表项包含3个部分︰元素内容、前驱表和后驱表 。 因此 内存空间占用 比ArrayList 更多 。
???面试官追问:ArrayList的增删一定比LinkedList要慢吗?
不一定的 。
  1. 如果增删都是在末尾来操作(每次调用的都是 remove() 和 add() ) , 此时 ArrayList就不需要移动和复制数组来进行操作了 。 如果数据量有百万级的时 , 速度是会比 LinkedList 要快的 。
  2. 如果删除操作的位置是在中间 。 由于LinkedList的消耗主要是在遍历上 , ArrayList的消耗主要是在移动和复制上(底层调用的是 arrayCopy() 方法 , 是native方法) 。 LinkedList 的遍历速度是要慢于ArrayList的复制移动速度的 。 如果数据量有百万级的时 , 还是ArrayList要快 。
3.ArrayList实现 RandomAccess接口有何作用?public interface RandomAccess {



查看源码我们发现实际上 RandomAccess 接口中什么都没有定义 。
从源码可以看出RandomAccess 接口只是一个标志接口 , 只要List集合实现这个接口 , 就能支持快速随机访问 。 通过查看 Collections 类中的 binarySearch() 方法 , 可以看出 , 判断List是否实现RandomAccess接口来实行 indexedBinarySerach(list key) 或 iteratorBinarySerach(list key) 方法 。 再通过查看这两个方法的源码发现: 实现RandomAccess接口的List集合采用一般的 for循环遍历 , 而未实现这接口则采用迭代器  , 即ArrayList 一般采用for循环遍历 , 而 LinkedList 一般采用迭代器遍历
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list T key) {

   if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
       return Collections.indexedBinarySearch(list key);
   else
       return Collections.iteratorBinarySearch(list key);


???面试官追问:为何LinkedList却没实现这个接口?
ArrayList 底层是数组 , 而 LinkedList