Java面试必问100题 背会了面试乱杀
文章平均质量分 53
憨憨崽&
Java程序员蓝颜 需要简历指导+ vv21241
展开
-
Java面试必问题53:(部署必学篇)Nginx作用 && Linux的常用命令 && Jenkins自动部署原理
Jenkins 通过提供一个可定制的、持续集成和交付的自动化流程,结合不同的插件和工具,实现了 Java 项目的自动化部署。nohup java -jar myapp.jar &(在后台执行名为"myapp.jar"的Spring Boot JAR文件)tail -n 10 file.txt(显示名为"file.txt"的文件的最后10行内容):将多个请求均匀的分配到多台服务器上,减轻每台服务器的压力,提高 服务的吞吐量。cat file.txt(显示名为"file.txt"的文件的内容)原创 2024-04-24 08:44:21 · 512 阅读 · 0 评论 -
Java面试必问题52:(高级面试篇)MongoDB的详细解释以及他的用法以及他跟Redis的区别以及优势
最简回答:MongoDB比MySQL快的原因在于它使用内存映射技术提高数据访问速度、支持多类型索引优化查询、具备分布式存储和查询能力,并且不需要复杂的关系模型,适用于大规模数据处理和非结构化数据存储的场景。最简回答:MongoDB的使用能够带来非结构化数据存储、高可扩展性和性能、灵活的开发过程、高可用性和容错性、强大查询功能以及活跃的社区支持和生态系统,适用于许多大规模数据处理和非结构化数据存储的应用场景。相比于关系型数据库,MongoDB不需要事先定义数据结构和关系模型,可以更加灵活地存储和查询数据。原创 2024-04-24 08:40:50 · 608 阅读 · 0 评论 -
Java面试必问题51:Seata分布式事务框架使用(高级理解)
二阶段是提交确认/回滚阶段,TC向所有参与者发送事务提交请求,参与者根据Undo Log进行事务提交,并向TC发送提交完成通知。最后,TC根据参与者的提交完成通知,发送最终的全局提交或回滚指令,参与者执行最终操作完成事务的提交或回滚。AT模式:效率较高、回滚机制通过发送回滚请求和Undo Log实现、通过两阶段提交协议实现最终一致性,一阶段提交请求阶段收集执行结果和Undo Log,二阶段提交确认/回滚阶段执行最终操作。在二阶段,参与者根据Undo Log进行提交或回滚操作,效率较高。原创 2024-04-23 13:58:01 · 476 阅读 · 0 评论 -
Java面试必问题50:ElasticSearch倒排索引详解
最简回答:ElasticSearch 的倒排索引是一种将词条和文档ID之间的对应关系反转存储的结构,通过快速定位包含特定词条的文档来提高搜索效率。综上所述,Elasticsearch的倒排索引通过存储词项和文档ID的对应关系以及使用紧凑的数据结构和内存缓存,实现了高效的搜索效率。倒排索引通过将文档ID与词项的对应关系反转,实现了从词项到文档的映射,从而方便快速定位包含特定词项的文档。Elasticsearch的倒排索引是一种高效的数据结构,存储了词条(term)和文档ID之间的对应关系。原创 2024-04-23 13:56:49 · 258 阅读 · 1 评论 -
Java面试必问题49:Xxl-Job原理分析 && 详细使用步骤以及为什么不使用SpringTask
相比于springTask,xxl-job具有更强的分布式支持和可扩展性,适用于复杂的分布式系统和大规模任务管理场景,而springTask更适用于简单的任务调度和单机环境。最简回答:xxl-job集成到Spring Boot工程中的使用步骤包括:添加xxl-job的依赖到构建文件中、配置xxl-job的参数,如调度中心地址和执行器名称,创建执行器类并注册为Spring的Bean,编写定时任务类并在项目启动时初始化任务调度器。xxl-job提供了一个简洁易用的任务管理界面,可以方便地配置和监控任务。原创 2024-04-22 09:44:53 · 640 阅读 · 0 评论 -
Java面试必问题48:(高级篇) RabbitMQ功能&&作用 以及他的详细使用方式
2. 消息去重:消费者应用程序在处理消息之前,可以在自己的系统中维护一个消息记录表,记录已经处理过的消息的唯一标识符。在接收到新消息时,先检查该消息是否已经处理过,如果已经处理过,则忽略重复消息。手动消息确认(Manual Message Acknowledgement):消费者在处理完消息后,发送确认回执给RabbitMQ,告知消息已被成功处理,RabbitMQ可以删除该消息。通过组合使用以上的措施,可以实现全方位的消息可靠性保证,减少消息丢失和处理错误的风险,并确保消息系统的高可用性和稳定性。原创 2024-04-22 09:41:08 · 1138 阅读 · 3 评论 -
Java面试必问题47:Gateway的路由断言工厂深入解析
在网关的路由配置里只需要在-Path中配置/user/**,那么以user开头的请求就会被网关处理,这是如何实现的呢?事实上,Gateway中有很多的路由断言工厂,当我们在配置文件中对断言进行配置后,这些配置就会被路由断言工厂进行解析并处理,而-Path配置就是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory来处理的。原创 2024-04-20 11:34:14 · 357 阅读 · 2 评论 -
Java面试必问题46:Gateway详解以及使用方法
最简回答:Gateway网关是一种API网关,具有路由、负载均衡、安全认证、限流熔断等特性,用于统一管理和分发请求,提高系统的可用性、安全性和可扩展性。网关可以根据请求的路由规则将请求转发到不同的服务实例,并提供过滤器机制来实现请求的加解密、鉴权、限流等功能。Gateway可以对请求进行监控和统计,记录请求的响应时间、流量等指标,方便分析系统性能和问题排查。6. 监控和统计:可以通过与监控工具集成,对Gateway的请求进行监控和统计,获取系统的性能指标。原创 2024-04-20 11:32:43 · 468 阅读 · 0 评论 -
Java面试必问题45:Hystrix的具体使用以及使用方法
总而言之,Hystrix的熔断机制通过监控服务请求的错误率,当错误率超过阈值时,快速切换到备用逻辑,避免了对失败服务的不必要请求,提高了系统的稳定性和可靠性。而Hystrix的熔断机制能够避免这种情况的发生,减少了对失败服务的依赖,提高了系统的稳定性。Hystrix是一个用于实现服务容错和熔断的库,在分布式系统中起到了保护系统免受服务故障的影响的作用。- 提高系统稳定性:通过熔断机制,当某个服务出现故障或不可用时,可以快速切换到备用的降级逻辑,保护整个系统免受服务故障的影响。原创 2024-04-19 09:07:06 · 343 阅读 · 0 评论 -
Java面试必问题44:谈谈Feign的工作原理
最简回答:Feign是一个声明式的Web服务客户端,通过定义Java接口来描述服务间的通信协议,包括URL、请求方法、请求参数等。当调用代理对象的方法时,Feign会根据方法的注解和参数生成HTTP请求,并发送给目标服务。总结起来,Feign的工作原理就是根据接口定义生成代理对象,通过代理对象发送HTTP请求给目标服务,并将响应解析为Java对象返回给调用者。当调用代理对象的方法时,Feign会根据方法的注解和参数生成HTTP请求,并发送给目标服务。目标服务处理完请求后,将响应返回给Feign客户端。原创 2024-04-19 09:05:32 · 398 阅读 · 0 评论 -
Java面试必问题43:Nacos作为注册中心的工作原理 && Nacos和Eureka的区别
最简回答:Nacos注册中心是一个服务注册与发现的工具,它提供了服务提供者将服务注册到注册中心,并让服务消费者从注册中心获取服务实例的能力。最简回答:Nacos和Eureka都是服务注册与发现组件,但Nacos比Eureka功能更丰富,除了服务注册与发现外,还提供了配置管理和服务治理功能。通过临时实例和心跳检查等机制,Nacos注册中心能够动态管理服务实例,自动剔除失去连接或不健康的实例,确保服务的可靠性和稳定性。注册中心根据服务名从存储的服务实例信息中找到对应的实例列表,并返回给服务调用者。原创 2024-04-18 10:24:28 · 621 阅读 · 0 评论 -
Java面试必问题42:Eureka工作原理
它通过服务注册,在启动时将服务实例信息注册到Eureka注册中心;通过服务发现,让消费者能够从注册中心获取可用的服务列表;总结起来,Eureka通过服务注册、心跳检测与续约、服务发现、负载均衡和容错处理等步骤来实现服务注册与发现的功能。服务消费者从Eureka注册中心获取注册的服务列表,并缓存在本地。它可以根据服务名称找到可用的服务实例。服务提供者在启动时,将自己的服务实例信息(包括名称、IP地址、端口号等)注册到Eureka注册中心。服务消费者使用负载均衡算法从本地的服务列表中选择一个服务实例进行调用。原创 2024-04-18 10:22:20 · 261 阅读 · 0 评论 -
Java面试必问题41:SpringCloud五大组件是哪几个 && SpringCloud 和 SpringBoot 的区别和关系
Spring Cloud 是关注全局的微服务协调整理治理框架以及一整套的落地解决方案,它 将 Spring Boot 开发的 一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理,服务发现,断路器,路由,微代理,事件总线等的集成服务。这五个组件是Spring Cloud中常用的核心组件,它们提供了一系列功能来简化构建分布式系统的工作,实现了服务注册与发现、负载均衡、服务调用、熔断和容错、网关等关键功能,极大地提高了分布式系统的可靠性和可用性。SpringCloud五大组件是哪几个。原创 2024-04-17 14:12:46 · 571 阅读 · 0 评论 -
Java面试必问题40:SpringBoot启动时都做了什么 && SpringBoot的核心注解是哪个?由哪些注解组成?
最简回答:Spring Boot启动时会加载配置文件(如application.properties)并扫描自动配置类(通过`spring.factories`),根据条件判断(如`@ConditionalOnClass`、`@ConditionalOnProperty`)自动配置各个组件,将它们注册到Spring容器中。最后,启动应用程序,处理请求,响应用户。根据`spring.factories`中配置的自动配置类路径,Spring Boot会扫描这些自动配置类,并将它们实例化。原创 2024-04-17 14:10:50 · 260 阅读 · 0 评论 -
Java面试必问题39:SpringBoot自动配置原理(必问)&& SpringBoot(优点)
它通过扫描类路径下的依赖、配置文件和注解等信息,结合Spring Boot提供的自动配置类和条件注解,根据条件判断自动配置哪些组件,然后将它们注入到Spring容器中。使用Spring Boot可以简化编码、简化配置、简化部署、简化监控、简化依赖坐标导入、简化整合其他技术,并提供强大的微服务支持,减少开发人员在搭建和配置项目上的工作量,使开发者能够更专注于业务逻辑的实现,快速构建可靠的、可扩展的应用程序。开发者可以通过自定义配置文件或者注解,覆盖或修改自动配置的行为,实现个性化的配置和扩展。原创 2024-04-16 08:55:38 · 474 阅读 · 0 评论 -
Java面试必问题38:SpringMVC执行流程(工作原理)(一般必问)&& SpringMVC的常用注解
View(视图):是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在 View 视图层输入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理。Model(模型):是程序的主体部分,主要包含业务数据和业务逻辑。在模型层,还会涉及到用户发布的服务,在服务中会根据不同的业务需求,更新业务模型中的数据。5.处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View 是逻辑上的View。原创 2024-04-16 08:51:21 · 386 阅读 · 0 评论 -
Java面试必问题36:Bean的几种注入方式 && Spring里AOP是什么以及他的应用场景
Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使 用JDK动态代理去创建代理对象;最简回答:在Spring中,AOP (Aspect-Oriented Programming,面向切面编程) 是一种编程范式,通过在不修改原有代码的情况下,将横切关注点(如事务管理、日志记录等)从核心业务逻辑中解耦出来,并在需要的地方进行统一的切面逻辑处理。构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。原创 2024-04-15 09:12:41 · 372 阅读 · 0 评论 -
Java面试必问题35:对于Spring里IOC深入解释如果回答 (本人理解为)
IOC容器就像是一个工厂一 样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是 如何被创建出来的。IOC 容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map(key, value),Map中存放 的是各种对象。最简回答:在Spring中,IOC (Inversion of Control,控制反转) 是一种设计模式,通过它,对象的创建和依赖关系的管理被交由容器负责,从而实现对象之间的解耦和灵活性的提升。简单说,就是由容器来控制对象的生命周期和依赖关系。原创 2024-04-12 15:47:41 · 552 阅读 · 0 评论 -
Java面试必问题34:ResultType 和 ResultMap 的区别 && MyBatisPlus的常用注解
如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属 性,通过 resultMap 手动建立对象关系映射,resultMap 要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来。该注解可以在实体类的字段上添加,表示该字段作为乐观锁的版本字段。:用于指定实体类的字段对应的数据库表的字段名。该注解可以在实体类的字段上添加,表示该字段映射到指定的数据库表字段。该注解可以在实体类的字段上添加,表示该字段作为数据库表的主键。原创 2024-04-12 15:45:31 · 553 阅读 · 0 评论 -
Java面试必问题33:MyBatis里#和{}区别&&MyBatis动态SQL
最简回答:在MyBatis中,# 用于参数的替换,并会进行预编译处理,以防止SQL注入,而 {} 则直接将参数值替换进SQL语句,性能较好但需注意SQL注入问题。- `#`符号适用于动态SQL值,如动态拼接表名、列名、排序方式等,这些值可能需要进行预处理转义以确保正确形成SQL语句。- `{}`符号在替换时不会进行预编译处理,替换后的参数直接拼接到SQL语句中,潜在地存在SQL注入的风险。- `#`符号在替换时会自动进行预编译处理,可以防止SQL注入攻击,并确保查询参数的类型正确匹配。原创 2024-04-11 09:45:47 · 295 阅读 · 0 评论 -
Java面试必问题32:Redis篇(重点) Redisson是什么,怎么用以及Redisson的看门狗机制原理解析
一旦锁的续期失败,即续期任务运行失败或锁的标识不匹配,Redisson会立即释放该锁,以避免业务不再持有锁而导致的问题。例如,使用Redisson的分布式锁,可以注入RedissonClient对象后调用getLock方法来获取锁对象,然后使用lock方法加锁,并在需要时执行相应的操作,最后使用unlock方法释放锁。总结来说,Redisson的看门狗机制通过定时续期锁的过期时间,保证在业务执行期间锁不会被自动释放,解决了在分布式环境下使用分布式锁时锁过期的问题,提高了锁的可靠性和使用效果。原创 2024-04-11 09:00:57 · 544 阅读 · 0 评论 -
Java面试必问题31:Redis必问篇
分片集群由多个节点组成,根据Key经过哈希算法映射到不同的节点上,每个节点负责存储和处理一部分数据,工作原理是通过一致性哈希算法将数据按照一定规则分配到不同的节点上,实现数据的均衡存储和查询。哨兵集群由多个哨兵节点组成,工作原理是哨兵节点通过相互通信,监测主节点的健康状态,当主节点失效时,选举新的主节点,并通知其他从节点进行切换,确保系统的可用性。每个节点负责管理一部分槽和相应的数据。当主节点失效或不可用时,哨兵可以自动检测到故障,并根据预先配置的策略进行主节点切换,将一个可用的从节点提升为新的主节点。原创 2024-04-10 11:59:51 · 510 阅读 · 0 评论 -
Java面试必问题30:Redis篇(重点必问)
AOF是追加日志持久化方式,将每个写操作以追加的方式记录到日志文件中,确保了更高的数据完整性和持久性,但相对于RDB消耗更多的磁盘空间和写入性能,适用于数据持久化和灾难恢复,且可以通过配置实现不同的同步频率。(单线程,省去线程切换、锁竞争的开销)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;如果你的业务场景既要兼顾性能,又注重数据完整性,那么可以采用混合持久化的方式。原创 2024-04-10 10:34:18 · 561 阅读 · 0 评论 -
Java面试必问题29:MySQL篇(重点必问)
最简回答:数据库事务隔离级别是指在多个并发事务同时执行时,各个事务之间的隔离程度,常见的隔离级别有读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。在B+树索引中,每个节点的大小是固定的,与磁盘页的大小相当。B+树的叶子节点之间使用链表连接,并且叶子节点的关键字是有序的,因此对于范围查询操作,可以通过顺序扫描叶子节点来获取有序的数据结果,提高查询速度。事务隔离级别越严格,数据库效率越低。原创 2024-04-09 09:23:52 · 985 阅读 · 0 评论 -
Java面试必问题28:设计模式篇
Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对 象。Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;,例如ErrorContext和LogFactory;Spring中的bean默认都是单例的。原创 2024-04-09 09:10:45 · 624 阅读 · 0 评论 -
Java面试必问题27:单例模式的几种写法
getInstance()方法首先检查instance是否为null,如果为null,则进入同步块。在同步块内部,再次检查instance是否为null,这是为了防止多个线程同时通过了第一次检查,然后一个线程创建了实例,而另一个线程又创建了一个实例的情况发生。使用双重检查锁可以在保证线程安全的前提下,减少锁的竞争,提高性能。但需要注意的是,使用双重检查锁需要将instance声明为volatile类型,以确保多线程环境下的可见性。if (instance==null) { //第一次检查。原创 2024-04-08 10:04:08 · 478 阅读 · 0 评论 -
Java面试必问题26:ThreadLocal是一个什么样的技术
ThreadLocal是一种Java技术,它允许在多线程环境中维护线程私有的变量副本。解决方法:在使用完ThreadLocal后,在合适的地方调用remove()方法清理资源,可以使用try-finally语句块确保清理操作的执行,或者使用ThreadLocal的initialValue()方法设置初始值,这样在线程结束后会自动清理。解决方法:使用线程池时,应避免使用ThreadLocal变量或者在使用前后显式清理ThreadLocal变量,确保每次任务执行时ThreadLocal的状态是干净的。原创 2024-04-07 16:07:44 · 502 阅读 · 0 评论 -
Java面试必问题24:线程池的拒绝策略有哪些 && synchronized 和 lock 的区别 (重点)
最简回答:线程池的拒绝策略有四种:AbortPolicy(默认方式,中止并抛出RejectedExecutionException异常)、CallerRunsPolicy(使用调用线程来执行被拒绝的任务)、DiscardPolicy(默默地丢弃被拒绝的任务)以及DiscardOldestPolicy(丢弃最早被添加到队列的任务,然后尝试重新提交新任务)。而Lock是一个接口,提供更灵活的同步机制,可以手动控制锁的获取和释放,底层实现可以是ReentrantLock等,性能在高竞争环境下通常较好。原创 2024-04-02 10:55:56 · 483 阅读 · 0 评论 -
Java面试必问题23:线程池工作原理 && 线程池大小如何设定
这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1,比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。一旦任务暂停,CPU 就会处于空闲状态,而在这种情况下多出来的一个线程就可以充分利用 CPU 的空闲时间。这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。当一个线程完成任务时,它会从队列中取下一个任务来执行。原创 2024-04-01 10:21:27 · 563 阅读 · 0 评论 -
Java面试必问题22:如何创建线程池(偏重点)&&创建线程池的注意事项
【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这 样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。线程池的生命周期包括初始化、执行任务和关闭。在关闭时,需要调用线程池的shutdown()或shutdownNow()方法来关闭线程池,并等待所有任务完成。线程池的大小应根据任务的类型和系统资源进行合理的配置。总之,自定义线程池需要合理配置线程池的大小、选择适当的任务队列和拒绝策略,正确管理线程池的生命周期,并考虑线程安全性。原创 2024-03-30 09:58:53 · 653 阅读 · 0 评论 -
Java面试必问题21:线程池核心参数
keepAliveTime => 当前线程池数量超过 corePoolSize 时,多余的空闲线程的存活时间,即多次时间内会被销毁。workQueue => 线程池所使用的缓冲队列,被提交但尚未被执行的任务。threadFactory => 线程工厂,用于创建线程,一般用默认的即可。maximumPoolSize => 线程池最大数量(包含核心线程数量)handler => 拒绝策略,当任务太多来不及处理,如何拒绝任务。corePoolSize => 线程池核心线程数量。原创 2024-03-29 09:30:13 · 458 阅读 · 0 评论 -
Java面试必问题20:创建线程的方式
这些都是Java中创建线程的常见方式,你可以根据具体需求选择合适的方式来创建线程。// 线程执行的代码。// 定义一个实现Runnable接口的线程类。// 定义一个继承自Thread类的线程类。// 线程执行的代码。// 线程执行的代码。// 创建线程实例,并启动线程。// 创建线程实例,并启动线程。原创 2024-03-28 11:01:58 · 539 阅读 · 0 评论 -
Java面试必问题1:MongoDB和Redis的区别
最简回答:MongoDB和Redis在几个关键方面有明显区别。首先,数据模型不同,MongoDB支持复杂数据类型和非结构化数据,而Redis主要支持键值对。其次,存储方式不同,MongoDB将数据持久化在磁盘上,而Redis可以将数据保存在内存中作为缓存。最后,应用场景不同,MongoDB适用于大规模数据存储和复杂查询,而Redis适用于高性能的键值对缓存和消息队列等场景。根据具体需求,选择适合的数据库方案。原创 2024-03-05 15:45:06 · 202 阅读 · 0 评论 -
Java面试必问题19:线程的状态
最简回答:线程的状态包括:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)、终止(Terminated)。线程可以调用Thread.sleep()方法、Object类的wait()方法、join()方法或Lock类的计时等待方法进入此状态。线程进入等待状态,直到其他线程显式地唤醒它。线程可以调用Object类的wait()方法、join()方法或Lock类的条件等待方法进入此状态。线程被创建但尚未启动。原创 2024-03-27 10:16:43 · 369 阅读 · 0 评论 -
Java面试必问题18:线程安全的集合类和有序的集合类
CopyOnWriteArrayList - 线程安全的数组列表实现的List。ConcurrentSkipListSet - 线程安全的跳表实现的有序Set。LinkedHashMap - 基于哈希表和双向链表实现的有序Map。LinkedHashSet - 基于哈希表和双向链表实现的有序Set。ConcurrentHashMap - 线程安全的哈希表实现的Map。TreeMap - 基于红黑树实现的有序Map。TreeSet - 基于红黑树实现的有序Set。有序Map:TreeMap。原创 2024-03-26 09:26:51 · 474 阅读 · 0 评论 -
Java面试必问题17:ArrayList与LinkedList区别
ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。LinkedList 采用链表存储,所以,如果是在头尾插入或者删除元素不受元素位置的影响(add(E e)、addFirst(E e)、addLast(E e)、removeFirst() 、removeLast()),近似 O(1),如果是要在指定位置 i 插入和删除元素的话(add(int index, E element),remove(Object o))时间复杂度近似为 O(n) ,因为需要先移动到指定位置再插入。原创 2024-03-25 09:47:38 · 634 阅读 · 0 评论 -
Java面试必问题16:HashMap和HashTable区别 && ConcurrentHashMap和HashMap的区别
① 在 JDK1.7 的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。最简回答:ConcurrentHashMap和HashTable的区别在于并发性和线程安全性,ConcurrentHashMap利用分段锁(Segment)实现高效的并发访问和更新,而HashTable使用全局锁(synchronized)来保证线程安全。原创 2024-03-23 09:35:57 · 1117 阅读 · 0 评论 -
Java面试必问题15:HashMap什么时候扩容 && HashMap的长度为什么是 2的 N 次方
在JDK1.8中,当HashMap中链表长度超过阈值(默认为8)时,会将链表转换为红黑树,而不是立即进行扩容,只有当红黑树节点数量超过容量与负载因子的乘积阈值时(默认为64),才会进行扩容,扩容后的容量为当前容量的两倍。例如,初始容量为16,当元素数量达到12时会触发扩容,扩容后的容量为32。最简回答:HashMap的长度选择为2的N次方是为了提高散列算法的效率和分布均匀性,通过使用2的幂次方作为长度,可以确保哈希码的高位和低位可以均匀参与到散列计算中,减少哈希冲突的发生,并提高散列算法的效率和性能。原创 2024-03-22 13:52:35 · 542 阅读 · 1 评论 -
Java面试必问题14:HashMap底层原理 && HashMap为什么用红黑树不用B树
相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。然而,在内存中的数据结构中,红黑树的实现更为简单,代码的复杂度较低。最简回答:HashMap使用红黑树而不是B树,是因为红黑树相对于B树在插入、删除和查找等操作上的平衡性能更好,且红黑树的节点比B树的节点更小,占用的内存更少,适合存储在内存中的数据结构。原创 2024-03-21 09:29:13 · 545 阅读 · 1 评论 -
Java面试必问题13:HashMap底层原理
HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。而JDK1.8引入了红黑树的概念,当链表长度超过一定阈值时,链表会转换成红黑树,以提高查询效率。`HashMap` 底层是。结合在一起使用也就是。原创 2024-03-20 08:44:46 · 393 阅读 · 1 评论