2023最新JAVA面试题---持续更新中

1.static关键字的理解

static关键字,修饰属性、方法和代码块。

  • 修饰属性:属性被static修饰后,就变成了静态属性,多个对象共享同一份数据。
  • 修饰方法:方法被static修饰之后,就变成了静态方法,可以直接通过类命调用,而不需要创建对象。
  • 修饰代码块:static代码块,随着类的加载而执行,只执行一次,并优先于非静态代码执行。

2.JVM(Java虚拟机)的了解

Java虚拟机(JVM)是一种虚拟机,用于执行包含java字节码的类文件。JVM的主要功能是确保JAVA应用程序在各种平台上都能正常运行。它做这一切的方法是通过编译java源代码为JVM字节码,然后在jvm上运行这些字节码。JVM通常是一种解释器,它以指令一次一次地执行指令,但也可以使用编译器将字节码转换为本地机器码,以提高性能。JVM还负责管理内存和垃圾收集,以防止内存泄漏和内存溢出。

JVM由三部分组成:类加载子系统、执行引擎和运行时数据区;

1)类加载子系统:可以根据全限定名来加载类或接口;

2)执行引擎:负责执行 被载入类的方法中的指令;’

3)运行时数据区:JVM需要内存来存储许多内容,例如字节码、对象、参数、返回值、局部变量、运算的中间结果等;jvm会把这些东西存储到运行时数据区中,以便管理。运行时数据区分为:方法区;堆;虚拟机栈;本地方法栈;程序计数器;

3.== 和equals的区别?

== 主要用于基本数据类型的值比较,引用类型比较的的内存地址是否相同;

equals没有重写时,比较的是对象内存地址是否相同,重写之后,比较的是对象内容是否相同;

4.final关键字的了解

final关键字,可以修饰类、方法、变量;

final修饰的类不能被继承;final修饰的方法不能被重写;final修饰的变量,值不能改变,为常量;

引用变量则内存地址不能改变,值可以改变;

5.String,StringBuilder,StringBuffer的区别?

String是不变的字符序列,字符串常量;StringBuilder和StringBuffer是可变字符序列,拼接字符串;StringBuilder的效率高,执行速度快,但是线程不安全;StringBuffer的效率低,执行速度慢,线程安全;

7.抽象类和接口的区别?

相同点:抽象类和接口都不能被实例化;

区别:抽象类可以被继承,有构造方法;接口不能被继承,没有构造方法;

一个类只能继承一个抽象类,但是可以实现多个接口;抽象类定义的关键字是abstract  class,接口定义的关键字是interface;

8.请你说说String类,以及New String()?

String类被final修饰,所以不能被继承。创建String对象可以用字符串直接赋值,值存到常量池中;使用New String("abc")创建String对象,回在堆内存中创建一个新的对象,值指向常量池,因为要在堆内存创建一个对象,所以new更耗费资源。

9.hashCode()和equals(),equals重写为什么一定会重写hashCode()方法?

hashCode()获取hash码的方法,equals对象比较的方法;

当两个对象相等,那么他们的hash码值一定相同;反之,如果hash码值相等,对象不一定相同;

由于hashCode()和equals具有联动关系,所以equals()方法重写时,hashCode()进行重写;

10.介绍一下包装类的自动拆箱和装箱.

自动装箱:把一个基本数据类型直接赋值给对应的包装类型;

自动拆箱:是指把一个包装类型的对象直接赋值给对应的基本类型;

通过自动装箱和自动拆箱功能,简化基本类型变量和包装类型对象之间的转换过程。

11.谈谈你对Spring IOC的理解,原理与实现。

SpringIOC是控制反转,即在应用开发中,有些对象的创建和依赖关系是由框架来控制和处理的,而不是由程序员自己手动创建和维护的。增强了代码的可重用性和可维护性。

SpringIOC容器是一个管理Bean的容器,它在配置文件中定义了所有的Bean,然后负责对它们进行创建、组装和管理。通过SpringIOC容器,我们可以轻松地将各个Bean需要的依赖注入到它们中间,同时也实现了松耦合。

 Spring IOC容器的主要核心是ApplicationContext接口,它是Bean Factory接口的子接口,具有更多的功能和扩展性。Spring通过读取配置文件或者注解的方式解析Bean,创建Bean实例并管理Bean或者调度Bean的生命周期。

