我是 javapub,一名 Markdown
程序员从👨💻,八股文种子选手。
面试官: 小伙子,听说你对Java集合挺在行的?
候选人: 谢谢夸奖,我对Java集合还在学习中,只能算入门水平。特别是List这个接口,其下的实现类功能非常丰富,我还未能全部掌握。
面试官: 那么,简单介绍下List这个接口及常用实现类吧!这是Java集合的基础,也是日常开发中最常用的。
候选人: List接口表示一个有序集合,它的主要实现类有:
ArrayList<Integer> list = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
Vector<Integer> list = new Vector<>();
Stack<Integer> stack = new Stack<>();
它们都实现了List接口,有一些共同的方法,但底层数据结构不同,所以在不同场景有不同的使用优势。这取决于应用的需求。
面试官: 那日常工作用的最多的是哪个实现类?它的源码能不能讲解一下?
候选人: 我日常工作中最常用的List实现类就是ArrayList。 它的源码如下:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
/**
* 默认初始容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 存储元素的数组
*/
transient Object[] elementData;
/**
* 实际容量
*/
private int size;
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else {
this.elementData = new Object[DEFAULT_CAPACITY];
}
}
public ArrayList() {
this.elementData = new Object[DEFAULT_CAPACITY];
}
//添加元素
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
}
ArrayList底层采用动态数组实现,通过ensureCapacityInternal()
方法动态扩容,以达到在保证查询效率的同时,尽量减小扩容带来的性能消耗。这也是我在日常使用中最欣赏ArrayList的地方。当然,它的实现远不止这些,我还在不断学习与理解中。
面试官: 不错,你对这些知识已经有一定理解。ArrayList的源码分析得也比较到位。看来你之前真的有认真研读与理解。不过List相关知识还有更广阔的空间,需要你继续努力!
候选人: 非常感谢面试官的肯定与指导。您说得对,List及其相关知识还有很多值得我继续学习与探索的地方。我会持续加深理解,提高运用能力。
面试官: 那么,你对List还有哪些不太理解的地方?或是想更深入学习的内容?
候选人: 关于List,我还不太清楚或想进一步学习的内容如下:
这些都是我想进一步学习与理解的List相关内容与知识点。我会根据这份清单继续深入阅读源码、分析案例并实践使用,以便全面掌握List及其相关接口与实现类。这无疑需要一段长期的学习与总结过程,但这正是我成长为一名资深Java工程师所必须经历的阶段。
面试官: Wonderful! 这份学习清单涵盖的内容非常全面且具有针对性。你能够准确定位自己尚未完全掌握的知识点,这展现出你的自我认知能力。只要你能够有计划和耐心地向这个清单上的每一项知识点进发,你在List及相关接口的理解上一定会有大的提高,这也为你成长为资深工程师奠定基础。我对你的学习态度和理解能力很为欣赏。
最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!
🎁目录合集:
Gitee:https://gitee.com/rodert/JavaPub
GitHub:https://github.com/Rodert/JavaPub