自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 死锁的发生原因和怎么避免

死锁是计算机系统中多个进程或线程因争夺资源而陷入互相等待的状态,导致无法继续执行的现象。进程 A 占用文件 F1 后请求文件 F2,进程 B 占用文件 F2 后请求文件 F1。允许系统强制回收资源(如撤销进程或回滚操作),但实现复杂且不适用所有资源。线程 1 持有锁 A 并请求锁 B,线程 2 持有锁 B 并请求锁 A。:若资源顺序为 A→B→C,进程需先申请 A 再申请 B,避免循环等待。使用共享资源(如只读文件),但多数资源无法避免互斥(如打印机)。:对资源类型全局排序,进程按顺序申请资源。

2025-02-07 20:26:08 1368

原创 Spring Boot 的约定优于配置

它的目的是减少开发者在配置上花费的时间,通过提供默认的约定来简化开发流程。Spring Boot 为大多数常见的应用场景提供了默认配置,开发者无需手动配置即可快速启动项目。虽然 Spring Boot 提供了大量默认配置,但开发者仍然可以通过配置文件或代码自定义配置。Spring Boot 遵循一定的项目结构约定,开发者只需按照约定组织代码,即可减少配置。Spring Boot 提供了大量的 Starter 依赖,简化了依赖管理和配置。模块,自动根据项目的依赖和类路径中的内容配置应用程序。

2025-02-07 11:07:05 524

原创 fail-safe 机制与 fail-fast 机制分别有什么作用

是两种不同的错误处理机制,主要用于集合(Collection)的并发修改场景。Fail-Fast 是一种错误检测机制,当系统或程序在运行过程中检测到可能发生的错误时,立即抛出异常并终止操作。Fail-Safe 是一种容错机制,当系统或程序在运行过程中检测到错误时,不会立即抛出异常,而是尝试继续运行。如果是多线程环境,且需要避免并发修改导致的异常,可以选择。:遍历集合时,操作的是集合的副本,而不是原始集合。:适用于单线程环境,多线程环境下可能会抛出异常。适用于多线程环境,避免因并发修改导致的异常。

2025-02-07 10:43:48 319

原创 lock 和 synchronized 区别

都是用于实现线程同步的机制,但它们的设计和使用方式有显著区别。基于 JVM 内置的监视器锁(Monitor Lock)实现。适合复杂的同步需求,如需要尝试获取锁、超时获取锁、公平锁等。锁的释放由 JVM 自动完成,不会出现忘记释放锁的情况。是 Java 的关键字,属于语言级别的同步机制。包下的接口,属于 API 级别的同步机制。适合简单的同步需求,代码量少,易维护。块中释放锁,以确保锁一定会被释放。,因为它是 JVM 内置的机制。,因为它提供了更细粒度的控制。提供了更灵活的锁控制。

2025-02-07 10:00:19 293

原创 Redis 和 Mysql 如何保证数据一致性

由于 Redis 是内存数据库,而 MySQL 是磁盘数据库,两者的数据更新可能存在延迟或不一致的情况。如果 Redis 未命中,则从 MySQL 读取数据,并写入 Redis。更新数据时,先更新 MySQL,再删除 Redis 中的缓存。更新数据时,只更新 Redis,异步将数据写入 MySQL。:数据可能丢失(如 Redis 宕机),一致性较差。更新数据时,先更新 MySQL,再更新 Redis。更新数据时,同时更新 MySQL 和 Redis。读取数据时,先查 Redis,如果命中则返回。

2025-02-07 09:13:59 1469

转载 分布式锁介绍

在多线程环境中,如果多个线程同时访问共享资源(例如商品库存、外卖订单),会发生数据竞争,可能会导致出现脏数据或者系统问题,威胁到程序的正常运行。举个例子,假设现在有 100 个用户参与某个限时秒杀活动,每位用户限购 1 件商品,且商品的数量只有 3 个。如果不对共享资源进行互斥访问,就可能出现以下情况:为了保证共享资源被安全地访问,我们需要使用互斥操作对共享资源进行保护,即同一时刻只允许一个线程访问共享资源,其他线程需要等待当前线程释放后才能访问。这样可以避免数据竞争和脏数据问题,保证程序的正确性和稳定性。

2025-02-06 22:41:23 12

转载 超时&重试详解

