2023-04-14_面试题复盘笔记(76)

一、腾讯云智二面

1、问项目,问的很多,还问怎么优化,怎么提升效率

可以考虑以下优化方式:
1.使用缓存来减少数据库或网络 I/O 操作
2.优化 SQL 查询语句,包括索引优化、优化查询条件、查询的字段等
3.避免在循环体内创建对象、字符串拼接等耗费系统资源的操作
4.使用多线程来处理并发请求
5.使用分布式缓存来减轻服务器负载
6.对代码进行重构和优化设计
7.使用算法和数据结构来优化查询和计算效率
8.调整服务器的配置和参数来达到最优性能

2、数据库SQL注入

数据库SQL注入是指攻击者通过在输入框等可输入的地方,输入SQL语句,让后台数据库执行该语句,从而达到非法窃取或篡改数据的目的。为了防范SQL注入攻击,应该对用户输入的数据进行过滤和校验,对特殊字符进行转义或编码处理,使用预处理语句,不要直接拼接SQL语句等措施。

3、框架中底层怎么解决SQL注入(PrepareStatement?)

Java语言的相关框架通常使用参数化查询来解决SQL注入问题。通过使用参数化查询,程序将用户输入的数据作为查询参数而不是拼接成SQL语句的一部分,从而避免了恶意用户输入恶意代码的风险。同时,还可以使用一些安全性更高的持久层框架,如MyBatis与Hibernate,它们在数据处理方面都提供了可靠的保护策略。

4、SQL索引,最左前缀法则

索引是数据库中非常重要的优化技术之一,可以提高查询效率。在使用索引的过程中,最左前缀法则是一条非常重要的原则。它指的是对于复合索引(即包含多个属性的索引)来说,从左到右依次使用它的属性作为查询条件,可以获得最佳的查询效果。这是因为数据库引擎可以利用这个顺序对索引进行快速匹配,从而加快查询速度。同时,建立正确的索引也是提高数据库性能的重要手段之一。

5、场景题:10张票,1w个人同时抢,怎么整,说了消息队列让展开讲

如果有10张票,1w个人同时抢,可以通过以下的方式进行处理:

使用分布式锁,避免多个用户同时竞争同一个票的情况。
将票数分配到多个实例中,让每个实例处理一部分票的抢购请求,以减轻单个实例的负担。
在抢票前,让用户先进行实名认证,并规定每个人只能抢购一张票,避免用户通过多个账号进行非法抢购。
在高峰期使用 CDN 技术,加速用户的访问速度和抢票的处理速度。
举例来说,假设有一个 Java 开发的抢票系统,该系统已经部署在多台服务器上,并且各个服务器之间使用 Redis 进行分布式锁的控制。当用户进行抢票时,系统首先对该票进行锁定,避免其他用户同时竞争。然后,系统会根据用户的位置、网络状况等因素,自动分配一个最优的服务器进行处理。如果该服务器已经达到处理能力的上限,系统会自动将用户分配到其他服务器上,以避免出现拥堵的情况。最后,系统会将票的状态进行更新,并将处理结果返回给用户。

CDN技术是一种内容分发网络技术,目的是提高网络内容的访问速度和用户体验。通过部署全国或全球各地数据中心,将网络内容缓存到离用户最近的数据中心,以提高网站访问速度,降低网络负载,从而优化用户体验的同时减少成本。

6、微服务相关

7、分布式锁实现

Java语言中有多种分布式锁实现方式,常见的有基于数据库、Redis和Zookeeper实现的分布式锁。其中,基于Redis实现分布式锁的方式相对简单,可以利用Redis单实例或Redis集群实现分布式锁,具体实现可以利用Redis的setnx(SET if Not eXists)命令保证分布式环境下只有一个客户端获取锁,利用expire命令设置锁的过期时间,同时用del命令释放锁。而基于Zookeeper实现的分布式锁相对复杂,需要利用Zookeeper的节点临时有序性和watch机制实现锁的获取和释放,特别适合于高并发、数据一致性要求相对高的场景。

二、阿里1688

1、Java的优势

Java作为一种跨平台的编程语言,具有良好的移植性和可扩展性,可以适用于不同的操作系统和设备。Java具有强大的面向对象编程特性、自动内存管理机制以及广泛的应用领域,如Web开发、企业应用、Android移动应用等。Java的开源生态系统也极为丰富,有着众多优秀的开源框架和工具支持,使得Java开发变得更加高效和便捷。

