java基础面试题之集合

1. 接口HashMap、TreeMap、LinkedHashMap、concurrentHashMap的实现机制是怎么样的,在什么场景下会使用到?

    上面四种类都继承了Map接口,Map底层实现是使用哈希算法来存储key值,value只是附加存储项,找到了key,就可以找到value,只是在存储key值的时候可以有不同的实现方式

     HashMap底层是通过哈希散列的来存储key值,但是底层还是用数组来实现的;

    TreeMap底层是根据红黑树来实现存储key值;

    LinkedHashMap是在HashMap的基础上实现双向链表,即添加了向前和向后的指针;

    concurrentHashMap是用来代替HashMap线程不安全的特性,其实现是数组加单向链表实现

    使用场景首先得了解各个map的特性:

        一般来说,HashMap可以实现快速存储,在实现大量存储数据的时候,记得要初始化map的长度,免得长度不够时需要resize,重新分配内存空间;

        TreeMap的查找和插入操作,性能上肯定不如HashMap,因为它在查找和插入的时候都得从根节点看是,通过类似二分比较的方法,找到要插入或者查询的节点,可能还需要旋转节点,但是TreeMap底层是红黑树实现,它的好处是的的key值天生自带排序,如果你存储的数据有这个需求,那么可以考虑用TreeMap;

        LinkedHashMap在一定程度上集合了排序和hash散列存储,因为LinkedHashMap可以按照存储时的顺序或者按访问时的顺序来排序;

        concurrentHashMap集合很明显,他是用于多线程编程下的,一般非多线程模式下,使用HashMap性能更优;

2. 接口HashSet、TreeSet、LinkedHashSet的实现机制是怎么样的,在什么场景下会使用到?

    Set的底层实现,其实都是Map,所以HashSet的实现基于HashMap,TreeSet的实现基于TreeMap,LinkedHashSet的实现基于LinkedHashMap,这些set的实现基本都是对Map进行了封装;因为set是一个不允许重复的集合,他的实现就是Map的Key,Map集合的key是不允许重复的,那么吧key和value做为捆绑,就是相当于set集合,只是set在实现的时候,没事对value进行赋值操作;

    Set的应用场景和上面的Map基本类似,需要看你的要求;

 

3. 请介绍一下Map和List之间的关系?

    他们在底层实现上没有太大的相似之处,只是在用法上存在相似,可以把Map当做是索引是任意类型的List,List也可以看成是key值为int的Map;

4. ArrayList和Vector的区别是什么,怎么区分使用?

    这两者的实现基本相同,都实现了List接口,底层都是通过数组来存储的,不同的是Vector是线程安全的,但是Vector属于非常古老的集合,从JDK1.0版本开始就存在,方法冗余且不好记忆,不推荐使用,Vector现在基本被ArrayList代替了,即使是在多线程环境下使用List,可以通过Collegetions工具类提供的synchronizedList方法将ArrayList包装成线程安全的List

5. ArrayList和LinkedList的区别是什么,怎么区分使用?

    ArrayList是顺序存储的线性列表,而LinkedList则属于链式存储的线性表,底层是一个双向链表,所以从底层的实现上就可以看出,他们在实现元素增删查改的时候区别很大,ArrayList的查询和修改性能优异,因为顺序存储可以直接根据索引下标获取元素位置,而链式存储的LinkedList则需要遍历查找;但LinkedList的插入和删除一般ArryList好一点,LinkedList只需要更改前后节点指向的元素,而ArrayList插入或删除时,后面的元素需要整体往后或往前移动,非常消耗性能;

    所以,如果插入删除频繁的时候应该使用LinkedList,当然LinkedList是双向队列,即实现了队列的功能,也实现了栈的功能,如果你有这两方面的需要,也可以优先选择LinkedList;

    

    

 

你可能感兴趣的:(java)