由于网络问题、系统或者服务内部的 Bug、服务器宕机、操作系统崩溃等问题的不确定性,我们的系统或者服务永远不可能保证时刻都是可用的状态。为了最大限度的减小系统或者服务出现故障之后带来的影响,我们需要用到的 超时(Timeout) 和 重试(Retry) 机制。想要把超时和重试机制讲清楚其实很简单,因为它俩本身就不是什么高深的概念。虽然超时和重试机制的思想很简单,但是它俩是真的非常实用。你平时接触到的绝大部分涉及到远程调用的系统或者服务都会应用超时和重试机制。尤其是对于微服务系统来说,正确设置超时和重试非常重

2025-02-05 10:20:29 97

转载 冗余设计详解

举个例子:哨兵模式的 Redis 集群中,如果 Sentinel(哨兵) 检测到 master 节点出现故障的话, 它就会帮助我们实现故障转移,自动将某一台 slave 升级为 master,确保整个 Redis 系统的可用性。和传统的灾备设计相比,同城多活和异地多活最明显的改变在于“多活”,即所有站点都是同时在对外提供服务的。对于服务来说,冗余的思想就是相同的服务部署多份,如果正在使用的服务突然挂掉的话,系统可以很快切换到备份服务上,大大减少系统的不可用时间,提高系统的可用性。

2025-02-05 10:18:15 219

转载 高可用系统设计指南

一般情况下,我们使用多少个 9 来评判一个系统的可用性,比如 99.9999% 就是代表该系统在所有的运行时间中只有 0.0001% 的时间是不可用的,这样的系统就是非常非常高可用的了!流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。异步调用的话我们不需要关心最后的结果,这样我们就可以用户请求完成之后就立即返回结果,具体处理我们可以后续再做,秒杀场景用这个还是蛮多的。

2025-02-05 10:16:58 59

转载 数据冷热分离详解

使用 TiDB 6.0 的数据放置功能,可以在同一个集群实现海量数据的冷热存储,将新的热数据存入 SSD,历史冷数据存入 HDD。数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。冷数据的存储要求主要是容量大,成本低,可靠性高,访问速度可以适当牺牲。

2025-02-05 10:13:36 19

转载 Maven 多模块管理

一般只定义了各个依赖的版本号、包含哪些子模块以及插件有哪些。不过,要注意的是,如果依赖只在某个子项目中使用,则可以在子项目的 pom.xml 中直接引入,防止父 pom 的过于臃肿。如下图所示,Dubbo 项目就被分成了多个子模块比如 dubbo-common(公共逻辑模块)、dubbo-remoting(远程通讯模块)、dubbo-rpc(远程调用模块)。多模块管理简单地来说就是将一个项目分为多个模块,每个模块只负责单一的功能实现。多模块管理下,会有一个父模块,其他的都是子模块。

2025-02-05 10:07:17 20

转载 Maven 插件

除了 Maven 自带的插件之外,还有一些三方提供的插件比如单测覆盖率插件 jacoco-maven-plugin、帮助开发检测代码中不合规范的地方的插件 maven-checkstyle-plugin、分析代码质量的 sonar-maven-plugin。Maven 本质上是一个插件执行框架,所有的执行过程,都是由一个一个插件独立完成的。你可以将 Maven 插件理解为一组任务的集合,用户可以通过命令行直接运行指定插件的任务,也可以将插件任务挂载到构建生命周期,随着生命周期运行。

2025-02-05 10:06:22 15

转载 Maven 生命周期

并且,这些阶段是有序的,也就是说,后面的阶段依赖于前面的阶段。当执行某个阶段的时候,会先执行它前面的阶段。Maven 的生命周期就是为了对所有的构建过程进行抽象和统一,包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。命令的时候,会执行从 validate 到 test 的所有阶段,这也就解释了为什么执行测试的时候,项目的代码能够自动编译。生命周期是在没有任何关联插件的情况下定义的,是 Maven 的主要生命周期,用于构建应用程序,共包含 23 个阶段。

2025-02-05 10:04:50 15

转载 Maven 仓库

坐标和依赖是构件在 Maven 世界中的逻辑表示方式,构件的物理表示方式是文件,Maven 通过仓库来统一管理这些文件。有了仓库之后,无需手动引入构件,我们直接给定构件的坐标即可在 Maven 仓库中找到该构件。著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/tools/maven/maven-core-concepts.html。在 Maven 世界中,任何一个依赖、插件或者项目构建的输出,都可以称为。

