Java进阶(List)——面试时List常见问题解读 & 结合源码分析

这篇具有很好参考价值的文章主要介绍了Java进阶(List)——面试时List常见问题解读 & 结合源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

前言

List、Set、HashMap作为Java中常用的集合,需要深入认识其原理和特性。

本篇博客介绍常见的关于Java中List集合的面试问题,结合源码分析题目背后的知识点。

关于的Set的博客文章如下:

  • Java进阶(Set)——面试时Set常见问题解读 & 结合源码分析

关于HaseMap的博客文章如下:

  • Java进阶(HashMap)——面试时HashMap常见问题解读 & 结合源码分析
  • Java进阶(ConcurrentHashMap)——面试时ConcurrentHashMap常见问题解读 & 结合源码分析 & 多线程CAS比较并交换 初识

其他相关的List的文章合集如下:

  • 手动实现ArrayList & 源码的初步理解分析 & 数组插入数据和删除数据的问题

  • Java学数据结构(1)——抽象数据类型ADT & 表List、栈Stack和队列Qeue

引出


1.ArrayList如何扩容,1.5倍;
2.ArrayList如何拷贝,深拷贝,浅拷贝;
3.ArrayList的增加或者删除效率低,arraycopy方法;
4.指定长度创建ArrayList对象,避免频繁扩容;
5.线程安全的ArrayList集合:Collections.synchronizedList;
6.LinkedList 和 ArrayList 该如何选择:ArrayList增删效率低,查询效率高;LinkedList 查询效率低,增删效率高
7.Vector 集合和 ArrayList 区别:Vector扩容机制为原始的2倍,线程安全;文章来源地址https://www.toymoban.com/news/detail-740670.html

ArrayList 如何扩容的?/ArrayList的大小是如何自动增加的?

ArrayList初始化的时候,若没有给定长度,则默认调用无参构造

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

此处elelmentData为ArrayList底层数组,后面DEFAULTCAPACITY_EMPTY_ELEMENTDATA 为常量数组初值为空,即长度为0

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

1.add添加第一个元素

当执行add方法添加第一个元素时,执行下面的代码

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

此处涉及到两条代码:

  • ensureCapacityInternal方法内会调用calculateCapacity方法,此处才是赋予数组长度为10

ensureCapacityInternal 方法

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

calculateCapacity方法

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    //如果数组是空的
       if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
           //返回数组的容量,DEFAULT_CAPACITY=10
           return Math.max(DEFAULT_CAPACITY, minCapacity);
       }
       return minCapacity;
   }

此时集合可以添加默认的10个元素

2.添加第11个元素时

当添加第11个元素时,ensureExplicitCapacity方法中,minCapacity为11,而原数组长度为10,所以if结构进入grow方法-扩容核心方法

ensureExplicitCapacity方法

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

grow方法-扩容核心方法

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

private void grow(int minCapacity) {
       // overflow-conscious code
        //把旧的长度赋值给oldCapacity
       int oldCapacity = elementData.length;
        //新的长度就=旧的长度*1.5
       int newCapacity = oldCapacity + (oldCapacity >> 1);
       if (newCapacity - minCapacity < 0)
           newCapacity = minCapacity;
       if (newCapacity - MAX_ARRAY_SIZE > 0)
           newCapacity = hugeCapacity(minCapacity);
       // minCapacity is usually close to size, so this is a win:
        //按照新的长度复制出一个新的数组
       elementData = Arrays.copyOf(elementData, newCapacity);
   }
  • oldCapacity赋值为原数组长度,为10 ,newCapacity赋值为原长度1.5倍,即15

  • 调用复制数组方法,将之前的数组复制到新的数组中,并将需要添加的元素加到数组最后一位,完成扩容!

如何复制某个ArrayList到另一个Arraylist中去?

重写clone方法,ArrayList克隆

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

厘清概念:深浅拷贝

Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

浅拷贝:虽然返回一个元素一样的ArrayList,复制的是元素的引用,即其中一个改变了元素,另一个也会跟着改变

两个集合中间存储了同一份元素的引用

例如:

深拷贝:重写clone方法,利用迭代器iterator或遍历集合,重新创建引用对象,逐个添加

例如:

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

复制的方法

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

list.clone()

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

clone.addALl(list);

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

Collections.copy(clone,list);

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

在索引中ArrayList的增加或者删除某个对象的运行过程?效率很低吗?解释一下为什么?

效率确实低

效率是很低的,因为ArrayList无论是增加或者删除某个对象,我们都要通过对数组中的元素进行移位来实现。

  • 增加元素时,我们要把要增加位置及以后的所有元素都往后移一位,先腾出一个空间,然后再进行添加。
  • 删除某个元素时,我们也要把删除位置以后的元素全部元素往前挪一位,通过覆盖的方式来删除。

而这种移位就需要不断的arraycopy,是很耗时间的,所以效率自然也很低。

源码arraycopy方法

增加元素时

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

删除元素时

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

现在我有一个很大的数组需要拷贝,原数组大小是 5k,请问如何快速拷贝?

指定长度创建ArrayList对象,避免频繁扩容

如何获得一个线程安全的ArrayList集合?

Collections.synchronizedList

List<Object> datas = Collections.synchronizedList(new ArrayList<>());

源码分析

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

从源码可以看到集合操作都加了synchronized 关键字,保证了在同一时刻,数组和链表只会被一个线程所修改。

LinkedList 和 ArrayList 该如何选择?