简答:

1.SpringIOC 是控制反转,使用的基础是依赖注入的原理,即通过依赖注入将所需要的依赖关系注入到对象中。

2.Spring IOC是Bean容器,可以创建、组装、和管理Bean的容器。存储对象,使用map结构来存储,在Spring中一般存在三级缓存,singleObject存放完整的bean对象,

整个bean的生命周期,从创建到使用到销魂的过程全部都是由容器来管理。

  bean生命周期:

3.SpringIOC 容器的主要核心是ApplicationContext接口,它是BeanFactory接口的子接口,具有更多的功能和扩展性。

总之,Spring IOC是一种实现依赖注入的技术,将对象的创建、管理交给了Spring容器,从而减少了应用程序的耦合性,提高了系统的可维护性和灵活性。

DI:依赖注入,把对应属性的值注入到具体的对象中;@Autowired,populateBean完成属性值的注入。

12.谈一下SpringIOC的底层实现

spring IOC(控制反转)被实现为一个容器,即Spring容器。Spring容器是一个用于管理Bean的容器,它有一个IOC容器的集合来管理喝查询Bean,控制Bean的创建、生命周期、配置和删除等。

SpringIOC 的底层实现与设计模式紧密相关,主要包括以下几方面:

1.工厂模式,spring的Ioc容器实际上是一个Bean工厂,它负责创建,初始化和配置Bean.在Spring的Ioc容器中,Bean的创建过程中用了工厂模式,即使用工厂方法对Bean进行创建并返回工厂实例。

2.反射

Spring Ioc的底层使用了反射机制来创建和管理bean. Spring通过反射获取bean类的元数据信息,并在运行时创建Bean实例。反射让Spring容器能够动态地加载和配置Bean,使得Bean的创建和配置具有灵活性和可扩展性。

3.配置文件

Spring Ioc的配置信息通常通过xml配置文件进行配置。XML配置文件包含了Bean的定义和依赖关系,Spring容器可以通过解析配置文件来创建和管理Bean.

4.生命周期管理

Spring Ioc容器负责管理Bean的整个生命周期。当Bean被创建时,它会按照一定的顺序经历若干个生命周期阶段,包括Bean实例化、属性注入、对象初始化、后置处理等。Spring通过回调方法来管理Bean的生命周期,为开发者提供了更加灵活和可扩展的Bean生命周期管理方式。

5.AOP

SpringIoc的底层实现中还包括了AOP(面向切面编程)技术。AOP实质上是一种特定类的IOC,它通过动态代理实现了跨越多个对象的透明行为。在Spring中,Aop用于实现拦截器、事务、日志等功能,让应用更加灵活和可维护性。

综上所述,SpringIoc的底层实现是一个复杂的系统,它融合了工厂,反射,配置,生命周期和AOP等技术,为开发者提供了稳定、灵活和可扩展的Bean容器。

13.谈一下Spring Aop的底层实现原理。

aop是ioc的一个扩展功能,先有ioc,再有aop,aop只是在ioc的整个流程中新增的一个扩展点而已。:BeanPostProcessor

Spring AOP底层的实现原理主要是基于Java的动态代理机制和AspectJ编程语言.

Java动态代理机制是Java提供的一种动态代理对象的机制,它可以不用自己实现代理类,而是通过反射机制动态生成需要的代理类。Spring Aop利用了Java动态代理机制实现了对接口进行动态代理。

另外。SpringAop还支持使用AspectJ语法进行切面编程,它可以更细粒度地控制切面的实现。

总的来说,SpringAOP的底层实现原理是基于Java动态代理机制和AspectJ语言转换技术的,通过这些技术实现对切面的动态代理和控制。

13补充:什么是反射?或者什么是反射机制?

JAVA机制反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

14.描述一下Bean的生命周期

1.实例化:实例化Bean实例,并调用其无参构造函数。

