• 《面试1v1》List


    我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。


    《面试1v1》 连载中…


    面试官: 小伙子,听说你对Java集合挺在行的?

    候选人: 谢谢夸奖,我对Java集合还在学习中,只能算入门水平。特别是List这个接口,其下的实现类功能非常丰富,我还未能全部掌握。

    面试官: 那么,简单介绍下List这个接口及常用实现类吧!这是Java集合的基础,也是日常开发中最常用的。

    候选人: List接口表示一个有序集合,它的主要实现类有:

    1. ArrayList:基于动态数组实现,查询快、增删慢。
    ArrayList<Integer> list = new ArrayList<>(); 
    
    • 1
    1. LinkedList:基于双向链表实现,查询慢、增删快。
    LinkedList<Integer> list = new LinkedList<>();  
    
    • 1
    1. Vector:和ArrayList类似,但它是线程安全的,查询快、增删慢。
    Vector<Integer> list = new Vector<>();
    
    • 1
    1. Stack:继承Vector,实现栈结构,后进先出。
    Stack<Integer> stack = new Stack<>();  
    
    • 1

    它们都实现了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;
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    ArrayList底层采用动态数组实现,通过ensureCapacityInternal()方法动态扩容,以达到在保证查询效率的同时,尽量减小扩容带来的性能消耗。这也是我在日常使用中最欣赏ArrayList的地方。当然,它的实现远不止这些,我还在不断学习与理解中。

    面试官: 不错,你对这些知识已经有一定理解。ArrayList的源码分析得也比较到位。看来你之前真的有认真研读与理解。不过List相关知识还有更广阔的空间,需要你继续努力!

    候选人: 非常感谢面试官的肯定与指导。您说得对,List及其相关知识还有很多值得我继续学习与探索的地方。我会持续加深理解,提高运用能力。

    面试官: 那么,你对List还有哪些不太理解的地方?或是想更深入学习的内容?

    候选人: 关于List,我还不太清楚或想进一步学习的内容如下:

    1. CopyOnWriteArrayList:它的实现原理与线程安全机制,这也是日常开发中经常使用的并发List。
    2. SubList :List子列表的实现原理与边界情况。以及子列表的修改如何影响原列表。
    3. List各实现类在并发环境下的表现。如何选择恰当的并发List类?
    4. List迭代器:ListIterator与Iterator的区别与使用场景。
    5. Queue接口:Queue作为List的子接口,其实现类与使用场景。
    6. 底层数据结构:理解数组、链表、红黑树等对List实现的影响,以及各自的优劣。
    7. 扩容机制:不同List的扩容策略及性能影响。如何优化?
    8. 序列化与反序列化:List各实现类的序列化与反序列化实现。
    9. 空值处理:null值在各List实现类中的处理方式。

    这些都是我想进一步学习与理解的List相关内容与知识点。我会根据这份清单继续深入阅读源码、分析案例并实践使用,以便全面掌握List及其相关接口与实现类。这无疑需要一段长期的学习与总结过程,但这正是我成长为一名资深Java工程师所必须经历的阶段。

    面试官: Wonderful! 这份学习清单涵盖的内容非常全面且具有针对性。你能够准确定位自己尚未完全掌握的知识点,这展现出你的自我认知能力。只要你能够有计划和耐心地向这个清单上的每一项知识点进发,你在List及相关接口的理解上一定会有大的提高,这也为你成长为资深工程师奠定基础。我对你的学习态度和理解能力很为欣赏。

    最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!


    《面试1v1》 连载中…


    🎁目录合集:

    Gitee:https://gitee.com/rodert/JavaPub

    GitHub:https://github.com/Rodert/JavaPub

    http://javapub.net.cn

  • 相关阅读:
    RCTF 2024 WEB wp
    十全十美源码
    整理MongoDB文档:身份验证
    【论文学习】变分推导
    计算机系统(21)----- 信号量实现进程互斥、同步、前驱关系
    JAVA设计模式详解 解构设计模式思想 详细代码对比
    【服务器数据恢复】戴尔某型号服务器raid故障的数据恢复案例
    LeetCode算法题解|LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间
    Vue3的computed计算属性和watch监视(四)
    基于区块链的隐私计算 - 原理和实践
  • 原文地址:https://blog.csdn.net/qq_40374604/article/details/131145249