java面试---集合

时间:2019-04-18
本文章向大家介绍java面试---集合,主要包括java面试---集合使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  1. java 容器都有哪些?
    List、set、map

  2. Collection 和 Collections 有什么区别?
    Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。
    Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

  3. List、Set、Map 之间的区别是什么?
    List:1.可以允许重复的对象。 2.可以插入多个null元素。3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
    Set:1.不允许重复对象2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。 3. 只允许一个 null 元素
    Map: 1.Map不是collection的子接口或者实现类。Map是一个接口。
    2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
    3.TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
    4.Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。

  4. HashMap 和 Hashtable 有什么区别?
    HashMap允许键和值是null,而Hashtable则不允许键或者值是null。

    Hashtable是同步的,而HashMap不是,所以HashMap更适用于单线程环境(线程不安全),Hashtable则适用于多线程环境(线程安全)。

  5. 如何决定使用 HashMap 还是 TreeMap?
    HashMap:适合查询。基于散列表实现。
    TreeMap:增加、快速创建。基于红黑树实现。

  6. 说一下 HashMap 的实现原理?
    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

  7. 说一下 HashSet 的实现原理?
    对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,更确切的说,HashSet中的元素,只是存放在了底层HashMap的key上, 而value使用一个static final的Object对象标识。因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成

  8. ArrayList 和 LinkedList 的区别是什么?
    1.ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
    2.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
    3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

  9. 如何实现数组和 List 之间的转换?
    List转数组: arrayList.toArray()方法

    数组转List:Arrays.asList(a)方法

  10. ArrayList 和 Vector 的区别是什么?
    Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
    当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

  11. Array 和 ArrayList 有何区别?
    Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
    Array大小是固定的,ArrayList的大小是动态变化的。

  12. 在 Queue 中 poll()和 remove()有什么区别?
    remove方法和poll方法都是删除队列的头元素,remove方法在队列为空的情况下将抛异常,而poll方法将返回null

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

  14. 迭代器 Iterator 是什么?
    Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包括了可以返回迭代器实例的迭代方法。迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除

  15. Iterator 怎么使用?有什么特点?
    Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。
    Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素。
    Iterator必须依附某个Collection对象而存在,Iterator本身不具有装载数据对象的功能。
    Iterator.remove方法删除的是上一次Iterator.next()方法返回的对象。
    ext()方法通过游标指向的形式返回Iterator下一个元素。

  16. Iterator 和 ListIterator 有什么区别?
    1 ListIterator有add()方法,可以向List中添加对象,而Iterator不能

    2 ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方 法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

    3 ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

    4 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

  17. 怎么确保一个集合不能被修改?
    添加final修饰符或者
    Collections.unmodifiableList(List)
    Collections.unmodifiableMap(Map)
    Collections.unmodifiableSet(Set)