Java集合框架(部分)

发布时间 2023-09-29 22:16:40作者: 因为在乎

类图

List:有序可重复集合

特点

1.元素允许重复

2.元素有序(元素的顺序就是插入时的顺序)

3.元素可以通过索引来访问或者设置

{

ArrayLIst:底层为数组,查询速度快,增删慢

LinkedList:底层是链表,查询速度慢,增删快

两者的优缺点,:效率高,线程不安全

}

Set:无序不可重复集合

HashSet:底层为数组,链表,红黑树,元素唯一性依靠重写hashcode()和equals()方法

TreeSet:底层为二叉树,元素唯一且已经排好序,唯一性依靠重写hashcode()和equals()方法

LinkedHashSet:继承HashSet,底层为链表和哈希表,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性

Map:保存具有映射关系的数据,键值对

HashMap:底层为数组,链表,红黑树,使用频率最高的处理键值对的数据类型,根据键的hashcode值存储数据,大多数情况下可以直接定位到它的值,最多允许一个key值为null,多个value值为null

TreeMap:底层为红黑树,实现了SoreMap接口,保存的记录根据键进行排序

LinkedHashMap:继承了HashMap,底层为数组,链表,红黑树,双向链表

 

 

面试问题

1.ArrayList与LinkedList异同

1.线程安全:都不同步,即都不保证线程安全

2.底层数据结构:ArrayList为数组,LinkedLIst为双向循环链表

3.元素位置对插入和删除的影响:ArrayList底层为数组,所以会受到元素位置影响。直接插入删除时,默认将该元素追加到数组末尾,时间复杂度为O(1),但要将元素在指定位置插入删除时(),时间复杂度为O(n-1)。LinkedLIst底层为链表,不受到元素位置影响,近似为O(1)。

4.是否支持快速随机访问:ArrayList实现了RandomAccess接口,所以支持快速访问,LinkedLIst不支持快速随机访问

5.内存空间占用:ArrayList对内存的浪费主要体现在末尾会预留一定的空间,LinkedList主要体现在每个元素都要比ArrayList占用更多空间(后继和前驱)。

2.ArrayLIst的扩容机制?

  ArrayList是基于数组的集合,数组的容量是在定义的时候确定的,如果数组满了,再插入,就会数组溢出。所以在插入时候,会先检查是否需要扩容,如果当前容量+1超过数组长度,就会进行扩容。

ArrayList的扩容是创建一个1.5倍的新数组,然后把原数组的值拷贝过去。