2、Java为什么快

Java 之所以被认为很快,一个原因是因为 JVM(Java虚拟机)具有优秀的即时编译器,可以将代码动态地编译成本地机器代码运行,这比解释执行的速度要快。另一个原因是 Java 程序是面向对象的,具有良好的封装和抽象能力,可以提高代码的可读性、可维护性和灵活性,进而增强了程序的效率和性能。此外,Java 还内置了大量的优化策略和技巧,例如垃圾回收机制、线程池、缓存等,能够帮助程序员提高代码性能。

3、怎么创建线程

可以创建一个类并继承Thread类,然后重写run()方法,在run()方法中编写线程执行的代码。另一种方法是创建一个实现了Runnable接口的类,并在这个类中实现run()方法,在创建Thread对象的时候将实现了Runnable接口的类实例化并传入Thread的构造方法中。

4、线程池了解吗

线程池是Java中的一个重要特性,它可以重复利用已经创建的线程,避免频繁地创建和销毁线程带来的开销。通过线程池可以提高程序的性能和响应速度,特别是当同时需要处理多个任务时。可以通过Java.util.concurrent包中的Executors工厂类来创建线程池,也可以通过ThreadPoolExecutor类自定义线程池的行为。线程池常常使用在网络编程、数据库操作和多线程任务等场景中。

5、spring怎么接受请求的(答通过注解@PostMapping)

Spring 可以通过 @RequestMapping 注解来接收请求,在该注解中可以指定 URL 和请求方法,同时可以通过 @RequestParam 注解来获取请求中的参数,还可以通过 @RequestBody 注解来接收请求体中的数据。

6、PostMapping底层了解吗

PostMapping是Spring框架中的一个注解,用于处理 HTTP POST 请求。它的底层实现是基于Java的反射机制和Spring的MVC框架。当使用该注解时,Spring会扫描应用程序中的控制器类以及这些类中带有该注解的方法,然后将它们映射到对应的URL上,接收并处理POST请求。

三、华为od java开发一面面经

1、RabbitMQ的消息丢失如何解决

对于消息丢失的情况,可以通过以下几种方式来解决:
持久化消息:在发送消息时设置消息的持久化属性,这样即使 RabbitMQ 重启或宕机,也能保证消息不会丢失。
生产者确认:保证消息在发送到 RabbitMQ 后成功接收,可以通过消息的生产者确认机制来实现。如果 RabbitMQ 在接收到消息后发送确认信息给生产者,生产者才能确定消息已经安全地发送到 Broker 上。
消费者确认:保证消息在被消费者消费之后才删除,可通过消息的消费者确认机制来实现。当消费者接收到消息后发送确认信息给 RabbitMQ,RabbitMQ会删除这条消息。
容错机制:设置 RabbitMQ 的备份队列,当主队列出现故障时,备份队列可以自动接管工作,保证消息不丢失。

2、AOP的实现和应用场景

AOP(面向切面编程)的实现可以采用代理模式,通过在目标对象的方法执行前后插入增强逻辑来实现,例如实现方法的日志记录、性能统计、安全控制等。AOP主要应用于企业级应用软件架构中,可以优化系统的架构、提高软件的可维护性和可拓展性、降低系统的耦合度等。常见应用场景包括事务管理、日志记录、权限控制、性能统计等。

3、数据库隔离级别,sql优化,索引的存储原理

数据库隔离级别指的是一个事务在执行时,对其他事务所做的影响程度。常用的隔离级别包括Read Uncommitted、Read Committed、Repeatable Read和Serializable等。SQL优化是指对SQL语句进行优化,以提高其执行效率。索引的存储原理一般是采用B+树等数据结构进行实现,通过对数据进行分块和排序,快速定位到需要的数据。

4、Redis的在自己项目中如何用的,处理了哪些问题

Redis是一个高性能的NoSQL键值存储系统,常用于缓存、队列、实时交互应用等场景。在项目中使用Redis可以帮助我们解决数据存储、读写性能、分布式锁、消息队列等问题。比如可以将热点数据放入Redis缓存中,减轻数据库负载,提高读取性能。还可以使用Redis实现分布式锁,避免并发问题。同时,Redis提供了丰富的数据结构,如string、list、set、hash等,我们可以根据实际情况选择使用。