2.属性设置:设置Bean的属性值,如果Bean实现了BeanNameAware、BeanFactory或ApplicationContextAware接口,容器将会调用相应的方法。

3.初始化:如果Bean实现了InitializingBean接口,将调用其afterPropertiesSet方法;

4.销毁:如果Bean实现了DisposableBean接口,将调用其destroy方法;

15.BeanFactory与FactoryBean有什么区别?

相同点:都是用来创建Bean对象的

不同点:使用BeanFactory创建对象的时候,必须要遵守严格的生命周期流程,太复杂了;如果需要简单的自定义某个对象的创建,同时创建完成的对象想交给spring来管理,那么就需要实现FactoryBean接口了。

16.Spring用到的设计模式

单例模式:Bean默认都是单例模式

工厂模式:BeanFactory,Bean容器SpringIOC创建实例化bean,就是工厂模式

代理模式: Spring Aop 底层就是通过动态代理实现的。

观察者模式:listener,event.multicast

适配器模式:Adapter

16.Spring的事务是如何回滚的

 问题:spring 的事务管理是如何实现的?

spring的事务是由AOP来实现的,首先要生成具体的代理对象,然后按照Aop的整套流程来执行具体的操作逻辑,正常情况下要通过通知来完成核心功能,但是事务不是通过通知来实现的,而是通过一个TransactionInterceptor来实现的,然后调用invoke来实现具体的逻辑。

   1.先做准备工作,解析各个方法上事务相关的属性,根据具体的属性来判断是否开始新事务

2。当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事务

3.执行具体的sql逻辑操作

4.在操作过程中,如果执行失败了,那么就会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollback方法来实现,实现的时候也是要先获取连接对象,通过连接对象来回滚

5.如果执行过程中,没有任何意外发生,那么通过commitTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法来实现的,实现的时候也是先获取连接,通过连接对象来提交事务

6.当事务执行完毕之后需要清除相关的的事务信息cleanTransactionInfo

如果需要更加细致 ,需要知道TransactionInfo,TransactionStatus.

Redis面试题

1.说一下你在项目中的redis的应用场景?

思路:1. 5大数据类型:String,list,set,Zset,hash
2. 基本上就是缓存
3. 为的是服务状态,延申思考,看你的项目有哪些数据结构或对象,在单机中需要单机锁,在多机中需要分布式锁。抽出来放入redis中;
4.无锁化

1.redis作为缓存

2.分布式锁

3.全局ID

int类型,incrby,利用原子性
​
incrby userid 1000
​
分库分表的场景,一次性拿一段

2.数据库与缓存不一致如何解决?

一般情况下,数据库与缓存不一致的原因是由于在更新数据库数据时,没有及时更新缓存导致的。为了解决这个问题,可以采取以下一些方法:
​
1. 双写模式:即在更新数据库时,同时更新缓存。这种模式需要更改应用程序的逻辑和实现,而且对于高并发和分布式系统来说,有一定的性能开销。
​
2. 定时更新缓存:周期性地定时重新加载缓存数据,以确保缓存数据与数据库数据保持一致。这种方法适合于数据更新频率较低的系统,但是会出现缓存数据的过期和更新延迟的问题。
​
3. 监听数据库变更:通过使用队列或消息机制,将数据库变更事件发送到缓存服务器,触发缓存数据的更新。这种方法需要引入额外的系统组件和技术,但是实时性更高,数据有效性更好,适用于数据更新频率较高的系统。

3.请聊一下Java的集合类,以及在实际项目中你是如何运用的?

Java的集合类是Java编程语言中的重要部分,它们是一组集合数据类型和接口,用于存储、处理和操作不同类型的数据。Java的集合框架提供了许多不同类型的集合类,例如List、Set、Map、Queue等等。

在实际项目中,我通常会使用Java集合类来存储和管理数据。例如,当我需要存储一些数据并按照顺序来访问它们,我会使用List类。如果我需要去重存储数据,并且不关心顺序,我会使用Set类。当我需要将键值对映射起来进行快速访问时,我会使用Map类。

