八股总结(Java)实时更新!

news2025/4/1 18:20:35

八股总结(java)

  1. ArrayList和LinkedList有什么区别

    • ArrayList底层是动态数组,LinkedList底层是双向链表;
    • 前者利于随机访问,后者利于头尾插入;
    • 前者内存连续分配,后者通过指针连接多块不连续的内存;
  2. 实现多线程的几种方式

    • 通过继承Tread并重写run();
    • 实现无返回值的Runnable接口;
    • 实现有返回值的Callable接口,通常于Future一起使用;
    • 使用ExecutorService线程池工厂;
    • 使用ThreadPoolExecutor自定义线程池;
    • 使用ComletetableFuture异步链式编程;
  3. 线程池有哪些核心参数

    • 核心线程数:线程池创建时就存在的线程数,并且不会因为任务运行完成而销毁;

    • 最大线程数:线程池最大承载的线程数,非核心线程任务运行完成后自动销毁;

    • 工作队列:用于存放待执行任务的阻塞队列,有基于数组的有界队列,基于链表的无界队列,不存储元素的队列但每个插入必须等待一个移除,支持优先级排序的无界队列;

    • 线程空闲时间:非核心线程任务运行完成后等待新任务的最长时间;

    • 时间单位:空闲时间的单位;

    • 拒绝策略:当任务数超过最大线程数时的行为,默认抛出异常,也可以由提交任务的线程直接执行任务,也可以丢弃任务不抛出异常,也可以丢弃队列最旧任务并重新提交;

  4. 线程的状态有哪些

    • 新建:线程new,但没有start();

    • 可运行:调用start(),但还在操作系统分配资源;

    • 阻塞:线程因为锁而阻塞;

    • 等待:线程无限期等待其他线程的操作;

    • 超时等待:线程等待其他线程的操作,但设置过期时间;

    • 终止:线程执行完毕或异常终止;

  5. String、StringBuilder、StringBuffer有什么区别

    • String,是定长字符串,对String的所有操作都会创建新的对象;

    • StringBuilder,可以在不创建新对象的情况下对字符串内容进行修改,线程并不安全,适用于单线程环境下;

    • StringBuffer,可以在不创建新对象的情况下对字符串内容进行修改,线程安全,适用于多线程环境下;

  6. 等于号(==)和equals方法有什么区别?

    • ==常用于基本数据类型之间的比较,对于引用数据类型,则对比的是其地址
    • equals常用于比较两个对象的内容是否相等,默认情况下Object类的equals方法比较的也是地址,但和许多包装类都重写了equals方法,使其比较的是对象的内容;
  7. final关键字有什么作用?修饰类时有什么效果?

    • final修饰的变量称为常量,如果修饰的是基本数据类型,则其值不能修改,若修饰的是引用数据类型则其指向的对象不能修改,但可以修改其对象内部状态;
    • 修饰方法,不能被子类重写;
    • 修饰类,不能被继承;
  8. HashMap的底层原理

    • 底层是一个默认长为16的动态数组,其存储链表或红黑树;
    • 当有键值对存入时,键会通过哈希函数映射当数组对应下标位置,值则会存入链表中;
    • 若链表长度超过8则转换为红黑树;若红黑树的数据量小于6,则退化为链表;
    • 若数组元素数量超过默认负载因子的0.75就成倍扩容;
  9. Hashmap的扩展知识

    • 为什么链表长度超过8要转换为红黑树

      • 在极端情况下,数据分配不均,导致大量键值对集中在一个元素链表中,会导致hashmap退化为链表影响效率;
      • 根据大数据统计,链表长度超过8是因为哈希冲突导致的;

      为什么选择红黑树而不是B+树

      • 红黑树是自适应平衡二叉树,内存占用小,在hashmap中性能足够;
      • B+树的适用情景为io数据流的读取,因为其节点可以有多个子节点,每个节点可以存储多个键,用于减少树的高度,降低磁盘io访问次数,并且所有子节点在同一层,用于平衡io的平均访问时间,叶子节点之间通过指针连接,形成一个有序链表,支持高效返回查询;
  10. ConcurrentHashMap的底层原理

  • concurrentHashMap的底层就是HashMap的基础上保证线程安全;

  • 在jdk8之前,采用分段锁实现线程安全,内部有多个段组成,每个段维护一部分数据,并各自有一把锁。修改某个段的数据时对该段加锁保证线程安全;读取则不用加锁,因为段内的数组使用volatile修饰,保证可见性;

  • jdk8后,采用CAS+synchronized实现线程安全,当要向数组中某一位置插入数据时,若该位置无数据就使用CAS进行写入,反之加锁后进行写入;

  • 当数组进行扩容时采用的是并发+CAS+锁的方式,让扩容的同时不影响读取操作;

  • 为什么改为CAS+锁,因为原来的分段锁每个段都需要维护一把锁,占用了过多的资源,并且段相比较节点的颗粒度较大;

  1. class的生命周期

    • class的生命周期指类从JVM虚拟机加载开始,直到卸载的过程,生命周期包括加载、验证、准备、解析、初始化、使用和卸载七个阶段;
    • 加载,new创建类的实例、访问类的静态方法或属性、使用反射时会将class文件加载到JVM中,生成字节码class文件;
    • 验证,确保字节码class文件的合法;
    • 准备,静态变量分配内存并设置默认值;
    • 解析,符号引用转为直接引用;
    • 初始化,执行static{}代码块和静态变量的显式赋值;
    • 使用;
    • 卸载,释放内存;
  2. JVM是什么

    • java的java虚拟机,负责执行java字节码,并提供内存管理、垃圾回收等机制;
    • JVM是java“一次编写,随处运行”的核心,将java源码编译为class字节码再解释或编译为机器码交由操作系统执行;
    • JVM主要组成有类加载器,运行时数据区,执行引擎等;
  3. JVM的工作流程

    • 编写java代码;

    • 使用javac编译为class字节码;

    • 加载字节码;

    • 执行字节码,交由JIT编译器与解释器,转换为机器码;

    • 内存管理,分为堆、栈、方法区等;

    • 程序结束,释放所有资源;

  4. JVM的内存模型与垃圾回收机制

  • 主要分为分为堆、栈、方法区(jdk8前叫永久代)、pc程序计数器、直接内存;
  • 方法区,用于存放类信息,常量池,静态变量等;
  • 堆,用于存放对象实例和数组,是垃圾回收的主要区域,分为新生代和老年代;
  • 栈,用于存放局部变量、方法调用帧;
  • 程序计数器,用于记录当前线程执行的字节码指令魏智用于线程切换后回复执行位置;
  • 直接内存,手动管理,不受JVM堆内存限制;
  1. 垃圾回收机制
  • 是JVM自动管理内存的核心机制,负责回收不再使用的对象,释放内存空间;

  • 垃圾回收的基本原理是,可达性分析,从GC根对象触发,遍历所有可达对象,不可达对象视为垃圾进行回收;

  • 垃圾回收算法:

    • 标记-清除算法:从根对象出发,标记所有可达对象,清除未被标记的对象;缺点是会产生内存碎片;
    • 标记-整理算法:在标记-清理算法的基础上,标记后先将存活的对象移动到另一片区域,之后进行清除;
    • 复制算法:将内存分为AB两块,A区存活的对象赋值到B区,清理A区的所有对象;
    • 分代收集:将堆分为新生代和老年代,新生代是新对象分配的区域,采用复制算法,老年代是长期存活的对象,使用标记-清除或标记-整理算法;
  • 垃圾回收器:

    • 单线程回收器,适用于单线程;
    • 多线程回收器,适用与多线程;
    • CMS回收器,采用三色标记法,并发执行,对象尚未被标记则为白色,对象已被标记但引用的对象还未标记则为灰色,对象及其引用对象都被标记则为黑色,适用于响应时间敏感的应用;工作流程是:
      • 初始标记:标记从GC根对象直接可达的对象,标记灰色,需要STW停顿;
      • 并发标记:标记所有灰色对象的引用对象;
      • 重新标记:重新标记并发标记阶段所有修改引用或者不在引用的对象,需要SWT停顿;
      • 并发清除:清除所有白色标记的对象;
    • G1回收器,分区回收,适用于低延迟的大内存应用;
    • ZGC回收器,超低延迟;
  1. G1垃圾回收器与CMS垃圾回收器的区别
  • G1是在可控的停顿时间内实现高吞吐量,并且适用于大内存。CMS尽量减少停顿时间,适用于中小内存;
  • G1堆内存管理基于分区管理,划分为多个大小相同的区域,每个区域可以是年轻代、老年代和永久代。而CMS则将堆内存划分为新生代和老年代;
  • G1内存管理采用并发标记整理算法,减少碎片,而CMS采用并发标记清除算法,容易造成FullGC堆溢出;
  1. 发生了OutOfMemoryError如何解决
  • 首先根据报错确认问题在哪;
  • 使用jmap生成堆转储文件;
  • 分析堆内存;
  • 根据原因调整JVM参数;
  • 选择合适的垃圾回收机制;
  1. CAS的原理

    • CAS是一种无锁原子操作,他有三个属性,变量的内存地址,预期值,新值,如果期望值与内存中的值一致则更新为新值;
    • CAS存在ABA问题,ABA问题是当一个变量从A变为B再变为A,CAS机制会误认为值没有被修改;
    • 常见的解决方案是通过给变量加上时间戳或是版本号,每次修改就会更新,这样修改值时,CAS就能检测到变化;
  2. volatile字段的原理,是否能替代锁

    • volatile是java的修饰词,用于确保变量的可见性与有序性,主要作用于解决多线程环境下的内存可见性问题;
    • 在多线程环境下,每个线程都有自己的工作内存,当线程对变量进行修改时,会先修改变量存放到自己的内存中,不会立即同步给主内存,导致其他线程不能看到最新的值;
    • volatile会强制修改后的值立即写会主内存,并强制其他线程重新读取该变量,保证可见性;
    • volatile会保证变量的读写操作按照代码的顺序执行;
    • volatile的底层原理是依赖于内存屏障,他是一种CPU指令用于控制指令的执行顺序与内存可见性;
    • 在写入变量时,会插入写屏障,确保之前操作都完成后,在将新的变量同步给主内存;
    • 在插入变量时,会插入读屏障,确保之后的操作都能看到最新的值;
    • volatile只能解决可见性与有序性的问题,无法解决复合操作的原子性问题;
  3. 双亲委派模型

    • 是java类的加载机制,采用逐级委派的方式加载类,主要目的是保证java核心类的安全性和避免类的重复加载;
    • 按照层次关系分为:
      • 启动类加载器:负责加载Java核心类库;
      • 扩展类加载器:负责加载扩展类库;
      • 应用类加载器:负责还在开发者自己编写的Java代码;
      • 自定义类加载器:开发者继承ClassLoader自定义类加载逻辑;
    • 工作机制:当类加载器需要加载一个类时,会由当前加载器先向父类加载器发送加载请求,直到启动类加载器,如果找不到则由当前加载器加载;
  4. AQS的底层原理

    • AQS(抽象队列同步器)是Java并发包中的核心组件,用于实现锁和同步器;
    • AQS采用FIFO队列+CAS操作来管理锁的同步和排队,其底层主要通过状态变量(state)和队列管理来实现线程的阻塞、唤醒、等待和竞争锁等功能,通过CAS操作保证线程安全;
    • state变量用于表示同步的当前状态,state==0表示锁为被占用,!=0表示已被占用;
    • FIFO队列来管理等待同步的线程,当线程尝试获取同步资源失败时会被放入队列,按照先进先出的顺序等待获取同步;
    • 队列数据结构是一个双向链表,每个等待的线程都是一个队列的节点,节点包含线程和前后指针;头部是等待同步的线程,尾部是最新加入的线程;
  5. Executors线程工厂类有哪些常见的工厂方法

    • newFixedThreadPool(int nThreads),创建一个固定大小的线程池,核心线程数与最大线程数相同,适用于执行长期稳定任务,保证一定并发量的情况;

    • newCachedThreadPool(),创建一个可缓存的线程池,无核心线程,最大线程数为Integer.MAX_VALUE,适用于执行大量短时间任务的情况,能够充分利用系统资源;

    • newSingleThreadExecutor(),创建单线程的线程池,保证所有任务按照顺序执行;

  6. 数组如何转为list

    • 使用Arrays.asList(T… a),返回定长list;
    • 使用new ArrayList<>(Arrays.asList(array));
    • 使用Stream,Arrays.stream(array).collect(Collectors.toList());
    • 使用for循环手动添加;
  7. 如何遍历list

    • 增强型for循环;
    • 普通循环,访问下标;
    • 迭代器;
    • Stream流,forEach(System.out::println);
  8. 任务提交给线程池后是怎么工作的

    • 线程池会先检查核心线程数,小于核心线程数,会创建新线程;
    • 任务队列未满则任务进入阻塞队列;
    • 如果任务队列(ArrayBlockingQueue)已满,且当前线程数小于最大线程数,则会创建新线程执行任务;
    • 如果已经达到最大线程数,线程池会执行拒绝策略;
  9. wait()和sleep()的区别

    • wait和sleep方法都用于使用线程暂停执行,但他们在使用方式、功能和影响上有显著区别;
    • sleep是Thread类的静态方法,可以在任何地方调用,无需持有对象锁,调用后线程会暂停执行指定的时间,但不会释放已持有的锁,其他县城无法获取这些锁;
    • wait是Object类的方法,必须在同步方法或同步代码块内调用,并且在调用时需要持有该对象的监视器锁,调用后,线程会释放已持有的锁,允许其他线程获取这些锁,线程会进入等待状态,直到被其他线程调用其对象的notify()方法唤醒。如果wait添加了过期时间,若未超过过期时间也可以被notify唤醒,超过时间后自动唤醒;
    • sleep常用于让线程暂停执行一段固定的时间,例如实现定时任务或控制线程执行频率;wait常用于线程间的通信;
  10. 并行与并发的区别:

    • 并行(Parallelism): 多个任务在同一时刻同时执行,通常需要多核处理器的支持。
    • 并发(Concurrency): 多个任务在同一时间段内交替执行,但不一定同时执行。
  11. Java常见的设计模式

    • 单例模式:
      • 在系统中一个类只存在一个实例,类自身负责创建并维护唯一实例,并提供一个全局方法,允许外部访问该实例;
      • 常用于资源管理、配置管理和日志记录;
      • 实现单例模式一般通过双重检查锁定,在需要时才创建实例,并通过双重检查和同步块确保线程安全,同时提高性能;
    • 普通工厂模式:
      • 由一个工厂类根据传入的不同参数创建不同的产品实例,将对象创建逻辑封装在工厂类中;
      • 将对象的创建与使用分离,降低了耦合性;
      • 缺点是集中力所有对象的创建逻辑,违反了单一职责原则,可能导致工厂类过于复杂。且当需要添加新产品时,需要修改工厂类的代码,不符合开闭原则;
    • 工厂方法模式:
      • 定义了一个创建对象的接口,由子类决定实例化哪个具体类;
      • 相比较普通工厂方法,符合开闭原则,增加新产品时无需修改现有代码;
      • 符合单一职责原则,每个具体工厂类只负责创建对应的产品;
      • 增加了系统的复杂度,需要对每个具体实现创建工厂类;
    • 抽象工厂方法:
      • 提供一个创建一系列相关或相互依赖对象的接口,也就是对多组产品抽象其方法,封装隐藏其产品创建的过程;
  12. threadLocal是什么?

    • TreadLocal是一个创建线程局部变量的类,通常情况下,多个线程共享同一变量,可能导致并发问题,使用TreadLocal,存储的变量只能由当前线程使用,保证线程隔离;
    • 使用TreadLocal时,可能会导致内存泄露,因为与线程生命周期绑定,如果不及时清理,可能会导致无法回收对象占用内存,所以需要在不需要TreadLocal时调用remove()清理;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【jQuery】插件