5、Nacos心跳机制

Nacos心跳机制是通过客户端和服务端之间的长连接实现的。客户端定期发送心跳包到服务端,如果服务端在一定时间内没有收到客户端的心跳包,服务端将判定该客户端已经下线。

6、RPC是什么,Dubbo用的什么协议

RPC(Remote Procedure Call)是一种远程过程调用的协议,可以让程序在网络中的不同计算机上相互通信。Dubbo使用的协议是自定义协议,也称为Dubbo协议。它是一种高效、支持异步、传输快速的协议。

7、有没有研读过哪些源码源码(加分项,如Spring的循环依赖等)

循环依赖是指两个或多个 Bean 互相依赖,形成环状依赖的情况。Spring 容器在创建 Bean 时,一旦出现循环依赖,就会抛出 BeanCurrentlyInCreationException 异常。为了解决循环依赖问题,Spring 使用了三级缓存机制,即 earlySingletonObjects、singletonFactories 和 singletonObjects。通过在两个 Bean 之间设置中间继承的抽象类或接口,也可以解决循环依赖的问题。例如,通过在两个依赖关系中的一个 Bean 中使用 @Autowired(required=false),并将需要的 Bean 通过构造函数注入即可。

四、华为od java开发 二面面经

1、如何理解面向对象

面向对象是一种程序设计思想,它把现实世界中的事物看作是对象,每个对象都有自己的属性和方法,通过对对象进行封装、继承和多态等操作,实现代码的可复用性、可拓展性和可维护性。面向对象的设计可以有效地降低代码耦合度,提高代码的灵活性和可重用性

2、处理业务的类和定义实体的类的区别,为什么会有这种区别

在Java中,处理业务的类负责处理业务逻辑,而定义实体的类则负责描述具体的数据结构。这样做的好处是可以使代码更加清晰,易于维护和调试。同时也有助于提高代码的复用性和可读性。

3、Seata用的模式和工作机制,使用的负载均衡算法有哪些不足,如何优化

Seata使用的模式和工作机制是分布式事务,它的模式和工作机制是利用undo_log来实现分布式事务的原子性、一致性与持久性。其核心原理是将多个本地事务合并为一个全局事务,并保证所有本地事务要么一起提交,要么一起回滚,从而确保数据的一致性和完整性。 Seata使用的负载均衡算法有可能存在一些不足,如可能会导致不同事务请求在不同的节点上执行,导致不均衡的负载情况。为了优化这种情况,可以采用一些基于权重或Hash的负载均衡算法,或者增加节点数来达到负载均衡的状态。

4、logstash怎么监视数据库数据的

Logstash可以使用JDBC input插件监视数据库数据。该插件能够在Logstash中创建一个JDBC连接,然后执行自定义SQL查询语句,从而实现监视数据库并从中提取数据的功能。输入数据后,Logstash可以使用各种过滤器进行数据转换和处理,然后将数据输出到目标系统中。

五、恒生Java实习

1、jvm里面都有啥

JVM中有许多组件,比如ClassLoader、Java堆、Java栈、PC寄存器、方法区等等。其中,ClassLoader是JVM的类加载器,Java堆是用来存储Java对象的内存区域,Java栈则用于存储线程的方法调用栈,PC寄存器则用来保存线程执行的字节码指令地址,方法区则是用来存储类的元数据、常量池等信息的内存区域。

2、内存模型

JVM内存模型是指Java虚拟机运行时数据区域的划分。它包含了方法区、堆、程序计数器、本地方法栈和Java虚拟机栈等几个部分。其中堆是Java虚拟机管理的内存中最大的一块,被所有线程共享,在虚拟机启动时创建。程序计数器、本地方法栈和Java虚拟机栈都是线程私有的,生命周期与线程相同。方法区也是被所有线程共享的内存区域,用于存放类信息、常量、静态变量等数据。

3、堆里面都是存啥的栈里面有啥

JVM内存模型的堆里面存放对象实例和数组,而栈里面存储局部变量和方法调用的相关信息。

4、一个方法里面的局部变量是个引用类型,这个引用存在哪

一个方法里面的局部变量是存在栈内存里的,如果这个局部变量是引用类型,则引用指向的对象是存在堆内存里的。

