【Java开发面试】AHXX面试总结

news2025/7/19 21:01:50

1. java中常用的集合有哪些

java中常用的集合类有List,Set,Map,其中List和Set继承了Collection。
List的实现类有:ArrayList,LinkedList,Vector,Stack
Set的实现类有:TreeSet,HashSet
Map的实现类有:TreeMap,HashMap

注意:Queue是一个接口,继承Collection,由LinkedList实现。而Stack是一个实现类。

2. 接口和抽象类的定义,以及他们的区别

抽象类是对根源的抽象,而接口是对动作的抽象。

如果你要表示这个对象是什么,那就用抽象类,比如:男人和女人,他们的共性就是“人”,即可以抽象出来一个“人”的抽象类,然后让“男人”和“女人”继承他们就行。

如果要表示这个对象能干什么,那就用接口,比如:“吃饭”这个动作,人可以吃饭,狗也可以吃饭,所以就可以将"吃饭"作为一个接口,然后让其他的类去实现它就行。

抽象类的使用成本是比接口要大,因为抽象类要定义出子类的所有共性。而接口可以单独的定义一个动作。

其他具体的区别: 接口和抽象类的区别

3. HashMap数据的存储和扩容机制

3.1 存储过程:

  1. 先判断可以是否已经存在,如果存在就进行更行,如果不存在就进行下一步
  2. 将数据先进行存储
  3. 判断是否超过负载因子,超过的话就进行扩容,然后重新hash。
  4. 如果链表长度大于8并且桶的容量超过64,那就将链表进行树化,变成红黑树。

3.2 扩容机制

在Java当中,HashMap底层是由数组+链表+红黑树实现的。

桶的默认大下是16,负载因子是0.75,树化条件是:链表长度大于8并且桶的容量超过64。

即:

  1. 当初始化一个HashMap时,它的容量初始为0,当第一次插入元素时,他才会进行内存的分配,数组容量就变成16。
  2. 随着元素的插入,如果usedSize*1.0/ array.length>=DEFAULT_LOAD_FACTOR,那就进行扩容,即桶的个数变为原来的2倍。

3.3 扩展内容——hashMap当中的hashcode和equals的作用

HashMap确定下标位置
euuals判断key是否一样

在向HashMap中插入对象元素的时候,要对对象元素的hashcode和equals方法进行重写。

链接: HashMap原码分析

4. ConcurrentHashMap如何保证线程的(1.7和1.8)

4.1 jdk1.7中的ConcurrentHashMap

jdk1.7中的ConcurrentHashMap数据结构模型如下:
在这里插入图片描述
它是用 数组(Segment)+数组(HashEntry)+链表 的形式进行存储数据,在发送冲突时,他将用ReentrantLock锁对Segment数组元素进行上锁。

源码如下:
在这里插入图片描述

4.2 jdk1.8中的ConcurrentHashMap

jdk1.8中的ConcurrentHashMap数据结构模型如下:
在这里插入图片描述
它采用数组+链表+红黑树的形式进行数据的存储。

  1. 首先他会判断容器是否为空,为空的化,他就会采用CAS+volatile来进行初始化
  2. 当容器不为空,就根据存储的元素计算该位置是否为空。如果为空,就用CAS来设计该节点;如果不为空,就用synchronsized进行加锁

源码如下:
在这里插入图片描述

4.3 区别总结

  1. jdk1.7当中对Segment加锁是一种锁分段技术,而jdk1.8当中是对头节点进行加锁,它的粒度更小,发生冲突的概率也就更小。
  2. jdk1.7 用ReentrantLock锁对Segment来实现线程安全
  3. jdk1.8 用CAS和synchronsized来实现线程安全

5. Spring IOC 和 AOP

5.1 Spring IOC

  1. IOC就是控制反转,是指创建对象的控制权的转移。在Spring当中,可以将创建对象的控制权交给Spring容器,然后由容器根据配置文件去创建和管理各个实例之间的依赖关系。实现的手段有:DI依赖注入。
  2. 给人最直观的感觉就是:IOC让对象的创建不再需要去new,可以由Spring自动产生,使用Java反射机制,根据配置文件在Java运行时动态的去创建对象以及管理对象,并调用对象的方法。
  3. 实现方式有:构造器注入,setter注入,注解注入(Autowried,Resource)

作用:IOC的使用使得代码的耦合度降低

