java面经汇总

news2024/11/25 3:21:34

Java基础

  • 什么是字节码?
    jvm可以理解的代码(.class文件)
    Java代码从源代码到运行过程:
    java代码 -> javac编译器->.class字节码文件 -> 解释器&JIT(运行时编译器)->机器码
    JIT编译器会将热点代码的机器码保存下来
  • 什么是AOT编译模式
    直接将字节码编译成机器码,避免了JIT预热的时间,为什么不全部使用AOT,和Java语言的动态特性有关,有些技术需要修改.class文件
  • Java执行过程
  • 在这里插入图片描述
  • 成员变量和局部变量
    成员变量如果没有赋初始值会自动赋默认值,局部变量如果没有赋初始值则不会自动赋值
  • 重载和重写的区别
  1. 重载同一个类(或者子类和父类之间),方法名相同,参数类型不同,个数不同,顺序不同,放回值和修饰符可以不同
  2. 重写发生在运行期,是子类对父类允许访问的方法的实现过程重写,方法名、参数列表必须相同。返回值比重写前的更小或相同,异常范围更小或相同,访问修饰符更大或相同
  3. private/final/static方法不能被重写
  4. 构造方法不能被重写
  • 面向对象三大特征
    封装、继承、多态
  1. 多态的具体表现为父类的引用指向子类的实例
  • 接口和抽象类有什么共同点和区别?
    共同点:
  1. 都不能被实例化
  2. 都可以包含抽象方法
    区别:
    接口主要是对类的行为进行约束,提供一种规范。抽象类主要用于代码复用,强调所属关系。
    一个类只能继承一个抽象类,但可以实现多个接口

Java中只有值传递

  • 如果参数是基本类型的话,传递基本类型字面量值的拷贝
  • 如果参数是引用类型,传递的是实参引用对象在堆地址之中的拷贝

Java序列化和反序列化

在这里插入图片描述
序列化协议对应于应用层

Java代理模式

使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

动态代理机制

jdk动态代理机制:invocationHandler接口和proxy类是核心
invocationHandler接口定义jdk动态代理类,重写invoke调用原生方法,自定义处理逻辑
proxy获取代理对象的工厂类
缺点:只能代理实现了接口的类

CGLIB动态代理机制:MethodInterceptor 接口和 Enhancer 类是核心。
自定义 MethodInterceptor 并重写 intercept 方法,
通过 Enhancer 类的 create()创建代理类

java集合

在这里插入图片描述

collection

list

ArrayList是list主要实现类,底层使用object[],线程不安全
Vector,底层使用object[],线程安全
LinkedList,底层使用双向链表,线程不安全

ArrayList扩容机制分析:默认构造函数,初始容量10
扩容关键代码:int newCapacity = oldCapacity + (oldCapacity >> 1),扩容后为原容积的1.5倍左右,位移运算符比普通运算符快很多

set

HashSet、LinkedHashSet 和 TreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的。
hashset底层数据结构是哈希表(基于hashmap)、linkedhashset底层结构是链表和哈希表,先进先出。TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序

queue

Queue 扩展了 Collection 的接口,根据 因为容量问题而导致操作失败后处理方式的不同 可以分为两类方法: 一种在操作失败后会抛出异常,另一种则会返回特殊值。
Deque 扩展了 Queue 的接口, 增加了在队首和队尾进行插入和删除的方法,同样根据失败后处理方式的不同分为两类

ArrayDeque 和 LinkedList 都实现了 Deque 接口,两者都具有队列的功能,也可以用作栈
priorityQueue元素出列顺序与优先级相关

arrayDeque底层通过循环数组实现,是非线程安全的

MAP

hashmap 和hashtable hashmap线程不安全,table线程安全
基本不用hashtable
线程安全可以使用concurrenthashmap

hashmap默认大小16,扩容变为原来两倍,hashmap的扩容标准,阈值等于容量×加载因子,加载因子默认值是0.75
创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小
HashMap 总是使用 2 的幂作为哈希表的大小

HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)

treemap:拥有集合内元素搜索的能力以及根据键排序的能力

