
文章图片
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
- meta|促进更逼真AR/VR体验,Meta正在开发全新空间音频工具
- 创业|八成互联网电视非法采集用户数据, 彩电企业怎么办?
- 肺炎患者|为何新冠患者已退烧,还需进行集中治疗
- 无人驾驶|189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 微信|微信官宣:新增2大重要新功能,1个好评如潮,1个遭网友集体吐槽
- Java|干翻小米,红米又出超大杯旗舰,120W+2K直屏+双旗舰芯
- 百度地图|Java程序员应知应会之Maven和Gradle的区别
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
- Java|Gamamobi CEO黄继德:我们的元宇宙游戏不担心体验落差