5.2 Spring AOP

  1. AOP即面向切面编程。与业务模块无关,但是为业务模块所共同调用的逻辑和责任提供统一的处理(事务处理,日志管理,权限控制 ),减少了系统的重复代码,降低了代码的耦合度。比如:事务处理,日志管理,权限控制
  2. SpringAOP是基于动态代理的,他有两种代理方式:JDK和CGlib。如果代理的对象实现了某个接口,那它就是用JDK动态的去创建对象,如果代理的对象没有实现某个接口,那它就是用CGlib动态的去创建对象。

6. Spring Bean的生命周期

  1. 产生
  1. 启动,准备容器
  2. 加载bean定义——扫描xml、注解,将定义的bean一个个先找到,然后放入Spring的一个容器集合当中
  3. createBean——构造对象,填充属性,初始化实例,注册销毁
    初始化则是将程序的执行权,从系统级别转换到用户级别,并开始执行用户添加的业务代码。在这里插入图片描述
  4. 用addSingleton方法将加载完的bean对象放入单例池,就可以被获取和使用了。
  1. 使用

  2. 销毁

  1. 执行@PreDestory注解的方法
  2. 执行destoryBeans注意销毁所有的bean
  3. 执行自定义的destoryMethod方法

7. JVM内存划分

JVM内存可划分为4个部分:分别是堆区,栈区,方法区和程序计数器。

堆区:存放new的对象
栈区:存放方法之间的调用关系,以及局部变量
方法区:存放类对象
程序计数器:相当于书签,存放下一条要执行的指令

8. 堆内存的老年代和新生代,以及分代算法的各个区的算法

在这里插入图片描述

  1. 新创建出来的对象,先放在伊甸区。
  2. 伊甸区的绝大部分对象都活不过一轮GC,活过一轮的对象就被复制(复制算法)到幸存区,这里需要复制的对象不多,所以幸存区不需要很大。
  3. 幸存区里面的对象,又会经历第二次GC,每一轮都会淘汰一些对象,幸存的对象被复制到另一个幸存区。这个过程既保留了复制算法的高效,无内存碎片的优势,同时也没有浪费太多的内存空间。
  4. 幸存区里面的对象,经历过几轮的GC之后,如果然后没被淘汰,就可以放到老年区当中。
  5. 老年区里面的对象,仍然会接受GC的洗礼,但是频率大大降低,此时就接受用标记-整理算法带来的效率问题。

9. 索引的分类,聚簇索引和主键索引在查询数据时的区别

索引一般有主键索引,唯一性索引,普通索引和组合索引,比较常用的就是主键索引和联合索引。

当一个表中有主键时,聚簇索引和主键索引是没有区别的;但是如果一个表中没有主键时,聚簇索引和主键索引就不一样了,因为这时的聚簇索引就依靠唯一性键或者6字节的row_id生成。

10. 主键索引和非主键索引的叶子节点在存储上有什么区别

11. 事务的特性,事务的隔离级别,mvcc的原理

11.1 事务的特性

  1. 原子性
  2. 一致性
  3. 持久性
  4. 隔离性

11.2 事务的隔离级别

  1. 读未提交
  2. 读已提交
  3. 可重复读
  4. 串行化

12. 不可重复读和幻读的区别

不可重复读强调的是:两次查找,结果不同是因为修改数据
幻读强调的是:两次查找,结果不同是因为新增数据

13. rdb和aof,redis断电后缓存会丢失,所以持久化到磁盘上,重启的时候,持久化文件是如何加载的?

rdb是指将内存中某一时刻的数据快照全量写入到指定的 rdb 文件的持久化技术。RDB 持久化默认是开启的。当 Redis 启动时会自动读取 RDB 快照文件,将数据从硬盘载入到内存,以恢复 Redis 关机前的数据库状态

aof是指 Redis 将每一次的写操作都以日志的形式记录到一个 AOF文件中的持久化技术。当需要恢复内存数据时,将这些写操作重新执行一次,便会恢复到之前的内存数据状态

14. 类加载机制

类加载分为三个步骤:

  1. 记载:将java字节码文件加载到内存中
  2. 连接
  1. 验证:验证加载的文件是否符合JVM的规范
  2. 准备:为类变量赋予零值,类变量如果被final修饰则直接赋予定义的值
  3. 解析:将符号引用转化为直接引用
  1. 初始化:为类变量赋值,为成员变量赋零值,执行静态代码块