目录 一、 jQuery插件 1. 瀑布流插件&#xff1a; jQuery 之家 http://www.htmleaf.com/ 2. 图片懒加载&#xff1a; jQuery 插件库 http://www.jq22.com/ 3. 全屏滚动 总结不易~ 本章节对我有很大收获&#xff0c;希望对你也是~~~ 一、 jQuery插件 jQuery 功能…

MATLAB导入Excel数据

假如Excel中存在三列数据需要导入Matlab中。 保证该Excel文件与Matlab程序在同一目录下。 function [time, voltage, current] test(filename)% 读取Excel文件并提取时间、电压、电流数据% 输入参数:% filename: Excel文件名&#xff08;需包含路径&#xff0c;如C:\data\…

孤码长征:破译PCL自定义点云注册机制源码迷局——踩坑实录与架构解构

在之前一个博客《一文搞懂PCL中自定义点云类型的构建与函数使用》中&#xff0c;清晰地介绍了在PCL中点云的定义与注册方法。我的一个读者很好奇其内部注册的原理以及机制&#xff0c;再加上最近工作中跟猛男开发自定义点云存储的工作&#xff0c;借着这些需求&#xff0c;我也…

Centos 7 搭建 jumpserver 堡垒机

jumpserver 的介绍 1、JumpServer 是完全开源的堡垒机, 使用 GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统 1)身份验证 / Authentication 2)授权控制 / Authorization 3)账号管理 / Accounting 4)安全审计 / Auditing 2、JumpServer 使用 Python / Django 进行开…