concurrenthashmap实现线程安全的方式:1.7的时候采用segment的方式,每把锁只锁一部分数据,segment继承了reentrantlock,可重入锁,segmengt的个数确定不可变在这里插入图片描述

1.8的时候 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作
在这里插入图片描述

java IO

设计模式

装饰器模式:在不改变原有对象的情况下拓展其功能
装饰器模式很重要的一个特征,那就是可以对原始类嵌套使用多个装饰器。
适配器模式:主要用于接口互不兼容的类的协调工作

常见的IO模型

  1. BIO同步阻塞IO模型
    在这里插入图片描述
  2. NIO
    同步非阻塞IO
    在内核准备数据和数据就绪阶段中,应用程序会一直read调用,不过在数据拷贝阶段中,线程依然阻塞。不过应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的。
    在这里插入图片描述
    IO多路复用
    线程发起select调用,等到内核数据准备好之后再发起read调用,read调用的过程依然阻塞,通过减少无效的系统调用,减少了对CPU资源的消耗
    在这里插入图片描述
  3. AIO
    异步IO基于事件和回调机制实现
    在这里插入图片描述

并发编程

为什么程序计数器、虚拟机栈和本地方法栈是线程私有的?
程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的

线程的生命周期和状态

在这里插入图片描述
sleep 和wait 方法对比
sleep()方法没有释放锁,wait释放锁
sleep是thread类的静态方法,wait是object类的本地方法,因为wait方法操作的的是对象实例

反复调用一个线程的start()方法是否可行

不行,threadStatus的变量。如果它不等于0,调用start()是会直接抛出异常的。,在调用一次start()之后,threadStatus的值会改变(threadStatus !=0),此时再次调用start()方法会抛出IllegalThreadStateException异常。

可以直接调用 Thread 类的 run 方法吗?

如果直接调用run方法的话并不是以多线程的方式执行:
new 一个 Thread,线程进入了新建状态。调用 start()方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 但是,直接执行 run() 方法,会把 run() 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

线程组和线程优先级

每个Thread必然存在于一个ThreadGroup中,Thread不能独立于ThreadGroup存在
threadGroup是标准的向下引用的树状结构,设计的原因是防止上级线程被下级线程引用而无法被垃圾回收

线程安全问题

活跃性问题

  1. 死锁
  2. 活锁
  3. 饥饿问题

性能问题

线程创建和上下文切换

java内存区域和内存模型

Java使用共享内存并发模型
1.内存可见性
针对共享变量,堆,为什么会有内存不可见问题,因为会在缓存区缓存共享变量
在这里插入图片描述
JMM通过控制主内存与每个线程的本地内存之间的交互,来提供内存可见性的保证。
指令重排:
编译器优化重排
指令并行重排
内存系统重排

线程池

通过threadPoolExecutor的方式创建线程池,不建议使用executors创建。
核心参数:
corePoolSize:线程池的核心线程数量
maximumPoolSize:最大线程数量
keepAliveTime:线程数大于核心线程数时的空闲线程最长存活时间
workQueue:等待队列

线程池饱和策略:
AbortPolicy:抛出异常RejectedExecutionException来拒绝新任务的处理
CallerRunsPolicy:调用执行线程运行任务
discardPolicy:不处理新任务,直接丢掉
discardOldestpolicy:丢弃最早的未处理任务

线程池提交一个任务的流程原理

在这里插入图片描述

几个对比
  1. runnable和callable:runnable不会返回结果或抛出异常,callable可以
  2. execute和submit:execute用于提交不需要返回值的任务,无法判断任务是否被线程池执行成功与否。submit会返回一个future类型对象,通过这个对象可以判断任务是否执行成功,通过future的get方法获取返回值

AQS

抽象队列同步器
主要就是为构建锁和同步器提供了一些通用功能的实现

核心思想:
AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁 实现的,即将暂时获取不到锁的线程加入到队列中。在 CLH 同步队列中,一个节点表示一个线程,它保存着线程的引用(thread)、 当前节点在队列中的状态(waitStatus)、前驱节点(prev)、后继节点(next)。
核心原理图:
在这里插入图片描述
AQS使用state变量表示同步状态