15. @Autowried和@Resource的区别

  1. 来源不同:@Autowried来源于Spring框架,而@Resource来源于java。
  2. 依赖的查询顺序不一样: @Autowried先按照Type再按Name查询,而@Resource先按照Name再按Type查询。
  3. 支持的参数不一样:@Autowired 只支持设置 1 个参数,而 @Resource 支持设置 7 个参数;
  4. 依赖注入的方法支持不同:@Autowried支持构造方法注入、属性注入、setter注入;而 @Resource 只支持属性注入和setter注入

默认情况下,@Autowired 按类型装配 Spring Bean。如果容器中有多个相同类型的 bean,则框架将抛出 NoUniqueBeanDefinitionException, 以提示有多个满足条件的 bean 进行自动装配。z怎么解决这个问题,可参考: Spring 注解 @Qualifier 详细解析

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

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

相关文章

MySQL运维篇之读写分离

04、读写分离 4.1、介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。 通过Mycat即可轻易实现上述功能,…

02_Linux终端操作,shell命令,软件安装,文件系统结构,磁盘管理

目录 终端操作 常用Shell命令 Ubuntu软件安装方法 Ubuntu文件系统结构 绝对路径和相对路径 Ubuntn下磁盘管理 终端操作 打开终端快捷键Ctrlaltt 或鼠标右键 常用Shell命令 1.目录信息查看命令ls ls -a 显示目录所有文件及文件夹,包括隐藏文件,比如以.开头的 ls -l…

Synopsys Sentaurus TCAD系列教程之--Sprocess(SmallMOS_2D3D) 解析

SmallMOS_2D3D解析 #header## STI depth set sti_depth 0.15 ## Half STI width set sti_width sti_width ## Half gate length set gate_len <lg/2> ## SD length (from center) set sd_len [expr $gate_len0.05]#endheader## X lines line x location 0.0 spacing 0.…

OSI ARP TCP-IP HDCP

OSI七层参考模型分层名称基本功能应用层用户与网络、应用程序与网络的接口&#xff0c;直接向用户提供服务表示层处理用户信息的表示问题&#xff0c;如编码、数据格式转换和加密解密会话层组织和协调两个会话进程之间的通信传输层应用进程之间的连接&#xff0c;提供端到端的服…

Coremail邮件系统全新上线存档邮箱功能

邮箱积累邮件太多&#xff0c;搜索起来又慢又麻烦&#xff01; 我的重要邮件忘记下载丢失了&#xff01;14天自动删除太难了&#xff01; 有没有可能重要邮件自动存档&#xff0c;解救一下“遗忘星”人&#xff1f; 在我们日常工作中&#xff0c;邮件是最经常使用的办公工具之一…

Spark/Hive

Spark/HiveHive 原理Spark with HiveSparkSession Hive Metastorespark-sql CLI Hive MetastoreBeeline Spark Thrift ServerHive on SparkHive 擅长元数据管理Spark 擅长高效的分布式计算 Spark Hive 集成 : Hive on Spark : Hive 用 Spark 作为底层的计算引擎时Spark w…

【BOOST C++】组件编程(1)--动态链接库

一、说明 所谓组件工程&#xff0c;是指将某些功能函数&#xff08;类&#xff09;做成动态链接库的部分&#xff0c;在运行时调入。在调用功能类时&#xff0c;会调入、释放过程。因此&#xff0c;这里首先知道如何用动态链接库调入功能&#xff0c;然后知道如何才是组件。两个…

数字帆船VR虚拟体验教学有什么特色?

数字帆船VR虚拟体验教学是由广州华锐互动开发的一种应用VR虚拟现实技术的教学模式&#xff0c;通过VR技术&#xff0c;学生可以在虚拟的环境中模拟数字帆船的各个方面&#xff0c;包括横风航行、迎风航行、顺风航行等&#xff0c;在沉浸式的场景中获得更加真实的体验&#xff0…

ASEMI高压MOS管10N60参数,10N60特征,10N60大小

编辑-Z ASEMI高压MOS管10N60参数&#xff1a; 型号&#xff1a;10N60 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;600V 栅源电压&#xff08;VGS&#xff09;&#xff1a;30V 漏极电流&#xff08;ID&#xff09;&#xff1a;10A 功耗&#xff08;PD&#xff…