4、最新的最常用的垃圾回收算法

目前常用的垃圾回收算法有标记-清除算法、复制算法、标记-整理算法和分代回收算法。而当前最常用的垃圾回收算法是分代回收算法,即将内存分为新生代与老年代,新生代使用复制算法,老年代使用标记-整理算法,以达到最优的垃圾回收效率。

5、怎么判断是否可以回收

Java虚拟机中,判断一个对象是否可以回收的方法是通过垃圾收集器对内存空间的扫描。如果发现一个对象没有被任何指针或者引用所指向,也没有被任何活动线程所持有,那么这个对象就可以被回收。Java虚拟机还提供了一种判断方式,叫做“可达性分析”。可达性分析的基本思想就是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为“引用链”,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

6、多表查询怎么优化

多表查询优化的常见方法包括以下几个方面:
1.调整查询语句,减少不必要的表连接,尽可能地利用索引来加速查询;
2.对频繁查询的列建立索引;
3.可以将大表拆分成多个小表,通过分表查询减轻负担并提高查询效率;
4.可以通过缓存来加速查询,将经常访问的数据存储在内存中,避免频繁的 I/O 操作;
5.调整数据库的配置参数,如增加内存、调整存储引擎等,以提高查询效率。

7、springmvc和springboot差别优缺点

Spring MVC是一个MVC框架,它基于Servlet API构建,并提供了一个大量的工具和类来帮助开发Web应用程序。而Spring Boot是一个快速开发框架,用于构建微服务,它大大简化了Spring的配置,并自动配置了很多常见的功能,如嵌入式服务器等。
Spring MVC的优点在于它有很多的扩展点,可以根据不同的业务需求定制。而Spring Boot的优点是它的快速起步、对开发人员的友好和自动化配置。
Spring MVC的缺点在于需要手动配置,而且重复性高。而Spring Boot的缺点是当需要自定义配置时,可能需要花费一些时间来了解其自动配置。
总的来说,Spring MVC更加灵活,适用于复杂的业务场景,而Spring Boot适用于快速开发和部署简单的微服务。

六、OPPO后端实习面试

1、微服务中你使用了哪些框架?

2、SpringCloud有哪些组件是认识的

3、各个服务模块之间怎么进行调用

各个服务模块之间可以使用接口调用的方式进行通信。比如,一个模块需要调用另一个模块提供的服务,可以先通过接口请求,然后等待响应结果。如果需要传递参数,可以在接口请求中添加参数信息。通常情况下,接口的设计需要满足业务需求,并考虑到接口的稳定性、安全性、易用性等因素。

4、Mysql有哪些引擎

Mysql有多个存储引擎可供选择,包括InnoDB、MyISAM、Memory等。这些引擎都有不同的特点和适用场景。

5、Innodb和MyISAM引擎的区别

Innodb和MyISAM是MySQL数据库中的两种不同引擎。其主要区别在于Innodb支持事务处理和行级锁定,而MyISAM不支持事务处理和只有表级锁定。Innodb适合处理大量的写操作,而MyISAM则适合处理大量的读操作。此外,Innodb支持外键约束、崩溃恢复和多版本并发控制等特性。

6、索引使用什么实现的?

索引通常使用B树和哈希表两种数据结构实现。B树适用于范围查询,而哈希表适用于等值查询。

7、为什么用B+树实现?

B树是一种高效的数据结构,它可以用于存储大量的、有序的数据。B树的特点是可以在磁盘等存储介质上进行快速的查找和修改操作,因此在数据库等需要处理大量数据的应用中广泛应用。B树的实现原理是通过将数据分成一系列节点,每个节点可以存储多个数据项,并将节点之间建立指针连接,从而实现快速的查找和修改操作。因此,B树是一种高效的数据存储方式,适用于处理大量的、有序的数据。

8、Mysql的事务隔离级别

MySQL的事务隔离级别有4种:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

9、Mysql的主从架构

Mysql的主从架构是一种数据复制方式,可以实现数据备份、读写分离等功能,主要由一个主库和多个从库组成,主库负责写入数据并将数据同步到从库,从库可以对数据进行读取操作。

10、在Mysql这方面还有什么了解的?

11、MVCC的原理还有实现原理

