Java面试题
文章平均质量分 61
主要用于收集平时学习面试和遇到的一些面试题及答案
DKPT
I CAN DO IT.
展开
-
全局CORS配置有哪些优势
细粒度控制:全局CORS配置允许开发者根据应用的实际需求,对CORS策略进行细粒度的控制。通过遵循CORS标准,Spring Boot应用可以与其他遵循该标准的Web服务进行交互,提高了应用的兼容性和互操作性。集中管理:全局CORS配置允许开发者在一个中心位置(通常是配置类或配置文件)定义CORS策略,而不是在每个需要跨域的方法或控制器上分别配置。防止未授权访问:通过限制允许的源和HTTP方法,全局CORS配置可以防止未经授权的外部网站访问应用资源,从而保护应用免受潜在的安全威胁。原创 2024-08-02 13:51:06 · 251 阅读 · 0 评论 -
SpringBoot如何实现简单的跨域配置
allowedMethods()方法指定了允许的HTTP方法,这里包含了常用的GET、POST、PUT、DELETE和OPTIONS方法。.allowedHeaders("*")表示允许任何头部信息,但出于安全考虑,你可能希望明确指定允许的头部。但是,当设置为true时,.allowedOrigins()不能包含通配符*,你需要明确指定允许的源。需要注意的是,CORS策略是浏览器安全策略的一部分,它只在浏览器端生效,后端服务之间调用不受CORS策略的限制。这通常用于需要前端读取某些响应头信息的场景。原创 2024-08-01 17:35:55 · 569 阅读 · 0 评论 -
SpringBoot 如何处理跨域请求
对于更复杂的 CORS 需求,你可以通过实现 WebMvcConfigurer 接口并覆盖 addCorsMappings 方法来全局配置 CORS。@Override在这个例子中,addMapping("/**") 表示对所有路径都应用 CORS 策略,allowedOrigins 设置了允许访问的源,allowedMethods 设置了允许的 HTTP 方法,allowedHeaders 允许任何头部信息,allowCredentials(true) 表示允许发送 Cookies。原创 2024-08-01 17:35:18 · 728 阅读 · 0 评论 -
哪些操作不适合并行化
如果在并行的pipeline中使用了映射、过滤器或者程序员自己编写的其他函数对象,并且这些对象没有遵守线程安全的规范,那么可能会导致安全性失败和结果出错。原创 2024-07-31 10:07:14 · 494 阅读 · 0 评论 -
如何判断Stream是否支持并行处理
在Java中,Stream本身并不直接提供一个方法来“判断”它是否支持并行处理,因为Stream的并行或串行性质是由其来源和创建方式决定的。但是,你可以通过检查流是如何被创建和处理的来间接地判断它是否支持并行处理。原创 2024-07-31 10:06:55 · 699 阅读 · 0 评论 -
stream的串并行处理是什么?
例如,Stream.of(1, 2, 3, 4, 5).parallel().reduce((a, b) -> a + b).ifPresent(System.out::println);示例:Stream.of(1, 2, 3, 4, 5).reduce((a, b) -> a + b).ifPresent(System.out::println);这段代码创建了一个包含整数的Stream,并通过reduce方法计算所有数字的和,这些操作是在单线程中按顺序逐个执行的。原创 2024-07-30 14:33:26 · 387 阅读 · 0 评论 -
arraylist属性中的elementdata关键字被transient修饰是为了防止对象数组被其他外部方法序列化
但是,由于 elementData 是 transient 的,所以它的内容不会被序列化。当你说“防止对象数组被其他外部方法序列化”时,你可能是在考虑一个场景,即 ArrayList 的一个实例被传递给某个方法,而该方法试图序列化包含这个 ArrayList 的某个对象。总之,transient 关键字在 ArrayList 的 elementData 上使用,主要是为了确保当 ArrayList 对象本身被序列化时,它的内部数组不会被序列化,从而允许 ArrayList 提供更高效的序列化策略。原创 2024-07-30 14:33:07 · 477 阅读 · 0 评论 -
arraylist属性中的elementdata关键字被transient修饰了,是为什么?
当 ArrayList 被序列化时,如果直接序列化 elementData 数组,那么无论数组中有多少元素被实际使用,整个数组都会被序列化。由于 ArrayList 需要以特定的方式序列化其元素(只序列化实际存储的元素),因此它实现了 writeObject 和 readObject 方法来执行自定义的序列化和反序列化操作。ArrayList 的内部实现可能会根据需要进行调整,例如当添加元素导致数组容量不足时,会创建一个新的、更大的数组,并将原数组中的元素复制到新数组中。原创 2024-07-29 11:15:56 · 471 阅读 · 0 评论 -
正则表达式的独占模式,懒惰模式等有那些区别
贪婪模式会尽可能多地匹配字符,直到满足条件或没有字符可匹配。懒惰模式会尽可能少地匹配字符,直到满足条件或已经匹配了整个字符串。独占模式在匹配时会尝试最长的匹配,但如果匹配失败则不会回溯,因此它更加“坚决”和“直接”。原创 2024-07-29 11:15:28 · 516 阅读 · 0 评论 -
正则表达式的匹配模式有那些?
在不同编程语言中,此模式的指定方式可能有所不同。例如,在Python中,可以使用常量re.I或re.IGNORECASE;在JavaScript中,可以在正则表达式后添加i标志,如/regex/i。例如,在Python中,可以使用常量re.S或re.DOTALL;在不同的编程语言和正则引擎中,多行模式的指定方式也有所不同。例如,在Python中,可以使用常量re.M或re.MULTILINE来指定多行模式。在支持注释模式的引擎中,通常使用(?但在单行模式下,点号可以匹配包括换行符在内的任意字符。原创 2024-07-28 09:49:15 · 496 阅读 · 0 评论 -
DFA和NFA引擎有哪些应用场景
DFA(确定性有穷自动机)和NFA(非确定性有穷自动机)引擎在正则表达式的处理中有广泛的应用,各自在不同场景下发挥着重要作用。原创 2024-07-28 09:48:55 · 437 阅读 · 0 评论 -
DFA和NFA引擎的区别
DFA(确定性有穷自动机)和NFA(非确定性有穷自动机)引擎在正则表达式的处理中有着不同的特性和行为。原创 2024-07-27 15:56:06 · 505 阅读 · 0 评论 -
如何选择适合的正则表达式引擎
例如,PCRE(Perl Compatible Regular Expressions)是一个广泛使用的正则表达式库,它提供了与Perl兼容的正则表达式功能,并且可以在许多编程语言中使用。明确你的需求,例如是否需要支持复杂的正则表达式特性(如捕获组、环视、占有优先量词等)、是否要求高效率的匹配等。NFA引擎提供了更多的功能,如捕获组、环视、占有优先量词等,这使得它们更适合处理复杂的正则表达式模式。在选择正则表达式引擎之前,查阅相关的文档和社区支持可以帮助你了解引擎的优缺点、使用方法和常见问题。原创 2024-07-27 15:55:40 · 527 阅读 · 0 评论 -
正则表达式引擎有那些?编程语言使用的是那种引擎
正则表达式引擎主要可以分为两大类:确定性有穷自动机(DFA)和非确定性有穷自动机(NFA)。原创 2024-07-26 09:34:50 · 367 阅读 · 0 评论 -
正则表达式常见的元字符有那些?
d:匹配一个数字字符,等价于 [0-9]。\D:匹配一个非数字字符,等价于 [^0-9]。\w:匹配一个单词字符(字母、数字或下划线),等价于 [a-zA-Z0-9_]。\W:匹配一个非单词字符,等价于 [^a-zA-Z0-9_]。\s:匹配任何空白字符,包括空格、制表符、换页符等,等价于 [\f\n\r\t\v]。\S:匹配任何非空白字符,等价于 [^\f\n\r\t\v]。原创 2024-07-26 09:34:27 · 410 阅读 · 0 评论 -
字符串常量池的作用是什么
字符串常量池(String Constant Pool)在Java中是一个特殊的内存区域,用于存储字符串字面量(即直接在代码中出现的字符串)。原创 2024-07-25 11:28:42 · 534 阅读 · 0 评论 -
如何使用string.intern节省内存
在Java中,String.intern() 方法用于将字符串对象的引用添加到字符串常量池中(如果字符串常量池中不存在该字符串的引用)。这通常用于节省内存,因为它允许在多个地方引用相同的字符串对象,而不是创建多个相同的字符串对象。原创 2024-07-25 11:28:24 · 664 阅读 · 0 评论 -
构建超大字符串的示例
示例中,首先预估了字符串的大小,并创建了一个相应容量的StringBuilder对象。然后使用一个循环将重复的字符串添加到StringBuilder中。最后将StringBuilder对象转换为String对象,并输出其长度。由于字符串可能非常大,还将它写入到一个文件中,而不是直接打印或处理。原创 2024-07-24 16:57:25 · 327 阅读 · 0 评论 -
如何构建超大字符串
如果你需要将多个字符串连接成一个,并且这些字符串存储在一个集合(如List)中,可以使用String.join()方法。如果你的代码需要在多线程环境中运行,并且多个线程需要同时构建字符串,那么你应该使用StringBuffer而不是StringBuilder,或者确保对StringBuilder的访问是同步的。当你创建一个StringBuilder或StringBuffer时,可以预估最终字符串的大小,并通过传递一个初始容量参数给构造函数来避免在构建过程中进行多次扩容操作。原创 2024-07-24 16:57:06 · 510 阅读 · 0 评论 -
springcloud与dubbo分别基于什么实现的
Spring Cloud基于Spring Boot构建,整合了Eureka、Ribbon、Hystrix等组件,为微服务架构提供了服务注册与发现、负载均衡、熔断降级、配置管理等一站式解决方案。Hystrix:提供熔断和降级功能,当某个服务调用失败或响应时间过长时,Hystrix可以中断对该服务的调用,并返回降级信息,以防止故障在分布式系统中扩散。Eureka:Spring Cloud中的服务注册与发现组件,服务提供者将自身注册到Eureka中,服务消费者从Eureka中获取服务提供者的信息。原创 2024-07-21 17:51:42 · 530 阅读 · 0 评论 -
面向对象设计的原则有哪些?
这有助于减少模块之间的耦合度,提高系统的可维护性和可扩展性。软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。这意味着我们应该在不修改现有代码的基础上,通过添加新功能来使系统适应变化。这意味着,在软件系统中,如果某个地方可以使用基类对象,那么一定也可以使用其子类对象。一个类对另一个类的依赖应该建立在最小的接口上。这有助于减少不必要的依赖,提高系统的灵活性。这有助于保持类的内聚性,降低耦合度。这有助于降低系统的复杂性,提高代码的可读性和可维护性。这有助于减少对象之间的耦合度,提高系统的可维护性。原创 2024-07-15 17:23:53 · 458 阅读 · 0 评论 -
数据结构线性表的基本概念
线性表(Linear List)是由零个或多个数据元素所组成的有限序列。它是最常用且最简单的一种数据结构。原创 2024-07-14 06:22:36 · 265 阅读 · 0 评论 -
如何选择适合的分布式锁技术
可靠性高:Zookeeper通过分布式集群来确保数据的高可用性和一致性,因此Zookeeper锁具有很高的可靠性。不依靠超时时间释放:Zookeeper锁通过节点监听机制来确保锁的释放,不依赖于超时时间,避免了超时锁失效的问题。可靠性:数据库锁的可靠性取决于数据库的稳定性和性能。性能要求高、实现简单的场景:推荐选择Redis锁。实现简单:基于数据库的锁实现方式相对简单,可以通过数据库的唯一索引或排他锁来实现。性能:数据库锁的性能通常较差,特别是在高并发场景下,数据库的访问压力会显著增加。原创 2024-07-14 06:22:11 · 217 阅读 · 0 评论 -
在高并发下如何确保系统的实时性
对于耗时较长的操作,如发送邮件、生成报表等,采用消息队列(如RabbitMQ、Kafka)进行异步处理,避免阻塞主线程,确保系统能快速响应其他请求。利用Redis、Memcached等高速缓存系统,将热点数据存储在内存中,减少对数据库或其他外部资源的访问次数,显著提高系统响应速度。通过合理的缓存淘汰策略,如LRU(最近最少使用)算法,确保缓存中的数据始终是最新的,并且能够快速响应读取请求。定期对数据库进行索引优化、SQL语句优化等操作,减少查询时间,提高系统的实时性。原创 2024-07-13 09:35:12 · 187 阅读 · 0 评论 -
如何处理分布式系统中的一致性问题
处理分布式系统中的一致性问题需要综合考虑业务需求、系统架构、性能要求等多个方面。在选择解决方案时,需要根据实际情况进行权衡和选择,并在运行过程中进行监控和调整,以确保系统的一致性和性能。原创 2024-07-13 09:34:11 · 203 阅读 · 0 评论 -
如何设计一个高并发,高性能的分布式系统
以上只是一个基本的框架和思路,具体的实现还需要根据具体的业务需求和技术环境进行调整和优化。微服务化:将系统拆分为多个独立的服务,每个服务负责一个具体的业务功能,提高系统的可扩展性和可维护性。使用固态硬盘(SSD):将操作系统和常用程序安装在SSD上,提高系统的启动速度和应用程序的响应速度。服务分类:根据服务的重要性和访问频率,将服务分为关键服务和非关键服务,以便合理分配资源。分层设计:将系统划分为不同的层次,如应用层、服务层、数据层等,每层负责不同的功能。原创 2024-07-12 09:58:52 · 393 阅读 · 0 评论 -
如何设计有效的缓存淘汰策略
设计有效的缓存淘汰策略需要结合业务需求、数据访问模式以及缓存的特性进行综合考虑。在选择淘汰策略时,需要根据实际情况进行权衡和选择,并在运行过程中进行监控和调整,以确保缓存的高效利用和性能优化。原创 2024-07-12 09:58:23 · 162 阅读 · 0 评论 -
Java面试之缓存中间件常见面试题
缓存是存储常用或临时数据的组件,用于提高数据访问速度。在Web应用中,缓存能够减少数据库访问次数,提高系统响应速度和吞吐量,从而提升用户体验和系统稳定性。原创 2024-07-11 10:03:59 · 994 阅读 · 0 评论 -
如何选择适合的分布式数据库插件
选择适合的分布式数据库插件需要综合考虑业务需求、插件特性、性能、易用性和维护性、成本、兼容性、备份和恢复策略以及安全性等因素。通过仔细评估这些因素,你可以找到最适合你项目的分布式数据库插件。原创 2024-07-11 10:03:40 · 254 阅读 · 0 评论 -
常用分布式数据库插件有那些?
ORACLE_FDW/MYSQL_FDW:用于PostgreSQL数据库连接Oracle、MySQL等其他数据库的外部数据包装器(Foreign Data Wrapper)。后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,以及MongoDB这种新型NoSQL方式的存储。兼容性:支持MySQL、Oracle、SQLServer、PostgreSQL等数据库,以及任何遵循SQL92标准的数据库。提供了标准化的数据分片、分布式事务和数据库治理功能。原创 2024-07-10 11:10:34 · 321 阅读 · 0 评论 -
Java面试之分布式数据库常见面试题
分布式数据库是指物理上分散在不同地点,但在逻辑上属于同一系统的数据库。它通过计算机网络将地理上分散的、具有自治能力的多个逻辑单位连接起来,共同组成一个统一的数据库系统。原创 2024-07-10 11:10:19 · 480 阅读 · 0 评论 -
Java中常见的消息中间件有哪些,各自的优缺点是那些?
总结来说,这些消息中间件各有其优缺点,需要根据具体的业务场景和需求来选用。ActiveMQ和RabbitMQ更适用于中小规模的消息传递场景,而Kafka和RocketMQ则更适用于处理大规模数据和高并发场景。使用AMQP(高级消息队列协议)作为核心通信协议,支持多种编程语言和协议,如MQTT、STOMP等。作为一个较新的中间件,可能在某些特定场景下的支持和优化不如其他中间件完善。对于大规模数据处理和高并发场景,RabbitMQ的性能可能受限。在某些情况下,可能需要额外的配置和管理。原创 2024-07-09 09:51:42 · 556 阅读 · 0 评论 -
Java面试之消息中间件常见面试题
消息中间件(Message-Oriented Middleware,简称MOM)是一种异步通信机制,用于解决分布式系统中应用程序之间通信的问题。它基于消息的发布/订阅机制或点对点机制,实现了高效、可靠、可伸缩的消息传递。消息队列是一种用于在发送方和接收方之间传递消息的机制。消息被发送到队列中,并按照先进先出(FIFO)的顺序进行处理。常见的消息队列产品包括RabbitMQ、ActiveMQ、Kafka等。原创 2024-07-09 09:51:24 · 607 阅读 · 0 评论 -
Java面试之mybaits常见面试题
但是,在实际应用中,我们更推荐使用Spring等框架来管理事务,因为它们提供了更强大和灵活的事务管理功能。通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂,由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。当你执行一系列的数据库操作时,这些操作要么全部成功,要么全部失败,这就是事务的原子性。MyBatis是半自动的ORM框架,开发者需要编写SQL语句,而Hibernate是全自动的ORM框架,无需编写SQL语句。它用于防止SQL注入。原创 2024-07-08 17:50:18 · 697 阅读 · 1 评论 -
Java面试之springboot常见面试题
Spring Boot是一个开源的Java框架,旨在简化Spring应用的初始搭建以及开发过程。它通过提供默认配置和自动配置等功能,使开发者能够快速搭建Spring应用,并专注于业务功能的开发,而无需过多关注配置和底层细节。JavaConfig是Spring社区提供的一种使用纯Java代码来配置Spring IoC容器的方式。它避免了使用XML配置文件,使得配置更加简洁、直观和易于维护。JavaConfig通过注解和Java类来定义Bean的创建和依赖注入关系,实现了与XML配置相同的功能。原创 2024-07-08 17:49:05 · 782 阅读 · 0 评论 -
Java中如何实现线程池的生命周期管理
但是,请注意,在调用shutdown或shutdownNow之后,线程池实例本身并不会立即被垃圾回收,因为它可能还有正在执行的任务或者等待执行的任务的引用。线程池的状态可以通过ThreadPoolExecutor的一些方法进行检查,如getActiveCount(当前活跃线程数)、getPoolSize(当前线程池大小)、getQueue(工作队列)等。已提交的任务将被执行,但不会接受新的任务。shutdownNow():试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。原创 2024-07-07 09:54:57 · 286 阅读 · 0 评论 -
Java面试之并发与网络通信常见面试题
进程:操作系统分配资源的最小单位,各个进程之间占据独立的寻址空间,运行也是独立运行,进程间通信需要一些机制。线程:程序执行的基本单位,一个进程可以开启多个线程,他们的很多空间(如堆空间)是公用的。线程执行开销小,但是不够安全。原创 2024-07-07 09:54:36 · 286 阅读 · 0 评论 -
线程中如何有效避免死锁问题
避免死锁需要深入理解死锁形成的原因并采取适当的策略来预防。通过加锁顺序一致、尝试锁、设置加锁时限、检测死锁、避免嵌套锁和使用高级并发工具等方法,可以有效地减少死锁的风险并提高程序的并发性能。原创 2024-07-06 09:03:41 · 233 阅读 · 0 评论 -
Java面试之Java多线程常见面试题
定义:线程是程序中的执行路径,是操作系统进行调度的基本单位。它允许程序并发执行多个任务,提高程序的响应速度和资源利用率。原创 2024-07-06 09:03:21 · 387 阅读 · 0 评论 -
如何处理并发集中的过期或过期继承问题
对于需要处理过期数据的并发集合,首先应为数据项设置合理的过期时间。使用后台任务或定时器定期扫描并发集合,检查数据项的过期时间,并删除或处理过期的数据项。设置预警系统,当集合中的过期数据数量超过阈值或即将出现积压时,触发警报并采取相应的措施(如增加消费者线程数、降低生产者速度等)。为了及时发现和处理并发集合中的过期或积压问题,可以实现实时监控系统来追踪集合的使用情况、生产者和消费者的进度等关键指标。考虑到并发集合的线程安全性,清理任务应该使用适当的同步机制来确保在清理过程中不会与集合的其他操作发生冲突。原创 2024-07-05 09:54:43 · 346 阅读 · 0 评论