Java-面试题


提示:以下是本篇文章正文内容,下面案例可供参考

一、示例

1.能介绍一下你做过的项目吗?

2.ConcurrentHashMap 是线程安全的吗?为什么是安全的?

ConcurrentHashMap 是线程安全的。ConcurrentHashMap 通过使用分段锁(或更细粒度的 CAS 操作)、Node 节点、线程安全的扩容机制和优化的哈希函数等机制,实现了线程安全性。这使得它能够在高并发环境下提供高效的并发性能。

3.hashmap是如何解决hash冲突的

HashMap 在 Java 中解决哈希冲突的方法主要采用了链地址法(也称为拉链法)。当两个或更多的键根据哈希函数计算出相同的哈希值(即哈希冲突)时,HashMap 不会简单地用一个值替换另一个值,而是将这些具有相同哈希值的键值对存储在一个链表中。

总结来说,HashMap 通过链地址法(即拉链法)和在某些情况下使用红黑树来解决哈希冲突,从而实现了高效的键值对存储和查询。

4.使用过threadlocal吗?使用过程中要注意些什么

ThreadLocal 是 Java 提供的一个类,它提供了线程局部变量。这些变量与其他变量不同,因为每一个访问这个变量的线程都有它自己的独立初始化的变量副本。在多线程环境中,这可以用来存储线程特定的数据,而不需要担心数据不一致或同步问题。

在使用 ThreadLocal 的过程中,需要注意以下几点:

  • 内存泄漏:ThreadLocal 的一个常见问题是内存泄漏。当 ThreadLocal 对象不再被引用,并且当前线程试图访问它时,由于 ThreadLocalMap 的键是弱引用(WeakReference),因此 ThreadLocal 对象会被垃圾回收。但是,如果 ThreadLocalMap 的值(即线程局部变量)是强引用,并且这些值很大或者数量很多,那么它们可能不会被及时回收,从而导致内存泄漏。为了避免这种情况,应该在使用完 ThreadLocal 后调用 remove() 方法手动清理。
  • 线程池与 ThreadLocal:当使用线程池时,线程的生命周期可能很长,这意味着 ThreadLocal 变量可能会在很长一段时间内都保持活动状态。因此,在使用线程池时,需要特别小心 ThreadLocal 的使用,确保在不再需要时调用 remove() 方法。否则,可能会出现内存泄漏或意外的数据保留。
  • 线程安全问题:虽然 ThreadLocal 本身是线程安全的,但它并不能保证线程中其他变量的线程安全性。因此,在编写多线程代码时,仍然需要注意其他变量的线程安全性问题。
  • 继承问题:如果一个类继承了使用 ThreadLocal 的类,并且重写了 ThreadLocal 的访问方法(如 get() 或 set()),那么可能会出现意外的行为。因此,在设计和使用 ThreadLocal 时,需要避免这种情况。
  • 清理资源:在使用 ThreadLocal 存储资源(如数据库连接、文件句柄等)时,需要确保在不再需要时及时清理这些资源,避免资源泄漏。
  • 避免过度使用:虽然 ThreadLocal 可以简化多线程编程中的某些问题,但它并不适用于所有情况。过度使用 ThreadLocal 可能会导致代码变得难以理解和维护。因此,在使用 ThreadLocal 之前,应该仔细考虑是否真的需要它。
  • 避免静态 ThreadLocal:尽量避免在静态字段中引用 ThreadLocal 实例,因为这可能导致类加载器泄漏和内存泄漏。相反,应该将 ThreadLocal 实例作为非静态字段创建,并在需要时传递给其他方法或类。

5.能详细说说为什么tcp连接是三次而不是四次?

  • 简化连接过程:三次握手已经足够完成连接建立所需的必要操作。通过三次握手,客户端和服务器可以确认彼此的可达性和通信能力,同时同步双方的初始序列号,为后续的数据传输做好准备。四次握手虽然可以提供更多的确认步骤,但在TCP连接建立的过程中并不是必需的。
  • 避免历史连接:三次握手的一个重要目的是为了防止旧的重复连接初始化造成混乱。在网络中,可能会出现客户端发送的连接请求因为网络问题而延迟到达服务器的情况。如果服务器只进行两次握手,那么可能会错误地将过时的连接请求当作新的请求来处理,从而建立了一个无效的连接。通过第三次握手,客户端可以确认服务器的响应是针对自己最新的连接请求,从而避免了历史连接的问题。
  • 提高效率:使用三次握手可以在保证连接可靠性的同时提高连接建立的效率。在网络通信中,每次通信都需要消耗一定的时间和资源。通过精简连接过程,可以减少不必要的通信开销,提高网络资源的利用率。

6.事务的隔离级别有哪几种

事务的隔离级别主要有四种,它们是:

  • 读未提交(Read Uncommitted):这是最低的隔离级别。一个事务可以读取另一个尚未提交的事务的数据。这种级别可能导致脏读、不可重复读和幻读。
  • 读已提交(Read Committed):一个事务只能读取已经提交事务所做的数据修改。这种级别可以防止脏读,但可能出现不可重复读和幻读。它是大多数数据库系统的默认隔离级别(例如SQL Server)。
  • 可重复读(Repeatable Read):对同一字段的多次读取结果都是一致的。这是MySQL的默认事务隔离级别。它可以防止脏读和不可重复读,但幻读仍有可能发生。
  • 可串行化(Serializable):最高的隔离级别。所有的事务依次逐个执行,这样事务之间就不可能产生干扰。这种级别可以防止脏读、不可重复读以及幻读。但是,这将严重影响程序的性能。因为所有的事务依次逐个执行,这样事务之间就不可能产生干扰。