选择原则

  • ArrayList 底层为数组,在增加和删除元素时会频繁的调用arraycopy,所以查询效率高,增删效率低
  • LinkedList 底层为链表,故查询效率低,但增删效率高。

LinkedList源码node节点

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

  • item 为当前元素
  • next指向下一个元素,若为最后一个则为null
  • prev指向上一个元素,若为第一个则为null

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试

Vector 集合

  1. vector 和 ArrayList 基本一样
  2. 区别在于 vector扩容机制为原始的2倍,ArrayList为之前的1.5倍
  3. vector 是线程安全的,ArrayList是非线程安全的

Java进阶(List)——面试时List常见问题解读 & 结合源码分析,Java,java,list,面试


总结

1.ArrayList如何扩容,1.5倍;
2.ArrayList如何拷贝,深拷贝,浅拷贝;
3.ArrayList的增加或者删除效率低,arraycopy方法;
4.指定长度创建ArrayList对象,避免频繁扩容;
5.线程安全的ArrayList集合:Collections.synchronizedList;
6.LinkedList 和 ArrayList 该如何选择:ArrayList增删效率低,查询效率高;LinkedList 查询效率低,增删效率高
7.Vector 集合和 ArrayList 区别:Vector扩容机制为原始的2倍,线程安全;

到了这里,关于Java进阶(List)——面试时List常见问题解读 & 结合源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代

    马尔可夫性质(Markov property,MP) :如果某一个过程未来的状态与过去的状态无关,只由现在的状态决定,那么其具有马尔可夫性质。换句话说,一个状态的下一个状态只取决于它的当前状态,而与它当前状态之前的状态都没有关系。 马尔可夫链(Markov chain) : 概率论和数

    2024年03月26日
    浏览(52)
  • 面试-Dubbo常见问题

    Dubbo 是一个RPC框架,包含注册中心,服务提供方,服务消费方,控制台,监控中心。 Dubbo 启动时会从注册中心拉取消费者需要的提供方信息,如果依赖的服务提供方不可用,Dubbo消费方会启动失败,并且不停的向注册中心请求提供方信息,抛出异常找不到对应的提供方。可以

    2024年02月08日
    浏览(48)
  • JavaEE 面试常见问题

    Mybatis 是一种典型的半自动的 ORM 框架,所谓的半自动,是因为还需要手动的写 SQL 语句,再由框架根据 SQL 及 传入数据来组装为要执行的 SQL 。其优点为: 1. 因为由程序员自己写 SQL ,相对来说学习门槛更低,更容易入门。 2. 更方便做 SQL 的性能优化及维护。 3. 对关系型数据

    2024年02月14日
    浏览(48)
  • JVM基础,面试常见问题

    目录 一.运行时数据区域 1.线程独享 (1)栈 (2)程序计数器 2.线程共享 (1)方法区 (2)堆 二.内存如何分配 1.指针碰撞法 2.空闲列表法 3.TLAB 三.对象在内存中的组成 1.对象头 (1)markword (2)指向类型的指针 (3)如果是数组-》数组长度 2.实例数据 3.对齐填充 四.如何访

    2024年01月23日
    浏览(51)
  • 【数据结构面试常见问题】

    数据结构作为计算机的一门基础学科,它在面试中占有很大的比重,本科阶段,我们也学过数据结构与算法,内容比较多,也比较难,尤其是图的应用以及各类查找和排序算法,这些也都是核心内容。数据结构在实际的应用中也比较多,因此,整理一些常见的笔试、面试的数

    2024年03月22日
    浏览(45)
  • 项目经理岗面试常见问题

    一、注意事项   ·电面邀约确认(避免hr刷KPI): 请问贵司招聘的是什么岗位,是新建团队还是原有团队? 这边面试流程是怎样的,是 leader 直接面,还是?   ·面试前铺垫: 如果您对某部分感兴趣,请随时打断我。   ·面试中发挥: 尽量采用 STAR 原则回答,即 情境( Si

    2024年02月05日
    浏览(48)
  • 单片机面试常见问题

    1、中断的概念?简述中断的过程 (1)中断:指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,转而执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序执行完毕后,CPU再返回到被

    2024年04月10日
    浏览(77)
  • 大数据常见面试问题汇总

    目录 第1章 核心技术 1.1 LinuxShell 1.1.1 Linux常用高级命令 1.1.2 Shell常用工具及写过的脚本 1.1.3 Shell中单引号和双引号区别 1.2 Hadoop 1.2.1 Hadoop常用端口号 1.2.2 HDFS读流程和写流程 1.2.3 HDFS小文件处理 1.2.4 HDFS的NameNode内存 1.2.5 Shuffle及优化 1.2.6 Yarn工作机制 1.2.7 Yarn调度器 1.2.8 HDFS块大

    2024年02月14日
    浏览(109)
  • kubernetes常见面试问题详解

    在面试的时候,面试官常常会问一些问题: k8s是什么?有什么用? k8s由哪些组件组成? pod的启动流程? k8s里有哪些控制器? k8s的调度器里有哪些调度算法? pod和pod之间的通信过程? 外面用户访问pod数据流程? 你常用哪些命令? 容器的类型? 3种探针? pod的升级? HPA、V

    2024年02月10日
    浏览(46)
  • docker常见面试问题详解

    在面试的时候,面试官常常会问一些问题: docker是什么,能做什么? docker和虚拟机的区别是什么呢? docker是用什么做隔离的? docke的网络类型?docker数据之间是如何通信的? docker的数据保存问题? 常用的docker命令? docker制作镜像相关? 下面,就让我来详细说明一些这些问

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包