1. Java容器都有哪些?

    20190727183756962

  2. collection和collections有什么区别?

    collection是接口,collections是集合的工具类。

  3. List、Set、Map之间的区别是什么?

    • List:有序集合,元素可重复
    • Set:不重复集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet无序
    • Map:键值对集合,存储键、值和之间的映射;Key无序,唯一;value 不要求有序,允许重复
  4. HashMap和HashTable有什么区别?

    • 线程安全性不同。HashMap线程不安全;Hashtable 中的方法是Synchronize的。
    • key、value是否允许null。HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。
  5. 如何决定使用hashMap还是TreeMap?

    • HashMap基于散列桶(数组和链表)实现;TreeMap基于红黑树实现。
    • HashMap不支持排序;TreeMap默认是按照Key值升序排序的,可指定排序的比较器,主要用于存入元素时对元素进行自动排序。
    • HashMap大多数情况下有更好的性能,尤其是读数据。在没有排序要求的情况下,使用HashMap。

    都是非线程安全。

  6. 说一下HashMap的实现原理?

    • HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
    • 当传入 key 时,HashMap 会根据 key,调用 hash(Object key) 方法,计算出 hash 值,根据 hash 值将 value 保存在 Node 对象里,Node 对象保存在数组里
    • 当计算出的 hash 值相同时,称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value
    • 当 hash 冲突的个数:小于等于 8 使用链表;大于 8 时,使用红黑树解决链表查询慢的问题
  7. 说一下HashSet的实现原理?

    • HashSet 是基于 HashMap 实现的,查询速度特别快
    • HashMap 是支持 key 为 null 值的,所以 HashSet 支持添加 null 值
    • HashSet 存放自定义类时,自定义类需要重写 hashCode() 和 equals() 方法,确保集合对自定义类的对象的唯一性判断(具体判断逻辑,见 HashMap put() 方法,简单概括就是 key 进行 哈希。判断元素 hash 值是否相等、key 是否为同个对象、key 是否 equals。第 1 个条件为 true,2、3 有一个为 true,HashMap 即认为 key 相同)
    • 无序、不可重复
  8. ArrayList和LinkedList的区别?

    • ArrayList查询快,LinkedList增删快。

    • ArrayList 基于动态数组实现的非线程安全的集合;LinkedList 基于双向链表实现的非线程安全的集合。

    • 对于随机 index 访问的 get 和 set 方法,一般 ArrayList 的速度要优于 LinkedList。因为 ArrayList 直接通过数组下标直接找到元素;LinkedList 要移动指针遍历每个元素直到找到为止。

    • 新增和删除元素,一般 LinkedList 的速度要优于 ArrayList。因为 ArrayList 在新增和删除元素时,可能扩容和复制数组;LinkedList 实例化对象需要时间外,只需要修改节点指针即可。

  9. 如何实现数组和List之间的转换?

    数组转 List ,使用 JDK 中 java.util.Arrays 工具类的 asList 方法

    List 转数组,使用 List 的 toArray 方法。无参 toArray 方法返回 Object 数组,传入初始化长度的数组对象,返回该对象数组

  10. ArrayList和Vector之间的区别?

    • 底层都使用数组实现
    • 功能相同,实现增删改查等操作的方法相似
    • 长度可变的数组结构

    不同:vector线程安全

  11. Array和ArrayList有何区别?

    定义一个 Array 时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数固定并且类型相同。

    ArrayList 是动态数组,长度动态可变,会自动扩容。不使用泛型的时候,可以添加不同类型元素。

  12. Queue中poll()和remove()有什么区别?

    poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。

  13. 哪些集合类是线程安全的?

  14. 迭代器Iterator是什么?

    • Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
    • 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。
  15. Iterator怎么使用?有什么特点?

    • next() 方法获得集合中的下一个元素
    • hasNext() 检查集合中是否还有元素
    • remove() 方法将迭代器新返回的元素删除
  16. iterator和ListIterator有什么区别?

    • ListIterator 继承 Iterator
    • ListIterator 比 Iterator多方法
  17. 怎么确保一个集合不能被修改?

    使用 JDK中java.util.Collections 类,unmodifiable*** 方法赋值原集合。