文章图片
1.说说Java中常用的容器有哪些?容器主要包括 Collection
和 Map
两种 , Collection 存储着对象的集合 , 而 Map 存储着键值对(两个对象)的映射表 。
如图:
???面试官追问:说说集合有哪些类及他们各自的区别和特点?
- Set
TreeSet
HashSet
LinkedHashSet
- List
ArrayList
Vector
LinkedList
- Queue
【meta|Java集合面试题看这篇就够了】LinkedList
PriorityQueue
ArrayQueue
TreeMap
HashMap
HashTable
LinkedHashMap
2.详细说说 Arraylist 和 LinkedList的区别?
ArrayList
:底层是基于 数组 实现的 ,查找快 , 增删较慢 。LinkedList
不支持高效的随机元素访问 , 而ArrayList
支持 。 快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)
方法) 。
LinkedList
:底层是基于 链表 实现的 。 确切的说是循环双向链表(JDK1.6之前是双向循环链表、JDK1.7之后取消了循环) ,查找慢、增删快 。 LinkedList链表由一系列表项连接而成 , 一个表项包含3个部分︰元素内容、前驱表和后驱表 。 因此 内存空间占用 比ArrayList 更多 。
不一定的 。
- 如果增删都是在末尾来操作(每次调用的都是
remove()
和add()
) , 此时 ArrayList就不需要移动和复制数组来进行操作了 。 如果数据量有百万级的时 , 速度是会比 LinkedList 要快的 。
- 如果删除操作的位置是在中间 。 由于LinkedList的消耗主要是在遍历上 , ArrayList的消耗主要是在移动和复制上(底层调用的是
arrayCopy()
方法 , 是native方法) 。 LinkedList 的遍历速度是要慢于ArrayList的复制移动速度的 。 如果数据量有百万级的时 , 还是ArrayList要快 。
查看源码我们发现实际上
RandomAccess
接口中什么都没有定义 。从源码可以看出RandomAccess 接口只是一个标志接口 , 只要List集合实现这个接口 , 就能支持快速随机访问 。 通过查看
Collections
类中的 binarySearch()
方法 , 可以看出 , 判断List是否实现RandomAccess接口来实行 indexedBinarySerach(list key)
或 iteratorBinarySerach(list key)
方法 。 再通过查看这两个方法的源码发现: 实现RandomAccess接口的List集合采用一般的 for循环遍历 , 而未实现这接口则采用迭代器 , 即ArrayList 一般采用for循环遍历 , 而 LinkedList 一般采用迭代器遍历public static <T>
int binarySearch(List<? extends Comparable<? super T>> list T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list key);
else
return Collections.iteratorBinarySearch(list key);
???面试官追问:为何LinkedList却没实现这个接口?
ArrayList
底层是数组 , 而 LinkedList
- 顶固集创与中国电信研究院、中山大学战略合作|定制快讯| 中国电信研究院
- 因全球范围内专利发明表现突出 蚂蚁集团入选2022年《全球百强
- 苹果|不用iPhone!苹果员工集体要换安卓手机:原因曝光
- javascript|JavaScript设置页面元素的滚动条一直最下方
- 安卓|不用iPhone!苹果员工集体要用安卓手机:原因是为防公司窥探
- 集成电路|春节后这些行业人才需求看涨,上海求职者最“卷”
- 监管部门|警惕以元宇宙名义非法集资
- 小米投资光莱弗利科技,经营范围含集成电路销售
- exynos|三星芯片遭手机部门嫌弃?集团内部讨论,可能砍掉Exynos项目!
- 集团企业采购的高端商务本有哪些门道?