MVCC(多版本并发控制)的原理是在数据库的读写操作中,将数据按照时间版本进行保存,并且在读取时只读取已提交的版本,避免数据的并发访问产生的问题。实现原理是通过保存每个事务的开始时间戳和结束时间戳,以此来控制事务的并发,避免数据的读取和写入产生的冲突。这样可以提高数据库的并发性能和可靠性。

12、MVCC用的是悲观锁还是乐观锁

MVCC(多版本并发控制)使用的是乐观锁。

13、觉得自己在Java还有哪方面不好的

14、JVM内存结构

JVM内存结构由程序计数器、Java虚拟机栈、本地方法栈、堆和方法区五部分组成。其中程序计数器、Java虚拟机栈和本地方法栈是线程私有的,堆和方法区是为所有线程共享的。

15、JVM垃圾回收算法

JVM垃圾回收算法是Java虚拟机中的一个核心机制,用于管理动态分配内存的释放。常见的垃圾回收算法包括标记-清除、复制算法和标记-整理算法等。

16、JVM的垃圾回收器有哪些?

JVM的垃圾回收器主要包括Serial、Parallel、CMS、G1等几种。

17、CMS垃圾回收的过程

CMS垃圾回收的过程是采用并发标记清除算法,在垃圾回收期间运行,并行进行标记和清除操作,以减少回收暂停时间。具体过程包括初始标记、并发标记、重新标记和并发清除。初始标记阶段会暂停应用线程,标记GC Roots直接关联的对象,然后释放线程;并发标记阶段则是应用线程和回收线程并发执行,标记完整个堆,并记录下需要清除的对象;重新标记阶段是为了补偿并发标记期间应用线程继续运行而产生的标记漏洞,需要暂停应用线程重新标记,恢复并发模式;最后是并发清除啊阶段,清除未被标记的对象。

18、G1有了解吗?说一说相关的吧

G1垃圾回收器是一种新型的垃圾回收器,它采用了分代收集和标记-整理算法。它是一种面向多核处理器的,具有高效的垃圾回收性能的垃圾回收器。它主要通过对堆内存的划分、并发标记和并行清理等机制来实现高效的垃圾回收。

19、JVM调参

JVM调参可以从以下方面进行优化:
1.堆内存大小的调整
2.垃圾回收器的选择
3.线程栈的大小
4.元空间的大小
5.新生代与老年代的比例
6.并发收集时的线程数量
7.内存抖动的控制

20、实际项目中接口的并发量多高?

七、美团后端面经

1、项目中既用了 Kafka 又用了 RocketMQ,是怎么做技术选型的?他们的使用场景?

从技术角度来看,Kafka和RabbitMQ都是消息传递的中间件。Kafka适用于高吞吐量和分布式系统,RabbitMQ则更适合于处理大量的轻量级消息传递。
在选择使用哪种消息传递中间件时,应该考虑到具体的业务需求和环境。例如,在需要高吞吐量和低传输延迟的场景下,Kafka可能是更好的选择;而在需要处理大量的轻量级消息传递时,RabbitMQ则更加适合。

2、为什么用 redis 实现分布式锁,zookeeper 和 redis 怎么选择

Redis实现分布式锁的原理是通过SETNX命令,在Redis中将一个key存储为自定义的值。这个key在整个分布式系统中只能被一个客户端获取,获取后即可执行后续操作。当任务完成后,客户端可以删除这个key来释放锁。Zookeeper也可以实现分布式锁,其原理是在Zookeeper上创建一个唯一的临时顺序节点,并获取所有已创建的节点,判断自己创建的节点是否为序号最小的节点,如果是,则获取锁,执行任务。选择何种方式取决于具体业务场景,如果是高并发、数据量大的场景,建议使用Zookeeper,如果业务场景简单且数据量较小,则可以用Redis。

3、说一下项目中 ElasticSearch 使用场景

ElasticSearch 的使用场景非常广泛,可以用于以下几个方面:
1.搜索引擎:可以作为高性能的全文搜索引擎,支持实时搜索、相关搜索、聚合搜索等。
2.数据分析:可以作为统计分析工具,支持数据聚合、数据可视化等功能,可用于日志分析、业务分析等场景。
3.实时数据储存和检索:可以作为实时数据储存和检索工具,支持快速的数据写入和检索,可用于监控、实时报警等场景。
4.地理空间分析:支持对基于地理位置数据的搜索和聚合分析,可用于地图应用等场景。
5.其他应用:ElasticSearch 还可用于企业级搜索、推荐系统、全文搜索引擎、媒体分发等场景。