【Azure 架构师学习笔记】-Azure Storage Account(2)- Queue Storage

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account&#xff08;1&#xff09;-类型简介 前言 Azure Storage Queues 是一个专门用来处理基于云环境队列的Azure 服务。每个队列都维护着…

【(1+1+2+1+2+3+到1+2+3+到+n)】2023-3-5

缘由https://ask.csdn.net/questions/7895988鉴于初学知识储备不足认识模糊&#xff0c;这篇文章就从最基础的C知识入手&#xff0c;用详细资料来描述这个程序关联的知识&#xff0c;由于本程序使用一行语句完成运算&#xff0c;因此&#xff0c;将按运算符&#xff08;自左向右…

每天学一点之网络编程

网络编程 一、软件结构 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结构。常见程序有&#xff31;&#xff31;、迅雷&#xff0c;百度网盘。 B/S结构 &#xff1a;全称为Browser/Server结构&#xff0c;是指浏览器和服务器结构。常见浏览器…

go语言踩坑大全

文章目录1.左大括号 { 不能单独放一行2.未使用的变量3.未使用的 import4.简短声明的变量只能在函数内部使用5.使用简短声明来重复声明变量6.不能使用简短声明来设置字段的值7.覆盖了变量差错8.显式类型的变量无法使用 nil 来初始化9.直接使用值为 nil 的 slice、map10.map 容量…

CFS三层靶机安装与配置

CFS三层靶机安装与配置 环境下载 百度网盘 提取码&#xff1a;Chen 环境安装 下载完成后&#xff0c;有三个文件夹&#xff0c;每个文件夹对应一个靶机 进入三个文件夹&#xff0c;双击打开后缀为.ovf的文件&#xff0c;按提示安装虚拟机 环境配置 网段划分 target1&#…

LCMXO3L-1300E-5MG121C/LCMXO3L-1300E-5MG121I【FPGA】LCMXO3L-1300E-5MG256I嵌入式器件

LCMXO3L-1300E-5MG121C/LCMXO3L-1300E-5MG121I【FPGA】LCMXO3L-1300E-5MG256I嵌入式器件【说明】MachXO3设备系列是一个超低密度系列&#xff0c;支持最先进的可编程桥接和IO扩展。它具有突破性的IO密度和最低的每IO成本。设备IO功能集成了对最新行业标准IO的支持。MachXO3L/LF…

工作订单生命流程

1. Field Service 中最重要的流程是工作订单流程&#xff0c;以下是工作订单流程中重要的节点&#xff0c;如图1-1 图1-1 2. 图1-2 说明了构成工作订单流程的实体、属性和关系&#xff0c;本篇文章将重点围绕此图做示例介绍 图1-2 3. 工作订单流转流程如图1-3所示 图1-3 图1…

RLOAM/RO-LOAM

LOAM框架 LOAM框架包含三个步骤&#xff1a; Scan registration&#xff1a;从原始激光扫描点数据中提取点特征。点特征是角点或者面点。 odometry estimation&#xff1a;在特征提取之后&#xff0c;特征点传递到里程计模块&#xff0c;通过特征匹配和优化步骤计算相对坐标变…

像专业人士一样调试 JavaScript:查找和修复错误的工具和技术

介绍JavaScript 是一种功能强大的编程语言&#xff0c;用于创建交互式网页和动态用户界面。然而&#xff0c;与任何编程语言一样&#xff0c;JavaScript 代码可能包含错误&#xff0c;这些错误可能会导致意外行为、错误或崩溃&#xff0c;最重要的是&#xff0c;它会使您的生活…

Apollo提前加载问题

Apollo大家应该都有在项目中用到&#xff0c;我们项目也不例外&#xff0c;携程开源的非常好用的配置化平台。今天在搭建新服务的时候发现应为Apollo的配置导致服务启动失败&#xff0c;估次排查一下具体的原因顺便记录下来&#xff0c;翻边后面再次遇到可以查阅解决&#xff0…

Golang 中 sync/atomic 包的原子操作

背景 Go中多协程的情况下&#xff0c; 要保证操作的原子性&#xff0c;一般要使用RWMutex或者Mutex&#xff0c; 但是锁使用起来比较复杂&#xff0c;还要考虑lock 和unlock 顺序和成对出现&#xff0c;不注意就容易出错。 于是在sync/atomic包中&#xff0c;把我们常用的一些…