semaphore

可以用来控制同时访问特定资源的线程数量
具有公平模式和非公平模式

semaphore会默认构造state为许可的数量,然后state>=0的时候可以获取,小于0的时候不行,加入阻塞队列

一般用来限流

countdownlatch

CountDownLatch 允许 count 个线程阻塞在一个地方,直至所有线程的任务都执行完毕。CountDownLatch 是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当 CountDownLatch 使用完毕后,它不能再次被使用

实现原理也是初始化state为count,不同的是到state为0的时候才会执行
可以用来多线程读取多个文件的任务,对多个文件的结果需要汇总处理,这样countdown结束后才会执行后面逻辑

CLH队列锁

CLH是一个虚拟的双向队列,AQS将每个请求共享资源的线程封装成CLH锁队列的节点实现锁分配。
在这里插入图片描述

乐观锁的实现

版本号机制或CAS算法

常见并发容器

ConcurrentHashMap
copyonwriteArrayList

只对写加锁,内部copy数组

ConcurrentLinkedQueue

非阻塞队列,使用CAS

BlockingQueue

Atomic原子类

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

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

相关文章

球面坐标系下的三重积分

涉及知识点 三重积分球面坐标系点火公式一些常见积分处理手法 球面坐标系定义 球面坐标系由方位角φ\varphiφ、仰角θ\thetaθ和距离rrr构成 直角坐标系(x,y,z)(x,y,z)(x,y,z)到球面坐标系的(r,φ,θ)(r,\varphi,\theta)(r,φ,θ)的转化规则如下: {xrsin⁡φco…

使用Python脚本修改Maya ASCII文件路径方法

以下脚本修改当前项目路径和子文件夹中扩展名为“.ma”的所有文件,这样您就可以轻松地一次编辑所有文件。此脚本搜索特定字符串replace_This变量并将其替换为with_This,您可以使用它更改引用路径、纹理路径等… 话不多说直接上脚本: import…

JavaWeb-JavaScropt入门(二)

目录函数语法传参函数表达式作用域对象使用 字面量 创建对象 [常用]使用 new Object 创建对象使用 构造函数 创建对象函数 语法 function 函数名(形参列表) {函数体return 返回值; }那么有了创建函数,肯定有调用函数: // 函数调用 函数名(实参列表) …

聊一聊,我对DDD的关键理解

作者:闵大为 阿里业务平台解决方案团队 当我们在学习DDD的过程中,感觉学而不得的时候,可能会问:我们还要学么?这的确引人深思。本文基于工作经验,尝试谈谈对DDD的一些理解。 一、序 《阿甘正传》中&#xf…

亚马逊要求UL94防火测试阻燃测试标准及项目

UL94认证是什么?分几个等级?是如何表示各等级?带电的产品上架亚马逊都需要相关的UL报告,需要有ISO 17025资质的实验室出具的测试报告才能正常销售和恢复链接,UL94防火测试则是其中一项。UL94试验共有五种:1.B级的水平燃烧试验2.…

Nginx负载均衡

1、概念 访问量太大,一个 Tomcat 扛不住,所以就搭建 Tomcat 集群。让集群中的多个 Tomcat 服务器实例分担负载。 纵向扩容和横向扩容: 纵向扩容:给单台服务器提升硬件的配置。例如:提升 CPU、增加内存、扩大带宽、扩…

关于华为网络设备操作系统的介绍

1、什么是VRP VRP是华为公司数据通信产品的通用操作系统平台,作为华为公司从低端到核心的全系列路由器、以太网交换机、业务网关等产品的软件核心引擎。 功能:实现统一的用户界面和管理界面、实现控制平面功能,并定义转发平面接口规范、实现…

量子比特大突破!原子薄材料成为“救世主”

(图片来源:网络)量子计算是一项极其复杂的技术,现阶段的一些挑战正严重阻碍着它的发展,尤其是量子比特的小型化和质量问题。IBM计划在2023年实现具有1121个超导量子比特的处理器。以目前的技术手段,要达到这…

大数据框架之Hadoop:入门(二)从Hadoop框架讨论大数据生态

第2章 从Hadoop框架讨论大数据生态 2.1 Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通常是指一个更广泛的概念-Hadoop生态圈。 2.2 Hadoop发展历史 1&…

引入汇丰完成C+轮融资,镁信健康有何资本“魅力”?

近日,上海镁信健康科技股份有限公司(下称“镁信健康”)宣布完成C轮融资,引入汇丰集团作为战略投资者。镁信健康近两年是资本市场货真价实的“香饽饽”,2021年,完成B轮和C轮两轮融资,融资金额合计…

基于merlin使用chatGPT进行对话

最近chatGPT很热,大家都想试用它。但由于各种限制,一般情况下国内不能试用。 下面给大家介绍基于merlin使用chatGPT(目前每天只有11次问答次数)。 1 打开merlin页面 访问地址merlin.foyer.work,点击“add to chro…

深入Kafka核心设计与实践原理读书笔记第二章

1 生产者 生产逻辑 配置生产者客户端参数及创建相应的生产者实例。构建待发送的消息。发送消息关闭实列 参数说明 bootstrap.servers :用来指定生产者客户端链接Kafka集群搜需要的broker地址清单,具体格式 host1:port1,host2:port2,可以设置一个或多…

Sentinel-线程隔离和熔断降级

一、线程隔离 ​​​​ 总结 线程隔离的两种手段是? 信号量隔离线程池隔离信号量隔离的特点是? 基于计数器模式,简单,开销小线程池隔离的特点是? 基于线程池模式,有额外开销,但隔离控制更强 二…

为什么在容器中 1 号进程挂不上 arthas?

作者:卜比 本文是《容器中的 Java》系列文章之 4/n ,欢迎关注后续连载 😃 。 系列1:JVM 如何获取当前容器的资源限制? 系列2:Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题 系列3:让…

FPGA纯verilog代码实现图像对数变换,提供工程源码和技术支持

目录1、图像对数变换理论2、log系数的matlab生成3、FPGA实现图像对数变换4、vivado与matlab联合仿真5、vivado工程介绍6、上板调试验证并演示7、福利:工程代码的获取1、图像对数变换理论 对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细…

解决报错: ERR! code 128npm ERR! An unknown git error occurred

在github下载的项目运行时,进行npm install安装依赖时,出现如下错误:npm ERR! code 128npm ERR! An unknown git error occurrednpm ERR! command git --no-replace-objects ls-remote ssh://gitgithub.com/nhn/raphael.gitnpm ERR! gitgithu…

展锐UDX710:ProSLIC SI32185移植适配(未完待续)

一、SLIC基本流程图 在展锐UDX710平台上新增slic 驱动,可将应用代码置于source/unisoc/atrouter2.0下面,Si32185驱动代码放置于kernel,通过IOCTL对slic器件进行控制。整体流程如下图所示: 二、ProSLIC SI32185驱动调试 1. DTS 控制通路SPI0需增加一个spidev用于绑定对…

SpringCloud学习笔记03

目录 四十七、Hystrix是什么 四十八、Hystrix停更进维 四十九、Hystrix的服务降级熔断限流概念初讲 五十、Hystrix支付微服务构建 五十一、JMeter高并发压测后卡顿 五十二、订单微服务调用支付服务出现卡顿 五十三、降级容错解决的维度要求 五十四、Hystrix之服务降级支…

ReentrantReadWriteLock、StampedLock

ReentrantLock、ReentrantReadWriteLock、StampedLock 读写锁 一个资源可以被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。 小口诀:读写互斥,读读共享 锁的演变 无锁-----> 独占锁----->读写锁---…

为什么各个企业都在创建FAQ、常见问题页面?

常见问题解答页面是您可能已经为您的公司考虑过的东西,作为帮助客户回答有关您的产品和服务的常见问题的一种方式。但是您不知道最好的方法;肯定这只是一个问题清单吗?常见问题解答在整个购买过程中为客户提供支持,并减少客户需要与贵公司的联…