2025-02-05 10:01:05 24

转载 Maven 依赖

依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A->B->Y(1.0)、A-> C->Y(2.0),Y(1.0)和 Y(2.0)的依赖路径长度是一样的,都为 2。我们保留了 1.5 版本的 X,但是这个版本的 X 删除了 1.0 版本中的某些类。如果高版本修改了低版本的一些类或者方法的话,这个时候就不能直接保留高版本了,而是应该考虑优化上层依赖,比如升级上层依赖的版本。不过,你也可以发现。这两条依赖路径上有两个版本的 X,为了避免依赖重复,Maven 只会选择其中的一个进行解析。

2025-02-05 10:00:26 47

转载 Maven 坐标

著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/tools/maven/maven-core-concepts.html。这个网站上找到几乎所有可用的构件,如果你的项目使用的是 Maven 作为构建工具,那这个网站你一定会经常接触。项目中依赖的第三方库以及插件可统称为构件。只要你提供正确的坐标,就能从 Maven 仓库中找到相应的构件供我们使用。

2025-02-05 09:54:38 16

转载 Maven 介绍

Apache Maven 的本质是一个软件项目管理和理解工具。基于项目对象模型 (Project Object Model,POM) 的概念,Maven 可以从一条中心信息管理项目的构建、报告和文档。著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/tools/maven/maven-core-concepts.html。文件,我们可以定义项目的坐标、项目依赖、项目信息、插件信息等等配置。每一个 Maven 工程都有一个。

2025-02-05 09:52:55 14

转载 MySQL执行计划分析

的结果,可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息。id 不同,id 值越大,执行优先级越高,如果行引用其他行的并集结果,则该值可以为 NULL。这列包含了 MySQL 解析查询的额外信息,通过这些信息,可以更准确的理解 MySQL 到底是如何执行查询的。语句并不会真的去执行相关的语句,而是通过查询优化器对语句进行分析,找出最优的查询方案,并显示对应的信息。查询执行的类型,描述了查询是如何执行的。

2025-02-05 09:48:43 16

转载 MySQL查询缓存详解

分配内存块需要先锁住空间块,所以操作很慢,MySQL 会尽量避免这个操作,选择尽可能小的内存块,如果不够,继续申请,如果存储完时有空余则释放多余的。MySQL 中的查询缓存虽然能够提升数据库的查询性能,但是查询同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。配置的空间,即使缓存数据很小,申请数据块也是这个,因为查询开始返回结果的时候就分配空间,此时无法预知结果多大。对于一个更新频繁的系统来说,查询缓存缓存的作用是很微小的,在某些情况下开启查询缓存会带来性能的下降。

2025-02-05 09:45:44 33

转载 NoSQL基础知识总结

NoSQL(Not Only SQL 的缩写)泛指非关系型的数据库,主要针对的是键值、文档以及图形类型数据存储。并且,NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案。NoSQL 数据库可以存储关系型数据—它们与关系型数据库的存储方式不同。NoSQL 数据库非常适合许多现代应用程序,例如移动、Web 和游戏等应用程序,它们需要灵活、可扩展、高性能和功能强大的数据库以提供卓越的用户体验。

2025-02-05 09:36:41 12

转载 数据库基础知识总结

存储过程在业务比较复杂的时候是非常实用的,比如很多时候我们完成一个操作可能需要写一大串 SQL 语句,这时候我们就可以写有一个存储过程,这样也方便了我们下一次的调用。比如在关系 R(学号 , 姓名, 系名,系主任)中,学号 → 系名,系名 → 系主任,所以存在非主属性系主任对于学号的传递函数依赖,所以该表的设计,不符合 3NF 的要求。所以说,不要一股脑的就抛弃了外键这个概念,既然它存在就有它存在的道理,如果系统不涉及分库分表,并发量不是很高的情况还是可以考虑使用外键的。符合 3NF 要求的数据库设计,

2025-02-05 09:32:15 11

转载 MySQL隐式转换造成索引失效

在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很小的疏忽造成的,又或者是因为不了解某个技术特性产生的。所以,我们在写 SQL 时一定要养成良好的习惯,查询的字段是什么类型,等号右边的条件就写成对应的类型。某些转换是隐式发生的。类型的,查询条件等号右边加引号的第 4 条 SQL 是用到索引的,那么是查询的数据类型和字段数据类型不一致造成的吗?这四条 SQL 都是有针对性写的,12 查询的字段是 int 类型,34 查询的字段是。