7.数据库的索引你了解吗?什么是非聚簇索引和聚簇索引?

数据库的索引是数据库中一种重要的数据结构,其作用类似于图书的目录,可以加快对表中数据的检索速度。每张表只能建一个聚簇索引,当在InnoDB表中定义一个主键时,该主键默认就会成为聚簇索引。

聚簇索引和非聚簇索引的主要区别在于数据存储方式、唯一性和查询效率。聚簇索引将数据按照索引顺序存储在磁盘上,查询效率高但唯一性强;而非聚簇索引将索引和数据分开存储,可以有多个且查询效率相对较低。在数据库设计和优化时,需要根据实际需求选择合适的索引类型。

8.你了解aop和ioc吗?aop你们在哪些场景使用了

  • AOP(面向切面编程)是一种程序设计范型。AOP的使用场景包括权限验证、事务管理、日志操作记录、异常处理、性能监控等。通过使用AOP,可以将这些横切关注点与业务逻辑代码分离,提高代码的模块化和可重用性。

  • IoC(控制反转)是一种软件设计思想,它将程序的控制权从程序内部转移到外部容器,实现了程序的松耦合和可扩展性。IoC的原理是通过依赖注入和依赖查找来实现的。IoC的应用场景主要涉及以下几个方面:

  1. 管理对象依赖关系:IoC容器可以自动注入对象之间的依赖关系,避免手动创建对象并传递依赖,减少代码的耦合度,提高代码的可读性和可维护性。
  2. 管理对象的生命周期:IoC容器可以管理对象的生命周期,当一个对象不再被使用时,IoC容器可以自动销毁它,释放资源,避免内存泄漏等问题。
  3. 管理配置信息:IoC容器可以将配置信息和代码分离,将配置信息集中管理,降低代码和配置的耦合度,便于维护和修改。

9.缓存你用过吗?你在使用缓存的过程中有遇到过哪些问题,你是怎么解决的呢?

缓存是一种存储数据的技术,通过将经常访问的数据保存在临时存储器中,以便将来需要时可以更快地获取。这样可以减少数据访问的时间和成本,提高系统的性能和响应速度。

在使用缓存的过程中,我遇到过以下一些问题:

  • 缓存穿透:这是指查询一个数据库和缓存中都不存在的数据,导致每次查询都会直接落到数据库上,增加了数据库的负载。为了解决这个问题,我采用了布隆过滤器等技术,在查询前先判断查询的数据是否存在于缓存或数据库中,如果不存在则不进行后续查询操作。
  • 缓存击穿:当某个热点数据过期或者被删除时,大量的请求同时进入数据库获取数据,导致数据库压力过大。为了解决这个问题,我添加了互斥锁或者使用分布式锁,确保只有一个请求去数据库中查询数据,其他请求则等待并使用缓存中的旧数据。
  • 缓存雪崩:在缓存重启或者大量缓存集中在某一个时间段失效时,大量的请求直接访问数据库,导致数据库压力过大。为了应对这种情况,我采用了多种缓存策略,如设置缓存过期时间时加入随机值、设置缓存永不过期、利用Redis的持久化机制等。

10.我看你简历上使用了spring cloud,能聊聊为什么要用微服务架构吗?

使用Spring Cloud和微服务架构的原因有多方面,以下是其中的一些关键点:

  • 复杂性管理:随着应用程序的增长和复杂性的增加,传统的单体应用架构变得难以管理和维护。微服务架构通过将大型应用程序拆分为一系列小型、独立的服务,使得每个服务都可以由不同的团队独立开发、测试、部署和扩展,从而简化了复杂性管理。
  • 技术异构性:微服务架构允许使用不同的技术栈和语言来构建服务,这使得团队可以根据其专长和项目的需求选择最适合的技术。Spring Cloud作为微服务架构的框架,提供了丰富的工具和库来支持各种技术栈,如Java、Spring Boot等。
  • 可扩展性:微服务架构的每个服务都可以独立扩展,这意味着可以根据需要增加或减少特定服务的资源。这种灵活性使得系统能够更好地应对流量峰值和低谷,同时保持较低的总体成本。
  • 容错性:在微服务架构中,如果某个服务出现故障,其他服务仍然可以正常运行。此外,通过使用Spring Cloud的断路器(Hystrix)等组件,可以隔离故障服务,防止其影响整个系统。
  • 快速迭代和交付:由于微服务架构允许独立开发和部署服务,因此可以更快地迭代和交付新功能。这使得团队能够更快地响应业务需求,并保持竞争优势。
  • 服务重用:微服务架构鼓励创建可重用的服务。通过将通用功能封装为服务,可以在多个应用程序之间共享这些功能,从而减少了重复工作并提高了开发效率。
  • 便于测试和部署:由于微服务架构的每个服务都是独立的,因此可以单独测试每个服务。此外,使用容器技术(如Docker)和持续集成/持续部署(CI/CD)工具可以更容易地部署和更新服务。
  • 支持云原生应用:微服务架构与云原生应用高度契合。通过将服务拆分为更小的单元,可以更轻松地将其部署到云环境中,并利用云的弹性、可扩展性和自动化特性。

综上所述,使用Spring Cloud和微服务架构可以帮助企业更好地管理复杂性、提高可扩展性和容错性、加速迭代和交付速度,并支持云原生应用的发展。这些优势使得微服务架构成为当今许多大型企业和初创公司的首选架构。

二、知识库(TODO)

1.java

jvm

spring

2.mysql

性能优化

3.redis

缓存机制

4.linux

DevOps

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里 Jess

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值