- 博客(129)
- 收藏
- 关注
原创 中缀表达式求和(只包含+-)
的中缀表达式,请编写一个程序计算并返回该表达式的结果。该表达式中可能会包含多位数字和空格,但不包含其他运算符(如乘法、除法等)。一个有效的中缀表达式,字符串形式。表达式中的数字为非负整数,并用空格隔开(空格可有可无)。支持嵌套括号,且保证括号配对合法。计算表达式的结果,并返回该结果的整数值。
2024-10-16 17:05:16
282
2
原创 端盘子问题(二分查找+广度优先)
终于中午放学铃声打响了,小明想要尽快地前往食堂打自己最喜欢吃的菜。小明觉得,他会准备好若干个盘子再出发,带了几个盘子就打几份菜。但是一路上人群拥挤程度不同,如果太过拥挤,小明会拿不稳太多盘子。经过观察,小明发现食堂的地形可以用一个(1,1)(n,n)小明行走,并且每次可以花费 1 秒,从当前位置(i, j)移动到相邻的(i+1, j)(i, j+1)(i-1, j)或(i, j-1)。(1,1)(n,n)如果无论如何也不能在规定时间内到达终点,输出0。第一行包含两个整数n和Tnn × nT接下来n。
2024-10-16 15:52:56
461
原创 Java虚拟机
程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数。线程共享的区域:主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到老年代区间。
2024-10-14 15:56:10
644
原创 并发编程多线程
全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架,它是构建锁或者其他同步组件的基础框架AQS与Synchronized的区别AQS关键字,c++ 语言实现java 语言实现悲观锁,自动释放锁悲观锁,手动开启和关闭锁竞争激烈都是重量级锁,性能差锁竞争激烈的情况下,提供了多种解决方案AQS常见的实现类ReentrantLock 阻塞式锁Semaphore 信号量CountDownLatch 倒计时锁。
2024-09-22 15:33:34
1389
原创 Java集合相关面试题
Arrays.asList转换list之后,如果修改了数组的内容,list会受影响,因为它的底层使用的Arrays类中的一个内部类ArrayList来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终指向的都是同一个内存地址,list用了toArray转数组后,如果修改了list内容,数组不会影响,当调用了toArray以后,在底层是它是进行了数组的拷贝,跟原来的元素就没啥关系了,所以即使list修改了以后,数组也不受影响。比如原来的顺序是AB,扩容后的顺序是BA,线程二执行结束。
2024-09-14 14:11:43
960
原创 消息队列RabbitMQ
我记得RabbitMQ还有一种方式可以实现延迟队列,在RabbitMQ中安装一个死信插件,这样更方便一些,我们只需要在声明交互机的时候,指定这个就是死信交换机,然后在发送消息的时候直接指定超时时间就行了,相对于死信交换机+TTL要省略了一些步骤。如果消息超时未消费就会变成死信,在RabbitMQ中如果消息成为死信,队列可以绑定一个死信交换机,在死信交换机上可以绑定其他队列,在我们发消息的时候可以按照需求指定TTL的时间,这样就实现了延迟队列的功能了。可以使用RabbitMQ惰性队列,惰性队列的好处主要是。
2024-09-02 22:26:02
634
1
原创 微服务SpringCloud
提供了两种方式:1,创建类实现IRule接口,可以指定负载均衡策略,这个是全局的,对所有的远程调用都起作用2,在客户端的配置文件中,可以配置某一个服务调用的负载均衡策略,只是对配置的这个服务生效远程调用怎么解决这个问题首先一个前提,对于分布式系统而言,分区容错性是一个最基本的要求,因此基本上我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取舍。
2024-09-02 17:01:34
1081
原创 Spring框架
aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等。
2024-09-01 22:58:02
1223
原创 MySQL数据库
索引在项目中还是比较常见的,它是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗其实跟刚才介绍的聚簇索引和非聚簇索引是有关系的,回表的意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表备注:如果面试官直接问回表,则需要先介绍聚簇索引和非聚簇索引】
2024-08-30 22:05:00
1202
原创 Redis缓存
缓存穿透是指查询一个一定的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是redisson实现的布隆过滤器。它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。
2024-08-28 22:54:53
817
原创 11、Redis高级:Key设置、BigKey解决、批处理优化、集群下批处理、慢查询
Key的最佳实践固定格式:[业务名]:[数据名]:[id]足够简短:不超过44字节不包含特殊字符Value的最佳实践:合理的拆分数据,拒绝BigKey选择合适数据结构Hash结构的entry数量不要超过1000设置合理的超时时间并不是很慢的查询才是慢查询,而是:在Redis执行时耗时超过某个阈值的命令,称为慢查询。
2024-08-25 22:11:43
1250
2
原创 10、Redis高级:多级缓存、JVM进程缓存、OpenResty本地缓存、缓存同步Canal
官方网站: https://openresty.org/cn/
2024-08-25 18:13:26
1467
1
原创 08、Redis实战:点赞、UV统计
通常来说UV会比PV大很多,所以衡量同一个网站的访问量,我们需要综合考虑很多因素,所以我们只是单纯的把这两个值作为一个参考值。造成这个问题的原因是,我们现在的逻辑,发起请求只是给数据库+1,所以才会出现这个问题。因为我们的数据是不能重复的,当用户操作过之后,无论他怎么操作,都是。
2024-08-23 18:53:01
730
原创 06、Redis实战:优惠券秒杀、分布式锁Redission、可重入、重试、看门狗、MutiLock
重入问题重入问题是指获取锁的线程,可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,例如在HashTable这样的代码中,它的方法都是使用synchronized修饰的,加入它在一个方法内调用另一个方法,如果此时是不可重入的,那就死锁了。所以可重入锁的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的不可重试我们编写的分布式锁只能尝试一次,失败了就返回false,没有重试机制。但合理的情况应该是:当线程获取锁失败后,他应该能再次尝试获取锁超时释放。
2024-08-22 12:59:22
1427
2
原创 05、Redis实战:优惠券秒杀、全局唯一ID、超买乐观悲观锁、一人一单逻辑、分布式锁、分布式锁的原子性
乐观锁:乐观锁会有一个版本号,每次操作数据会对版本号+1,再提交回数据时,会去校验是否比之前的版本大1 ,如果大1 ,则进行操作成功,这套机制的核心逻辑在于,如果在操作过程中,版本号只比原来大1 ,那么就意味着操作过程中没有人对他进行过修改,他的操作就是安全的,如果不大1,则数据被修改过,当然乐观锁还有一些变种的处理方式比如CAS。但是以上做法依然有问题,因为你调用的方法,其实是this.的方式调用的,事务想要生效,还得利用代理来生效,所以这个地方,我们需要获得原始的事务对象, 来操作事务,这里可以使用。
2024-08-21 22:42:41
934
原创 04、Redis实战:封装工具
方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置逻辑过期时间,用于处理缓存击穿问题。方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间。方法3:根据指定的key查询缓存,并反序列化为指定类型,利用缓存空值的方式解决缓存穿透问题。方法4:根据指定的key查询缓存,并反序列化为指定类型,需要利用逻辑过期解决缓存击穿问题。方法5:根据指定的Key查询缓存,并反序列化为指定类型,需要利用互斥锁解决缓存击穿问题。
2024-08-21 22:38:14
768
原创 03、Redis实战:商户查询缓存、缓存更新策略、缓存穿透、缓存雪崩、缓存击穿
什么是缓存?就像自行车,越野车的避震器举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样;同样,实际开发中,系统也需要"避震器",防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪;这在实际开发中对企业讲,对产品口碑,用户评价都是致命的;所以企业非常重视缓存技术;缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据。
2024-08-21 22:37:09
1320
原创 02、Redis实战:短信登录、Session登录、Redis代替Session
在这个方案中,他确实可以使用对应路径的拦截,同时刷新登录token令牌的存活时间,但是现在这个拦截器他只是拦截需要被拦截的路径,假设当前用户访问了一些不需要拦截的路径,那么这个拦截器就不会生效,所以此时令牌刷新的动作实际上就不会执行,所以这个方案他是存在问题的。
2024-08-21 22:30:50
1006
原创 01、Redis入门:数据类型、基本操作、SpringDataRedis
存储方式关系型数据库基于磁盘进行存储,会有大量的磁盘IO,对性能有一定影响非关系型数据库,他们的操作更多的是依赖于内存来操作,内存的读写速度会非常快,性能自然会好一些扩展性关系型数据库集群模式一般是主从,主从数据一致,起到数据备份的作用,称为垂直扩展。非关系型数据库可以将数据拆分,存储在不同机器上,可以保存海量数据,解决内存大小有限的问题。称为水平扩展。关系型数据库因为表之间存在关联关系,如果做水平扩展会给数据查询带来很多麻烦。
2024-08-20 15:58:54
1020
转载 JVM 学习笔记(二)垃圾回收
当一个对象被引用时,就当引用对象的值加一,当值为 0 时,就表示该对象不被引用,可以被垃圾收集器回收。这个引用计数法听起来不错,但是有一个弊端,如下图所示,循环引用时,两个对象的计数都为1,导致两个对象都无法被释放。JVM 中的垃圾回收器通过可达性分析来探索所有存活的对象扫描堆中的对象,看能否沿着 GC Root 对象为起点的引用链找到该对象,如果找不到,则表示可以回收可以作为 GC Root 的对象public static void main(String[] args) throws IOExcep
2024-08-19 17:20:16
65
转载 JVM 学习笔记(一)内存结构
1)定义JavaVirtualMachine ,Java 程序的运行环境(Java 二进制字节码的运行环境)。2)好处一次编译,处处执行自动的内存管理,垃圾回收机制数组下标越界检查3)比较JVM、JRE、JDK 的关系如下图所示Program Counter Register 程序计数器(寄存器)作用:是记录下一条 jvm 指令的执行地址行号。是线程私有的,每个线程都有一个程序计数器不会存在内存溢出每个线程运行需要的内存空间,称为虚拟机栈。
2024-08-14 22:46:26
56
原创 day12-Apache POI操作Excel.md
Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI 都是用于操作 Excel 文件。银行网银系统导出交易明细各种业务系统导出Excel报表批量导入业务数据。
2024-08-11 15:56:50
289
原创 day11-echarts
Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。官网地址:https://echarts.apache.org/zh/index.html1). 柱形图2). 饼形图3). 折线图**总结:**不管是哪种形式的图形,最本质的东西实际上是数据,它其实是对数据的一种可视化展示。
2024-08-11 15:06:08
422
原创 day10-SpringTask、WebSocket、订单自动处理,客户催单
是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。**定位:**定时任务框架**作用:**定时自动执行某段Java代码为什么要在Java程序中使用Spring Task?1). 信用卡每月还款提醒2). 银行贷款每月还款提醒3). 火车票售票系统处理未支付订单4). 入职纪念日为用户发送通知**强调:**只要是需要定时处理的场景都可以使用Spring TaskWebSocket 是基于 TCP 的一种新的网络协议。
2024-08-11 15:05:41
371
原创 day08-地址管理、订单管理、微信支付
前面的课程已经实现了用户下单,那接下来就是订单支付,就是完成付款功能。支付大家应该都不陌生了,在现实生活中经常购买商品并且使用支付功能来付款,在付款的时候可能使用比较多的就是微信支付和支付宝支付了。在苍穹外卖项目中,选择的就是微信支付这种支付方式。要实现微信支付就需要注册微信支付的一个商户号,这个商户号是必须要有一家企业并且有正规的营业执照。只有具备了这些资质之后,才可以去注册商户号,才能开通支付权限。
2024-08-09 20:53:49
812
原创 day07-SpringCache缓存菜品和套餐、购物车
Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。EHCacheCaffeineRedis(常用)</</</</
2024-08-09 15:31:41
1084
原创 day06-微信小程序、商品显示
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。发送HTTP请求接收响应数据为什么要在Java程序中发送Http请求?有哪些应用场景呢?当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时。
2024-08-08 17:56:17
822
原创 day05 redis入门、店铺开关
Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。**官网:**https://redis.io**中文网:**https://www.redis.net.cn/key-value结构存储:基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。
2024-08-07 22:45:25
435
原创 day02-员工管理、Swapper测试、JWT、ThreadLocal、全局时间转换
ThreadLocal 并不是一个Thread,而是Thread的局部变量。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
2024-08-07 19:02:02
1085
原创 day01-开发环境搭建、git、反向代理负载均衡、Swagger
作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 软件开发流程、角色分工、软件环境 三个方面整体介绍一下软件开发。在开发苍穹外卖这个项目之前,我们需要全方位的来介绍一下当前我们学习的这个项目。接下来,我们将从项目简介、产品原型、技术选型三个方面来介绍苍穹外卖这个项目。
2024-08-07 18:39:00
424
原创 Day-17 Maven高级、分块、聚合、私服
所谓分模块设计,顾名思义指的就是我们在设计一个 Java 项目的时候,将一个 Java 项目拆分成多个模块进行开发。1). 未分模块设计的问题如果项目不分模块,也就意味着所有的业务代码是不是都写在这一个 Java 项目当中。随着这个项目的业务扩张,项目当中的业务功能可能会越来越多。假如我们开发的是一个大型的电商项目,里面可能就包括了商品模块的功能、搜索模块的功能、购物车模块、订单模块、用户中心等等。这些所有的业务代码我们都在一个 Java 项目当中编写。
2024-08-06 17:08:26
933
原创 Day-16 SpringBoot原理
SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。比如:我们要进行事务管理、要进行AOP程序的开发,此时就不需要我们再去手动的声明这些bean对象了,我们直接使用就可以从而大大的简化程序的开发,省去了繁琐的配置操作。运行SpringBoot启动类大家会看到有两个CommonConfig,在第一个CommonConfig类中定义了一个bean对象,bean对象的名字叫reader。
2024-08-06 15:22:13
1262
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人