封装了一个优雅的iOS全屏侧滑返回工具

思路 添加一个全屏返回手势&#xff0c;UIPangesturerecognizer, 1 手势开始 在手势开始响应的时候&#xff0c;将navigationController的delegate代理设置为工具类&#xff0c;在工具类中执行代理方法&#xff0c;- (nullable id )navigationController:(UINavigationControll…

HCIP-6 DHCP

HCIP-6 DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 手工配置网络参数存在的问题 灵活性差 容易出错 IP地址资源利用率低 工作量大 人员素质要求高 DHCP服务器按照如下次序为客户端选择IP地址: ①DHCP服务器的数…

opencv图像处理之指纹验证

一、简介 在当今数字化时代&#xff0c;生物识别技术作为一种安全、便捷的身份验证方式&#xff0c;正广泛应用于各个领域。指纹识别作为生物识别技术中的佼佼者&#xff0c;因其独特性和稳定性&#xff0c;成为了众多应用场景的首选。今天&#xff0c;我们就来深入探讨如何利…

记一道CTF题—PHP双MD5加密+”SALT“弱碰撞绕过

通过分析源代码并找到绕过限制的方法&#xff0c;从而获取到flag&#xff01; 部分源码&#xff1a; <?php $name_POST[username]; $passencode(_POST[password]); $admin_user "admin"; $admin_pw get_hash("0e260265122865008095838959784793");…