另外,在使用Java集合类时,我也会注意性能方面的问题。例如,在需要遍历大型数据集时,我会选择使用迭代器而不是foreach循环,以提高代码的执行效率。并且,我还会使用泛型来确保类型安全,并将集合类的大小调整为预期大小,以避免在存储数据时浪费内存。

总的来说,Java的集合类是在日常编程中必不可少的工具,使用它们可以大大简化代码并提高程序的性能,我会根据不同的场景选择不同的集合类,并结合一些优化技巧,使得代码更加高效和易于维护。

4.HashMap为什么要用红黑树?

在jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8 的时候,将后面的数据存在红黑树中,以加快检索速度。

红黑树虽然本质上是一颗二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n).加快检索速率。

5.集合类是怎么解决高并发中的问题?

线程非安全的集合类 ArrayList LinkedList HashSet TreeSet HashMap TreeMap 实际开发中我们用这样的集合最多,因为一般我们自己写的业务代码中,不太设计到多线程共享共同一个集合的问题。

线程安全的集合类:Vector HashTable 虽然效率没有JUC中的高性能集合高。但是也能够适应大部分环境。

高性能线程安全的集合类:

1.ConcurrentHashMap

2.ConCurrentHashMap和HashTable的区别

3.ConCurrenrHashMap线程安全的具体实现方式/底层具体实现

4.说说CopyOnWriteArrayList

你对MySQL的慢查询优化有了解吗

MySQL的慢查询是指执行时间较长的SQL语句,在实际应用中可能会影响系统性能和响应时间。因此,针对慢查询进行优化是非常重要的。

以下是一些优化手段:

  1. 索引优化:对表的字段添加索引可以加快查询速度,但不宜过多添加,否则会影响插入和更新性能。
  2. SQL语句优化:避免使用SELECT *,尽量只查询需要的字段;优化JOIN语句,避免多表关联查询;使用EXPLAIN命令查看查询执行计划,找到查询的瓶颈。
  3. 数据库结构优化:尽量避免使用大量的文本字段,使用ENUM等类型代替VARCHAR类型;避免使用临时表。
  4. 服务器配置优化:增加内存、CPU等硬件资源;调整缓冲池大小等参数。

谈谈MySQL的事务隔离级别?

MySQL事物的隔离级别包括:

1. 读未提交(Read Uncommitted):允许脏读,一个事务可以读取到另一个事务未提交的数据。该级别性能高,但是不安全。

2. 读已提交(Read Committed):保证一个事务读取到的数据必须是已经提交的,避免了脏读,但是可能会出现不可重复读、幻读的问题。

3. 可重复读(Repeatable Read):保证一个事务在执行期间多次读取同一数据时,始终读取到同样的数据。避免了脏读、不可重复读的问题,但是可能会出现幻读的问题。

4. 串行化(Serializable):最高的隔离级别,事务需要序列化执行,避免了所有的并发问题,但是性能最差。

在MySQL中,默认的隔离级别是可重复读。开发人员可以使用SET TRANSACTION命令来显式的设置隔离级别。

UPD用户数据协议是什么?

UPD用户数据协议是一种用于网络通信的协议,UPD全称为User Datagram Protocol(用户数据报协议),是面向无连接的传输层协议之一。与TCP协议不同,UDP协议不进行连接的建立和断开操作,只是简单地将数据包发送出去。因此,它具有较低的时延和较小的包头开销,但也对数据传输的可靠性和完整性没有保障。在实时性要求较高的应用中,常常会使用UDP协议。UPD用户数据协议就是基于UDP协议,通过定义特定的数据格式和传输方式,来实现特定的需求,例如网络游戏、实时音视频传输等。

UDP协议的特点有什么?

UDP协议的主要特点如下:

1. 无连接:UDP协议不需要在数据传输前进行连接和握手,发送数据时也不需要等待接收方反馈确认信息。

2. 快速:由于无需建立连接,UDP数据包的处理时间更短,因此传输速度更快。

3. 轻量级:UDP数据包的头部信息非常简单,只包含源端口、目标端口、长度和校验值等基本信息,因此UDP协议的开销很小,适用于数据量小的场景。