2025-01-10 18:41:13 47

转载 SQL语句在MySQL中的执行过程

主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即使管理员修改了该用户的权限,该用户也是不受影响的。先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 SQL 语句为 key 在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。

2024-12-26 10:52:00 21

转载 InnoDB存储引擎对MVCC的实现

如果 DB_TRX_ID >= m_low_limit_id,那么表明最新修改该行的事务(DB_TRX_ID)在当前事务创建快照之后才修改该行,所以该记录行的值对当前事务不可见。如果记录 DB_TRX_ID < m_up_limit_id,那么表明最新修改该行的事务(DB_TRX_ID)在当前事务创建快照之前就提交了,所以该记录行的值对当前事务是可见的。在活跃事务列表中找不到,则表明“id 为 trx_id 的事务”在修改“该记录行的值”后,在“当前事务”创建快照前就已经提交了,所以记录行对当前事务可见。

2024-12-26 10:41:58 22

转载 MySQL事务隔离级别详解

全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。并不会有任何性能损失。

2024-12-26 10:29:38 16

转载 MySQL三大日志(binlog、redo log和undo log)详解

undo log 属于逻辑日志,记录的是 SQL 语句,比如说事务执行一条 DELETE 语句,那 undo log 就会记录一条相对应的 INSERT 语句。并且,undo-log 本身是会被删除清理的,例如 INSERT 操作,在事务提交之后就可以清除掉了;在执行更新语句过程,会记录 redo log 与 binlog 两块日志,以基本的事务为单位,redo log 在事务执行过程中可以不断写入,而 binlog 只有在提交事务时才写入,所以 redo log 与 binlog 的写入时机不一样。

2024-12-26 10:22:50 121

转载 Java 常见并发容器总结

对于一个单链表,即使链表是有序的,如果我们想要在其中查找某个数据,也只能从头到尾遍历链表,这样效率自然就会很低,跳表就不一样了。的另外一个不同之处是:哈希并不会保存元素的顺序,而跳表内所有的元素都是排序的。跳表内的所有链表的元素都是排序的。的内容时,不会直接修改原数组,而是会先创建底层数组的副本,对副本数组进行修改,修改完之后再将修改后的数组赋值回去,这样就可以保证写操作不会影响读操作了。适合在对性能要求相对较高,同时对队列的读写存在多个线程同时进行的场景,即如果对队列加锁的成本较高则适合使用无锁的。

2024-12-25 23:54:09 26

转载 乐观锁和悲观锁详解

乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

2024-12-24 23:55:51 20

转载 MySQL高性能优化规范建议总结

因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能。5.6 版本之前,一个 sql 只能使用到一个表中的一个索引,5.6 以后,虽然有了合并索引的优化方式,但是还是远远没有使用一个联合索引的查询方式好。建立索引的目的是:希望通过索引进行数据查找,减少随机 IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。

2024-12-23 23:53:26 39

转载 MySQL索引详解

MySQL 的 InnoDB 存储引擎不直接支持常规的哈希索引,但是,InnoDB 存储引擎中存在一种特殊的“自适应哈希索引”(Adaptive Hash Index),自适应哈希索引并不是传统意义上的纯哈希索引,而是结合了 B+Tree 和哈希索引的特点,以便更好地适应实际应用中的数据访问模式和性能需求。正因如此,红黑树的查询效率稍有下降,因为红黑树的平衡性相对较弱,可能会导致树的高度较高,这可能会导致一些数据需要进行多次磁盘 IO 操作才能查询到,这也是 MySQL 没有选择红黑树的主要原因。

2024-12-18 23:53:06 18

转载 Java 反射机制详解

另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。Class 类对象将一个类的方法、变量等信息告诉运行的程序。但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化。这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

2024-12-17 23:51:24 33

转载 红黑树介绍