4、redis 的 hash 扩容,hashmap 怎么扩容,他们的对比

Redis的hash扩容是采用重新哈希的方式。当Redis的hash表的负载因子(已存储元素个数/表的大小)达到一定阈值时,就会启动扩容操作。扩容时,Redis会创建一个新的更大的table,然后将旧table中的所有元素重新哈希到新table中。在这个过程中,Redis仍然会维护旧table,同时会将新元素插入新table。当旧table中的所有元素都重新哈希到新table中后,才会删除旧table,最后标记新table为当前table。
HashMap的扩容则是当保存的元素数量到达容量的0.75倍时扩容,创建一个新的容器,容量是原来的2倍,然后将原容器的元素重新计算在内,放到新的容器的相应位置。HashMap的扩容过程与Redis的hash扩容非常相似。
为什么HashMap的扩容负载因子是0.75?
HashMap的扩容负载因子是0.75是为了在兼顾空间利用率和时间效率的情况下,尽量减少哈希碰撞(哈希冲突),从而提高HashMap的性能。当HashMap中的元素占据了哈希表的3/4时,就会触发扩容操作,将哈希表容量加倍,这样可以尽量减少链表长度,保证查询时间的稳定性和效率。这样做的好处是在保证使用更少的内存的同时,也能保证HashMap的查询、插入、删除等操作的平均时间复杂度为O(1)。

5、HashMap 的结构,红黑树作用?

HashMap 的结构是基于哈希表和链表实现的。哈希表将键映射到桶中,通过哈希函数将键值转化为桶的索引,对于键值相同的元素,使用链表将它们串联在同一个桶中,以避免哈希碰撞。
红黑树的作用是对桶中键值冲突的元素进行排序,使得HashMap在进行查找、插入和删除操作时,具有更好的平均性能。只有当链表中的元素达到一个阈值后,HashMap才会将链表转换为红黑树来提高性能。

6、说一下 Java 强引用、软引用、弱引用、虚引用

Java 强引用、软引用、弱引用、虚引用是 Java 中用于内存管理的关键概念。强引用是最常见的引用类型,当内存不足时,垃圾收集器不会回收强引用对象。软引用是引用对象不是必须的,但有助于提高程序的效率,当 JVM 内存不足时,垃圾收集器会回收软引用对象。弱引用是一种更弱的引用类型,当 JVM 内存不足时,垃圾收集器会非常快速地回收弱引用对象。虚引用相当于没有引用,它可用于在对象被回收时得到通知,但本身并不被垃圾回收器使用来确定对象的生死。

7、说一下 JVM 内存模型,本地方法栈和虚拟机栈区别?

JVM 内存模型中,本地方法栈和虚拟机栈都是 Java 线程的私有内存区域,但它们所存储的数据有所不同。虚拟机栈存储 Java 方法的执行信息,包括变量和方法调用等信息,而本地方法栈则是为本地(Native)方法服务的,存储与 Java 代码无关的信息,例如 C/C++等语言调用的方法信息。另外,虚拟机栈的数据存储在 Java 堆之中,而本地方法栈则是与 Java 堆无关的。

8、类加载过程

类加载过程是将class文件读入JVM中,经过验证、准备、解析、初始化等阶段,最终将类的信息放入方法区中。具体步骤如下:
1.Loading(加载):将class文件字节码读入JVM中。
2.Verification(验证):验证class文件字节码是否满足JVM规范要求,比如是否有未定义的指令等。
3.Preparation(准备):为类的静态变量分配内存,并设置默认初始值。
4.Resolution(解析):将类的符号引用转换为实际引用。
5.Initialization(初始化):执行类构造器方法(()),用于初始化类的静态变量和静态代码块。
6.Usage(使用):JVM开始执行程序,使用类的各种方法和变量来完成程序的功能。
总之,类加载过程是JVM将class文件读入并准备好类的各种信息,以便JVM能使用它们来执行Java程序。

9、垃圾回收机制,频繁 GC 怎么处理

