【Java八股面试系列】Arraylist和HashMap的底层原理

本文详细分析了ArrayList的动态扩容机制,HashMap的构造方法、putVal和resize过程,以及为何重写hashCode和equals。讨论了线程安全问题,以及ConcurrentHashMap如何处理并发插入。重点强调了equals和hashCode一致性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList源码

总:

**ArrayList**底层是使用名为 **elementDataObject动态数组进行实现,与Java中的数组相比,她的容量能够动态的进行增长。在我们更新元素的时候,我们会通过ensureCapacityInternal()方法来确保我们的容量够用,如果容量不够则调用grow()**方法对我们的数组进行扩容为1.5倍,然后将我们原来的的数组复制过去。

ArrayList 和 Vector 的区别?

  • ArrayListList 的主要实现类,底层使用 Object[]存储,适用于频繁的查找工作,线程不安全 。
  • VectorList 的古老实现类,底层使用Object[] 存储,线程安全。

ArrayList 可以添加 null 值吗?

ArrayList 中可以存储任何类型的对象,包括 null 值。不过,不建议向ArrayList 中添加 null 值, null 值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常。

Arraylist 与 LinkedList 区别?

Arraylist 和 LinkedList都是实现了 List接口,都是线程不安全的。

不同点:

  • Arraylist底层是通过object数组进行实现,而LinkedList底层是通过双向链表进行实现
  • AL实现了随机读取接口,能够随机进行读取,用来查询的效率高,LL不能进行随机读取,只能遍历进行读取,但是她的插入效率高
  • 内存空间的占用上,AL的预留空间会占用一定的位置,而LL会占用更多的空间,因为要保存其他的一些位置信息

构造方法

Arraylist有有参构造方法也有无参构造方法,有参的构造方法会将我们的容器大小设置为设置的大小

无参构造方法先是将提前创建好的空数组给他,后续使用的时候在进行扩容操作

扩容机制

这里每次add操作的时候都会使用ensure CapacityInternal()方法进行容量判断,如果不足则会使用grow进行扩容

在这里插入图片描述

private void ensureCapacityInternal(int minCapacity) {
   
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

这里的calculate Capacity方法主要是判断容器是否是已经初始化过

private static int calculateCapacity(Object[] elementData, int minCapacity) {
   
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
   
        return Math.
Java面试八股文是指在Java开发岗位面试中常见的一些核心知识点问题。以下是Java面试八股文的主要内容: 1. Java基础知识: - Java的特点优势 - Java的基本数据类型包装类 - Java的运算符表达式 - Java的流程控制语句(if-else、for、while等) - Java的异常处理机制 2. 面向对象编程: -对象的概念 - 封装、继承多态的概念实现方式 - 接口抽象类的区别用法 - Java中的内部类匿名类 3. Java集合框架: - List、SetMap的特点用法 - ArrayList、LinkedList、HashSet、HashMap等集合类的底层实现原理 - 集合类的遍历常见操作 4. 多线程与并发: - 线程的生命周期状态转换 - 线程的创建启动方式 - 线程同步与互斥的方法(synchronized、Lock等) - 线程池的概念使用 5. JVM与垃圾回收: - JVM的内存模型运行时数据区域 - 垃圾回收算法垃圾回收器的选择 - 常见的JVM调优手段工具 6. 设计模式: - 单例模式、工厂模式、代理模式等常见设计模式的原理应用场景 - MVC、观察者模式等常见架构模式的概念实现方式 7. 数据库与SQL: - SQL语句的基本语法常见操作(增删改查) - 数据库事务的特性隔离级别 - 数据库连接池的概念使用 8. Web开发相关: - ServletJSP的概念生命周期 - MVC框架(如Spring MVC)的原理使用 - 前端技术(HTML、CSS、JavaScript)的基本知识 以上是Java面试八股文的主要内容,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值