4. 不可靠:UDP协议没有可靠性保障机制,数据包丢失或者损坏时无法恢复,而且数据包到达接收方的顺序也无法保证。

5. 广播和多播支持:UDP协议支持广播和多播,可以同时向多台计算机发送同一份数据,提高了网络传输的效率。

总体来说,UDP协议的优点是速度快、效率高、支持广播和多播;缺点则是可靠性差、无流量控制和拥塞控制机制。UDP主要应用于实时性要求较高的场景,如视频、音频等多媒体数据传输、在线游戏等领域。

sql语句的优化方法有哪些?

SQL语句的优化主要包括以下几个方面:

1. 选择合适的索引。索引是提高SQL查询效率的重要手段,需要根据具体情况选择合适的索引类型、字段,优化查询效率。

2. 缩小数据检索范围。通过优化查询条件,缩小检索数据集合的范围,可以有效减少查询时间。例如合理使用WHERE子句,避免使用通配符操作,防止全表扫描。

3. 优化查询语句的结构。尽量使用表连接查询,避免多次嵌套查询,减少SQL语句的复杂度和执行时间。同时,合理地布置SQL语句,可以有效利用数据库缓存和提高查询效率。

4. 表结构的优化。对表结构进行优化,如拆分大型表、合并多个小表、尽量避免使用大字段等,也可以提高查询效率。

5. 加速数据访问。使用缓存、预编译、事务控制等技术,加快数据访问速度,提高SQL查询效率。

总之,SQL语句的优化需要综合考虑多个因素,包括数据量、数据类型、具体操作等,针对具体场景进行优化才能最大限度地提升查询效率。

mysql索引失效的场景?

MySQL索引失效的常见场景包括以下几种:

1. 使用函数或表达式进行查询。在查询条件中使用函数、计算表达式等,会导致MySQL无法使用索引,从而导致索引失效。

2. SQL语句中使用OR关键字。当SQL语句中出现OR关键字时,MySQL可能会放弃使用索引,从而导致索引失效。此时可以考虑利用UNION操作来代替OR操作。

3. 对索引列进行类型转换。如果对索引列进行了类型转换,如将字符型字段转换为数字型,或者将日期型字段进行格式化等操作,也会导致索引失效。

4. LIKE操作以通配符开头的查询。在LIKE操作中,如果使用通配符(%或_)开头的查询,MySQL无法使用索引,只能进行全表扫描,从而导致索引失效。

5. 建立索引的字段被运算。如果建立索引的字段参与了运算操作,如加减乘除等,MySQL也无法使用索引,从而导致索引失效。

6. 数据表使用了过多的索引。有些开发者可能会觉得建立越多索引越好,实际上这样做可能会降低查询效率,如果使用过多的索引,MySQL会在索引之间频繁地切换,从而导致索引失效。

总之,MySQL索引失效是一个比较常见的问题,需要开发者们根据具体场景和数据情况综合考虑,并进行相应的优化和调整。

ribbitmq是什么?做什么用的?应用场景?

RabbitMQ是一款消息中间件,主要用于发送和接收消息。它遵循AMQP(高级消息队列协议)协议,可以进行高效的消息传递,并支持多种消息模式,如点对点、发布/订阅等。

RabbitMQ的主要作用如下:

1. 解耦系统之间的依赖关系:通过引入消息中间件,不同的系统之间可以松耦合地进行通信,减少系统之间的依赖关系,提高系统的可靠性和可扩展性。

2. 异步处理:通过异步的方式来处理消息,可以减轻系统的负载压力,提高系统的并发能力和吞吐量。

3. 数据缓冲:通过消息中间件将数据缓冲起来,可以降低系统的压力峰值,避免系统运行时出现数据处理不及时或者丢失的情况。

4. 消息分发:通过订阅与发布机制,消息中间件可以将消息发送到不同的队列或者主题中,实现消息的分发和路由功能。

RabbitMQ的应用场景非常广泛,如大数据流处理、在线支付、物流配送、社交网络、即时通讯等领域。对于那些需要处理大量实时数据的系统,使用RabbitMQ可以帮助这些系统高效地传递数据,提高数据处理的效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值