对于垃圾回收机制和频繁GC的处理,可以做以下处理:
1.尽量减少对象的创建和销毁,对于一些经常需要创建和销毁的对象,可以考虑使用对象池来缓存和复用对象。
2.使用弱引用等一些形式的对象应用,避免对象之间互相引用,造成无法被回收的情况。
3.通过修改JVM的配置参数,调整GC的相关参数来控制Garbage Collection的频率和速度。

10、bean 生命周期

Bean 生命周期包括实例化、属性赋值、初始化、销毁等阶段。在容器启动时,根据配置文件或注解等方式创建Bean实例并进行属性赋值,然后进行初始化操作,生成可用状态的Bean。在容器停止时,进行销毁操作。常用的生命周期接口包括InitializingBean和DisposableBean。

11、说一下对 IOC ,AOP 的理解

Spring的IOC (Inversion of Control)是一种设计模式,它将对象的创建和依赖关系的管理从应用代码中抽离出来,交由Spring容器来完成。Spring容器在运行时通过读取配置文件或注解,自动完成对象的创建和依赖注入,使得应用代码更加简洁和可维护。
AOP (Aspect Oriented Programming)是另一种设计模式,它允许开发人员将应用程序的业务逻辑和横切性关注点(例如日志记录、认证等)分离开来。通过在代码中添加切面(Aspect),AOP能够实现对业务逻辑的控制和管理,提高代码的复用性和可维护性。Spring框架提供了对AOP的支持,开发人员可以使用Spring的AOP框架轻松实现AOP编程。

12、TCP 连接断开为什么要三次握手四次挥手

TCP协议中进行三次握手的目的是为了确认双方的通信能力和建立准确的连接状态,以确保数据的准确传输。其中,第一次握手是客户端向服务器发送连接请求报文段,第二次握手是服务器向客户端发送确认连接请求报文段,第三次握手是客户端再次向服务器发送确认连接请求报文段,确认连接成功。连接释放时进行四次挥手是为了确保数据的正常结束和断开连接。其中,客户端向服务器发送连接释放请求报文段,服务器向客户端发送确认连接释放请求报文段,服务器向客户端发送连接释放请求报文段,客户端向服务器发送确认连接释放请求报文段,完成连接的正常结束。

13、说一下 TCP 各种状态

TCP的各种状态有:
1.CLOSED:表示初始状态,没有打开连接或者已经关闭连接。
2.LISTEN:表示正在等待来自客户端的连接请求。
3.SYN_SENT:表示正在向服务器发送连接请求。
4.SYN_RECEIVED:表示服务器已经接受了连接请求。
5.ESTABLISHED:表示连接已经建立并且通信正常。
6.FIN_WAIT_1:表示客户端已发送连接关闭请求,等待服务器确认。
7.FIN_WAIT_2:表示客户端已接收到来自服务器对连接关闭请求的确认,等待对方断开连接。
8.TIME_WAIT:表示已经成功关闭连接,但是还需要等待一段时间来确保对方也已经关闭连接。
9.CLOSE_WAIT:表示服务器已经关闭连接,但是客户端还在继续发送数据。
10.LAST_ACK:表示服务器正在发送最后一个数据包,等待客户端确认。
11.CLOSING:表示一个TCP连接同时发送FIN和ACK,等待对方的ACK确认。

14、git merge , rebase 区别,rebase 的缺点

git merge和rebase都是将一个分支的变化合并到另一个分支上的命令。区别在于merge是将两个分支的变化合并成一个新的提交,而rebase是将另一个分支的变化移植到当前分支上,使得提交历史变得更加线性,看起来更清晰。

rebase的缺点在于它改变了提交历史。由于将另一个分支的变化移动到当前分支上,其中的提交信息和提交者也会随之变化,导致一些原有的提交历史信息丢失。另外,如果有多个人同时使用rebase,可能会出现提交历史冲突的情况,需要手动解决。

15、mysql 内连接,外连接,左连接,右连接

MySQL中连接是指将两个或多个表中的数据关联起来的过程。内连接(INNER JOIN)是指只返回两个表中共有的行;外连接(OUTER JOIN)是指返回两个表中所有行,且匹配不上的地方使用Null填充;左连接(LEFT JOIN)是指返回左表中所有行,且右表中匹配不上的地方使用Null填充;右连接(RIGHT JOIN)是指返回右表中所有行,且左表中匹配不上的地方使用Null填充。

