常见的Java集合面试题

1.说一下Map集合中的put方法:

        首先将key和value封装进一个node对象,然后底层调用k的hashcode方法得到hashcode值,利用哈希算法把这个值转为数组的下标,如果该下标位置上没有元素,那么就会把node对象添加到该位置上,如果该位置上有元素,那么就会拿node对象里面的key和该位置上的链表的每一个节点中的key进行equals,如果都返回false,那么就会把node对象添加到链表末尾(jdk1.8后才是添加到末尾),如果有一个方法返回true,那么该节点的value会被覆盖

2.说一下Map集合中的get方法:

        底层调用key的hashcode方法得到hashcode值,利用哈希算法把这个值转为数组的下标,如果该下标位置上没有元素,那么get方法返回null,如果该位置上有元素,那么就会拿key和该位置上的链表的每一个节点中的key进行equals,如果每一个方法返回的都是false,那么get方法返回的值也是null,如果有一个equals方法返回true,那么get方法返回的就是该节点的value

3.为什么放到Map集合中的key对象要重写hashcode以及equals方法

       不重写hashcode方法的话,会造成散列分布不均匀,而之所以要重写equals那是因为key是一个对象,而我们要比较对象中的内容

4.HashMap集合的key部分特点:

        无序,不可重复。
        为什么无序:因为hash算法得到的结果是随机的
        不可重复是怎么保证的?equals方法来保证HashMap集合的key不可重复。如果key重复了, value会覆盖。
        HashSet放到HashMap集合中的key部分,所以Hashset中的元素也需要重写hashcode和equals方法

5.什么是散列分布不均匀:

        ‌当hashcode方法的返回值都是一样的值,那么就成单向链表
        ‌当hashcode方法的返回值的值都不一样,那么就会成为纯数组

6.hashMap特点:

        首先它的底层是哈希表数据结构,是非线程安全的,默认初始化容量是16,默认加载因子是0.75,这个默认加载因子指的是HashMap集合底层数组的容量达到75%的时候,数组开始扩容,两倍扩容,当手动去指定初始化容量的时候,这个容量的数值必须是2的次幂,这是为了达到散列分布均匀,提高HashMap的存取效率,所必须的。

        如果在初始化容量的时候传入的数值不是2的次幂,那么会调用方法把那个数转为大于那个数的最小的2的次幂
        在单链表超过8个元素后,单链表会变成红黑树结构,当链表中的元素小于8个的时候,红黑数会变回单链表

7.Hashtable集合:

        Hashtable的初始化容量是11,加载因子0.75,扩容:原容量*2+1,是线程安全的

8.Hashtable和HashMap集合的区别:

        Hashtable集合中的key和value是不能存储null,线程安全的
        HashMap集合中的key和value可以为null,不是线程安全的

9.其他

Properties集合:
Properties是一个Map集合,继承 Hashtable集合,Properties的key和value都是String类型。
Properties被称为属性类对象。
Properties是线程安全的
存:setproperties
取:getproperties

扫描二维码关注公众号,回复: 15337336 查看本文章

TreeMap集合的底层是二叉树

10.arraylist集合:

        底层是object数组,默认初始化容量为10(底层先创建一个空数组,当添加第一个数据的时候,初始化容量为10),而且arraylist不是线性安全的,然后arraylist是1.5倍扩容的
arraylist的特点就是查询效率高,在指定的位置上插入或者删除数据效率低,但如果在arraylist集合的末尾添加或者删除元素的时候,他的效率也是挺高的

11.voecat集合

        底层是object数组,默认初始化容量为10,两倍扩容,因为voecat是线程安全的,所以效率会比arraylist集合低

12.linkedlist:

        底层双向链表,所以在插入或者删除元素的效率会高,查询方面效率较低,而且linkedlist不是线性安全的

13.arraylist跟linkedlist的区别:

        arraylist底层是object数组,linkedlist底层是双向链表
        arraylist在查询方法效率高,linkedlist在增删数据方面效率高
        然后linkedlist还可以当做队列来使用
        在开发的时候,查询数据的场景是比增删数据要多的,所以使用arraylist也是比使用linkedlist多

14.arraylist跟vector的区别

        首先这两个集合的底层都是object数组,默认初始化容量都是10,但arraylist是1.5倍扩容,vector是两倍扩容
        arraylist不是线程安全的,vector是线程安全的的,所以从效率上来说,arraylist效率高点,在开发中优先考虑arraylist

15.set接口(无序不可重复)

        hashset:底层hashmap集合的key部分

        treeset:底层是二叉树,treeset是可以进行排序的

猜你喜欢

转载自blog.csdn.net/qq_26112725/article/details/131096775