机器学习的一百个概念(3)上采样

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

分秒计数器设计

一、在VsCode中写代码 目录 一、在VsCode中写代码 二、在Quartus中创建工程与仿真 1、建立工程项目文件md_counter 2、打开项目文件&#xff0c;创建三个目录 3、打开文件trl&#xff0c;创建md_counter.v文件 4、打开文件tb&#xff0c;创建md_counter_tb.v文件 5、用VsCod…

Flink介绍——发展历史

引入 我们整个大数据处理里面的计算模式主要可以分为以下四种&#xff1a; 批量计算&#xff08;batch computing&#xff09; MapReduce Hive Spark Flink pig流式计算&#xff08;stream computing&#xff09; Storm SparkStreaming/StructuredStreaming Flink Samza交互计…

12. STL的原理

目录 1. 容器、迭代器、算法 什么是迭代器? 迭代器的作用&#xff1f; 迭代器的类型&#xff1f; 迭代器失效 迭代器的实现细节&#xff1a; 2. 适配器 什么是适配器&#xff1f; 适配器种类&#xff1a; 3. 仿函数 什么是仿函数&#xff1f; 仿函数与算法和容器的…

OSPFv3 的 LSA 详解

一、复习&#xff1a; OSPFv3 运行于 IPv6 协议上&#xff0c;所以是基于链路&#xff0c;而不是基于网段&#xff0c;它实现了拓扑和网络的分离。另外&#xff0c;支持一个链路上多个进程&#xff1b;支持泛洪范围标记和泛洪不识别的报文&#xff08;ospfv2 的行为是丢弃&…