八、字节暑期后端offer

1、Redis持久化、主从、zset和geo底层、红锁等等。

Redis持久化是将数据保存到磁盘上,以便在Redis重启或者宕机时能够恢复数据。主从模式是一种Redis的高可用方案,通过将Redis实例分为主节点和从节点,当主节点宕机时,从节点可以自动接替成为新的主节点。zset和geo底层是Redis中的数据结构,zset是有序集合,geo是地理位置集合。红锁是一种分布式锁的实现方式,可以处理多个Redis实例之间的锁竞争问题。

2、http的结构、tcp可靠传输、innodb和acid的关系。

HTTP是一种应用层协议,用于在客户端和服务器之间传输数据。TCP是一种传输层协议,提供可靠的端到端传输,并为HTTP提供了可靠的传输服务。InnoDB是MySQL数据库引擎的一种存储引擎,它支持ACID(原子性、一致性、隔离性和持久性)属性,确保数据库的完整性和一致性。因此,InnoDB和ACID是紧密相关的概念。

九、亚信面试

1、说说对泛型的理解

泛型是Java语言中的一个重要特性,它允许在编译时期对数据类型进行参数化,从而提高代码的复用性和安全性。通过使用泛型,我们可以定义一个具有通用性的数据结构或算法,同时保证元素类型的安全性和可读性。泛型的核心是参数化类型,即使用一个参数来代表具体数据类型,这个参数可以是任何类型的Java类、接口或者原生数据类型。在程序执行时,这个参数被用来确定参数化类型的真实类型,以保证类型的匹配和正确性。

2、反射

反射指的是在程序运行时动态获取一个类的信息,包括该类的方法、属性等,并且可以在运行时调用该类的方法或者修改其属性。通过反射,可以实现动态的创建对象、调用方法、访问属性等功能。在 Java 中,可以通过 Class 类来实现反射功能。

3、hashmap实现,线程安全吗,如何让线程安全

HashMap 是非线程安全的,但可以通过以下方式来使其线程安全:
1.使用 ConcurrentHashMap,它是线程安全的哈希表。
2.对 HashMap 进行加锁,保证同一时间只有一个线程可以操作 HashMap。
3.使用 Collections.synchronizedMap() 创建线程安全的 HashMap,它使用同步代码块来保证线程安全。

4、注解

Java的注解(Annotation)是Java语言提供的一种源代码级别的元数据,它能够提供给编译器、工具或者运行时环境更多的程序信息,从而来改变程序的行为。我们可以通过注解注释代码,以达到无需在程序中显式写出元数据的目的,从而提高程序灵活性和可维护性。

5、mysql索引,原理

MySQL索引是一种数据结构,它将数据库表中的数据进行排序,以便更快地搜索和访问数据。索引将表中的数据按照一定的规则存放,可以根据特定的字段(如ID、姓名、日期等)对表中的数据进行快速排序,并加速搜索、排序、连接等操作。MySQL索引的原理是使用B树或B+树等数据结构来存储索引,可以在不扫描整个表的情况下快速查找所需的行。索引的设计和使用需要根据具体情况进行优化,否则可能会降低数据库的性能。

6、jvm的内存结构了解吗

JVM的内存可以分为两个主要部分:堆和栈。堆是对象的存储区域,栈是执行线程的存储区域。在堆中,可以分为新生代、老年代和永久代。新生代中又可以分为Eden区、Survivor区。栈中存储的是方法调用,每个线程都有自己对应的栈,用于存储局部变量和操作栈。

7、序列化,以及它的作用

Java序列化是将Java对象转换为字节流的过程,以便可以将该对象在网络上传输或在不同计算机系统之间进行交互,同时还可以将对象存储到本地磁盘上。它的主要作用是在分布式系统中实现远程方法调用和网络传输,以及在持久化中保存对象,使得对象可以在服务器等其他应用程序中重新载入。

8、exception和error?

Exception和Error都是Java中的异常类型,但它们的地位和作用略有不同。Exception是程序中的可预见异常,一般由程序员自己处理或者使用try…catch语句捕获进行处理;Error是程序中的非可预见异常,通常是严重错误,包括JVM错误、线程死锁、堆内存溢出等,一般无法通过代码处理,需要进行相应的系统级别的处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值