二叉查找树是一种基于比较的数据结构,它的每个节点都有一个键值,而且左子节点的键值小于父节点的键值,右子节点的键值大于父节点的键值。这样的结构可以方便地进行查找、插入和删除操作,因为只需要比较节点的键值就可以确定目标节点的位置。但是,二叉查找树有一个很大的问题,就是它的形状取决于节点插入的顺序。这样的情况下,二叉查找树的性能就会大大降低,时间复杂度就会从 O(logn) 变为 O(n)。但相比于 AVL 树,高度平衡所带来的时间复杂度,红黑树对平衡的控制要宽松一些,红黑树只需要保证黑色节点平衡即可。

2024-12-16 23:54:34 14

转载 Java集合常见面试题总结(下)

这些方法都是基于红黑树数据结构的属性实现的,红黑树保持平衡状态,从而保证了搜索操作的时间复杂度为 O(log n),这让。有了对集合中的元素根据键排序的能力。默认是按 key 的升序排序,不过我们也可以指定排序的比较器。方法,并且判断了一下返回值以确保是否有重复元素。值来判断对象加入的位置,同时也会与其他加入的对象的。方法的返回值处告诉我们插入前是否存在相同元素。相等的对象是否真的相同。总是使用 2 的幂作为哈希表的大小。的 age 字段的升序来排列了。有了对集合内元素的搜索的能力。就不会让加入操作成功。

2024-12-03 20:13:18 35

转载 Java并发常见面试题总结(上)

由于绿色线程和原生线程比起来在使用时有一些限制(比如绿色线程不能直接使用操作系统提供的功能如异步 I/O、只能在一个内核线程上运行无法利用多核),在 JDK 1.2 及以后,Java 线程改为基于原生线程(Native Threads)实现,也就是说 JVM 直接使用操作系统原生的内核级线程(内核线程)来实现 Java 线程,由操作系统内核进行线程的调度和管理。在 Windows 和 Linux 等主流操作系统中,Java 线程采用的是一对一的线程模型,也就是一个 Java 线程对应一个系统内核线程。

2024-11-19 22:28:21 28

转载 Java集合使用注意事项总结

就是起一个模板的作用,指定了返回数组的类型,0 是为了节省空间,因为它只是为了说明返回的类型。方法的时间复杂度也是 O(1),不过,也有很多复杂度不是 O(1) 的,比如。方法,时间复杂度接近于 O(1)(没有出现哈希冲突的时候为 O(1))。方法是通过遍历所有元素的方法来做的,时间复杂度接近是 O(n)。的真正得到的参数就不是数组中的元素,而是数组对象本身!的唯一元素就是这个数组,这也就解释了上面的代码。的简易源码,我们可以看到这个类重写的方法有哪些。方法的可读性更好,并且时间复杂度为 O(1)。

2024-11-13 20:38:34 52

转载 Java集合常见面试题总结(下)

但是,问题是一个 40 亿长度的数组,内存是放不下的。相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。

2024-11-09 11:55:17 56

转载 Java集合常见面试题总结(上)

Java 集合框架中的各种集合类和接口可以存储不同类型和数量的对象,同时还具有多样化的操作方式。总的来说,Java 集合提高了数据的存储和处理灵活性,可以更好地适应现代软件开发中多样化的数据需求,并支持高质量的代码编写。在面试中可能更多的会出现在手撕算法的时候,典型例题包括堆排序、求第 K 大的数、带权图的遍历等,所以需要会熟练使用才行。是 Java 并发包中常用的两种阻塞队列实现,它们都是线程安全的。最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。

2024-11-04 21:00:40 23

转载 Java基础常见面试题总结(下)

类在实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态泛型方法是没有办法使用类上声明的泛型的。举个通俗易懂的例子:公司 H 是一家科技公司,新设计了一款芯片,然后现在需要量产了,而市面上有好几家芯片制造业公司,这个时候,只要 H 公司指定好了这芯片生产的标准(定义好了接口标准),那么这些合作的芯片公司(服务提供者)就按照标准交付自家特色的芯片(提供不同方案的实现,但是给出来的结果是一样的)。

2024-10-30 15:33:24 26

转载 Java基础常见面试题总结(中)

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。如果一个类没有声明构造方法,也可以执行!因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式。

2024-10-21 20:52:31 35

转载 【Java基础】

答:非常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了几个部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 的实现,以及一些闭源的第三方组件,如图形光栅化器,一些开源的第三方组件,如 Rhino,以及一些零碎的东西,如附加文档或第三方字体。的文件),它不面向任何特定的处理器,只面向虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。

2024-10-10 09:35:39 528

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除