python 原型链污染学习

复现SU的时候遇到一道python原型链污染的题&#xff0c;借此机会学一下参考&#xff1a; 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…

入栈操作-出栈操作

入栈操作 其 入栈操作 汇编代码流程解析如下&#xff1a; 出栈操作 其 出栈操作 汇编代码流程解析如下&#xff1a;

C++ 多态:面向对象编程的核心概念(一)

文章目录 引言1. 多态的概念2. 多态的定义和实现2.1 实现多态的条件2.2 虚函数2.3 虚函数的重写/覆盖2.4 虚函数重写的一些其他问题2.5 override 和 final 关键字2.6 重载/重写/隐藏的对比 3. 纯虚函数和抽象类 引言 多态是面向对象编程的三大特性之一&#xff08;封装、继承、…

Python数据可视化-第3章-图表辅助元素的定制

教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第3章-图表辅助元素的定制 本章主要介绍了图表辅助元素的定制&#xff0c;包括认识常用的辅助元素、设置坐标轴的标签、设置刻度范围和刻度标签、添加标题和图例、显示网格、添加参考线和参考区域、添加注释文…

springboot实现异步导入Excel的注意点

springboot实现异步导入Excel 需求前言异步导入面临的问题实现异步如何导入大Excel文件避免OOM&#xff1f;异步操作后&#xff0c;如何通知导入结果&#xff1f;如何加快导入效率&#xff1f;将导入结果通知给用户后&#xff0c;如何避免重复通知&#xff1f; 优化点完结撒花&…

Linux练习——有关硬盘、联网、软件包的管理

1、将你的虚拟机的网卡模式设置为nat模式&#xff0c;给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 #使用nmtui打开文本图形界面配置网络 [rootrhcsa0306 ~]# nmtui #使用命令激活名为 ens160 的 NetworkManager 网络连接 [rootrhcsa0306 ~]# nmcli c up ens160 #通…

论文阅读:GS-Blur: A 3D Scene-Based Dataset for Realistic Image Deblurring

今天介绍一篇 2024 NeurIPS 的文章&#xff0c;是关于真实世界去模糊任务的数据集构建的工作&#xff0c;论文作者来自韩国首尔大学 Abstract 要训练去模糊网络&#xff0c;拥有一个包含成对模糊图像和清晰图像的合适数据集至关重要。现有的数据集收集模糊图像的方式主要有两…