沙滩de流沙
不积跬步,无以至千里!
既然选择了远方,就要风雨兼程!
展开
-
Caffeine 和 Guava, 本地缓存必备!
因为。原创 2025-01-20 20:51:55 · 117 阅读 · 0 评论 -
Java后端面试场景题汇总
如此大的数据集进行去重(例如50亿数据条目),我们需要考虑内存和存储空间的限制,同时还需要有一个算法。一般来说,这样的数据量无法直接载入内存进行处理,因此需要采用磁盘存储和分布式处理的技术。将数据分为多个批次,每个可以加载到内存中。对每一批数据进行排序和去重,然后存回磁盘。对所有排序且去重后的批次进行归并排序,同时去重。使用哈希函数将数据分配到不同的桶(Bucket)或文件中,确保相同的数据项会落到同一个桶里。对每个桶的数据进行内存中去重操作。原创 2024-12-14 19:05:48 · 1394 阅读 · 0 评论 -
一看就懂:这就是机器学习过程!
一看就懂:这就是机器学习过程!原创 2022-08-29 22:12:38 · 435 阅读 · 0 评论 -
Java中Stream(流式编程)理解与使用
一、使用Stream的好处Stream是Java 8提供的新功能,是对集合(Collection)对象功能的增强,能对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。与Lambda 表达式结合,也可以提高编程效率、简洁性和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利......原创 2020-05-05 21:30:18 · 11267 阅读 · 2 评论 -
spring管理下事务总失效?事务不起作用场景 + 事务隔离策略
为什么要说事务?一方面业务开发中经常要考虑事务,比如调用第三方接口失败时处理本地数据状态是要考虑事务,结算时A账户增加失败时B账户也不能扣款成功。。。总之,在遇到原子性的操作,要成功都成功,要失败都失败的场景时,事务肯定是要考虑的!另一方面,“你有没有遇到事务失效的情况?” 或者 “哪些情况下事务会失效?”已经是面试时的高频问题,都爱问这个,我就被问过!这里学习整理下还是必要的,谁不想以后吊打面试官呢!一、事务失效的情况这里所有的例子都用下面这个更新操作演示: <u..原创 2020-12-20 19:29:34 · 779 阅读 · 0 评论 -
String类你了解多少?
String类型不属于基本数据类型之一,它实际上是对数组的特殊包装,是一个匿名对象。1、String类的两种实例化方式及区别第一种: 直接赋值String str1 = "haha";String str2 = "haha";System.out.println(str1 == str2); //true以上结果是true,也就是虽然定义了两个字符串对象,但实际...原创 2019-09-29 19:05:39 · 497 阅读 · 0 评论 -
Java内存分析图解(内存分类、结合代码的内存分析、内存泄露)
(一)JVM的内存分类首先JVM的内存分为栈内存、堆内存及方法区:栈内存:连续的存储空间,遵循后进先出的原则 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象) 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)堆内存:不连续的空间,用于存放new出的...原创 2019-09-23 12:07:51 · 968 阅读 · 1 评论 -
可重入\不可重入锁?
一、不可重入锁不可重入锁是指当前线程执行中已经获取了锁,如果再次获取该锁时,就会被阻塞。下面我们以wait/notify来设计一个不可重入锁(此外还可以通过CAS + 自旋来实现)://wait、notify实现不可重入锁public class NonReentrantLockDemo1 { //记录是否被锁 private volatile boolean locked = false; public synchronized void lock() { .原创 2021-07-22 08:57:53 · 844 阅读 · 0 评论 -
中介者模式(作用,原理、怎么用、优缺点)
一、为什么要用中介者模式中介者模式核心在于中介者这个角色,理解上可以参考现实中的中介者,中介就跟中间人一样,跟桥梁一样。比方说你到了个陌生的城市,要找工作,要找房子。如果一个人冒冒失失的盲目的找,不仅花费的时间跟精力非常大,即使找到了也不是理想中的。这时候中介就发挥作用了。它会根据你的要求,帮你安排那样的工作适合你,跟用人方取得联系。代码的世界里,如果各个类之间互相依赖,每个类内部引...原创 2020-03-10 18:13:46 · 2982 阅读 · 0 评论 -
单例模式(单例模式作用、常见形式、代码实现)
一、单例模式能干啥?所谓单例,就是整个程序有且仅有一个实例。单例模式定义的单例对象类只能允许一个实例存在。某个类全局只有一个实例对象有什么好处?一方面,由于单例模式只生成一个实例,减少了系统性能开销;另一方面,单例模式存在全局访问点,所以可以优化共享资源访问。比如:网站的计数器,一般也是采用单例模式实现,如果存在多个计数器对象,每一个用户的访问都刷新不同的计数器对象的值,统计总数...原创 2020-02-29 15:39:18 · 1164 阅读 · 0 评论 -
观察者模式 vs 发布订阅模式
一、what is 观察者模式?观察者模式又称为发布订阅模式,它定义了一种一对多的依赖关系,一个被观察者对象会被多个观察者同时监视,当被观察者的状态发生改变,会通知所有观察者,并让其作出相应动作。这种关系和数学里面的函数类似:比如y=2x,当x=1,y=2;x=2,y=4.....;x是自变量,y是因变量。x就对应被观察者,y就对应观察者(这时只有一个观察者,实际生活中或者开发中是多个)。...原创 2020-03-22 23:15:02 · 368 阅读 · 0 评论 -
访问者模式Visitor —— 不出手则已,出手就所向披靡!
大多情况下,都不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。一、什么出手?既然一出手这么牛逼,那到底啥时候才会出手呢?简单的说,就是当系统中存在一个结构比较稳定的对象,但是对它访问的者会经常改变,且不同的访问者并对其访问的操作也不同的时候,可以使用访问者模式。举个例子:前一阵赘婿比较火哈,就好比选女婿,女婿分为金龟婿(有钱的)和经济适用男(人品好可靠的),丈母娘和女朋友选择的标准是不一样的,丈母娘现实一点也希望自己的女儿以后衣食无忧,就会更关注女婿是否买的起房买得起..原创 2021-05-02 22:14:32 · 264 阅读 · 1 评论 -
深入理解策略设计模式
一、what is 策略?百度百科给了“策略”很精简的解释:大白话就是完成目标的方式有很多,根据条件因地制宜选择合适的方式,只要能完成目标就好。“条条大道通罗马”也差不多是这个意思。二、what is 策略模式?策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立,根据不同的需求选择不同的算法(...原创 2020-03-12 14:15:11 · 288 阅读 · 0 评论 -
模板模式 (Template Method Pattern)
一、什么是模板 既然是模板设计思维,那首先要探索一下到底何为模板,搞清楚现实中模板是啥样的,才能进一步把模板抽象化。 一提到模板,我最先想到的是PowerPoint,没错,就是让人头疼的PPT,马上要述职汇报了,PPT确实让人头大~人事的小姐姐已经把汇报的ppt模板发给我们了,我看了下汇报流程,如下:不管你是张三、李四还是王五,都要按照这4个方...原创 2019-11-01 16:53:44 · 424 阅读 · 0 评论 -
状态模式(State Pattern) —— 让你的对象学会72变
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。一、怎么理解一个对象有多个状态?一个对象和多个状态关联,每种状态又对应一种行为,也就是同一个对象会因为状态不同让你觉得这是不是同一个类。比如,手机的HOME键:关机状态: 没有反应。 开机后首次启动: 密码解锁。 非首次启动: 密码解锁或者指纹解锁。 启动后:返回主页面。这里因为手机状态的不同,HOME键就有不同的功能或者行为。同样是HOME键给人们的感觉好像是好多的按键,好像不再是同一个类。也就是说对.原创 2021-04-23 09:41:16 · 195 阅读 · 0 评论 -
外观模式(facade)—— 给一组子系统穿上同一套“衣服”
一、什么是外观模式?外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是高层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种.原创 2021-04-17 10:26:35 · 221 阅读 · 0 评论 -
Java开发(七)大设计原则
一、开闭原则(Open Closed Principle,OCP) 内涵 对修改关闭,对扩展开放。当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。益处 可以提高代码的可复用性:粒度越小,被复用的可能性就越大; 可以提高软件的可维护性:遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护; ...原创 2020-04-16 15:36:09 · 377 阅读 · 1 评论 -
迭代器模式Iterator
迭代器模式提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露其内部的表示。一、为什么需要迭代器?迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如 Java 的 List 、Map 、数组等。对容器对象的访问必然会设计遍历算法,可以将遍历的方法封装在容器中,或者不提供遍历方法。如果将遍历的方法封装到容器中,那么对于容器类来说就承担了过多的功能,容器类不仅仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法,因为遍历状态的存储问题还不能对同一个容器同时进行多个遍历操作原创 2021-04-26 19:11:41 · 161 阅读 · 0 评论 -
建造者模式(Builder pattern)—— 帮你更好的创建复杂对象
建造者模式是将一个复杂对象的构建与它的表示分离,各自独立,同样的构建过程可以有不同的表现。一、你会怎么办?对于复杂对象,那假如一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,你要怎样将这个类实例化?可以有两种方式:比如我们要画一个人,这个人有头、手、脚、身体这些必选项,也有衣服、鞋子、帽子这些可选项。public class PersonDraw1 { // 必选属性 private String head; private String ha.原创 2021-04-20 22:41:30 · 274 阅读 · 1 评论 -
组合模式Composite——树形结构不再头疼
组合模式可以在需要针对“树形结构”进行操作的应用中使用,例如扫描文件夹、渲染网站导航结构等等。一、什么是组合模式?组合模式将一组相似的对象看做一个对象处理,并根据一个树状结构来组合对象,提供一个统一的方法去访问相应的对象,使得用户对单个对象和组合对象的使用具有一致性。很抽象对吧,那就到了举例子的时候: 公司组织关系树 公司组织关系可能分为部门与人,其中人属于部门,有的人有下属,有的人没有下属。如果我们统一将部门、人抽象为组织节点,就可以方便的统计某个部门下有多少人、财务数据等等,原创 2021-04-25 20:35:42 · 358 阅读 · 0 评论 -
装饰模式(Decorator)——给类增加额外功能
一、先看个例子给一个人搭配不同的服饰,代码可以这样写:二、装饰模式结构装饰模式,动态的给一个对象添加一些额外的功能,就增加功能来说,装饰模式比生成子类更灵活。Component 接口杰(或抽象类)就是来定义动态添加的职责。ConcreteComponent 是具体对象,具体实现要添加的职责。Decorator 装饰抽象类,继承了Component,且持有Component对象。三、装饰模式代码实现...原创 2021-04-12 22:25:17 · 265 阅读 · 0 评论 -
工厂模式(简单工厂模式、工厂模式、抽象工厂模式)
“在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。”,这句话应该是工厂模式的高度概括。该模式用于封装和管理对象的创建,是一种创建型模式。一、工厂模式的分类:根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂抽象程度可分为工厂方法模式和抽象工厂模式。1....原创 2020-02-25 22:32:48 · 591 阅读 · 0 评论 -
解释器模式 Interpreter —— 让你拥有最终解释权!
给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释文法中的句子。一、什么是解释器模式?解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。诸如此类的例子也有很多,比如编译器、正则表达式等等。如正则表达式,它就是解释器模型的一种应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。如果一种特定类型的问题发生的.原创 2021-05-04 12:52:56 · 361 阅读 · 1 评论 -
享元模式Flyweight —— 将拿来主义进行到底!
在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。主要用于减少创建对象的数量,以减少内存占用和提高性能。一、什么是享元模式?在开发中会出现重复使用同一个对象的情况,每次使用都new一个对象出来。这样的话对于内存来说就需要多次反复的申请内存了,触发GC的频率高了会影响JVM的效率。那么能不能创建new一个对象,然后使用的时候就共同使用一个就好了。这也就是享元模式的含义所在了——共享一个对象。因此享元模式主原创 2021-04-29 23:25:42 · 207 阅读 · 1 评论 -
代理模式(静态代理模式、动态代理模式、cgLib代理模式、拦截器)
一、什么是代理?现实生活中有哪些例子?比如:买房子找中介、打官司找律师等,都是代理模式,都不是你自己直接去干这件事,自己只负责付钱或者出庭,其它前期准备工作及收尾工作交个代理去完成。代理模式包含三个角色:目标对象 代理对象 用户二、代理的好处编程中有个思想:即开闭原则,对修改关闭,对扩展开放。代理模式通过代理对象访问目标对象,可以在不修改目标对象的基础上,给目标对象...原创 2020-02-29 22:47:51 · 508 阅读 · 0 评论 -
适配器模式Adapter Pattern——谁说两个接口风马牛不相及!
在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。一、先从一个问题说起之前负责的项目中遇到过一个问题:在InterceptorAdapter拦截器中对请求进行验证,把验证信息传给日志服务平台做统计。正常普通接口请求,request.getParameter()可以获取,能多次读取。但是,如果我们的接口是用@RequestBody来接受数据,就会报异常:java.io.IOException: Stream closed。..原创 2021-04-23 23:39:53 · 286 阅读 · 0 评论 -
备忘录模式Memento——给你的对象一剂“后悔药”
备忘录模式在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。一、备忘录模式我们编辑word文档、写这篇博客的时候,经常用到 ctrl+z 这个快捷键,就是撤销当前操作回到上一步编辑状态。还有一些线上考试系统,在考到中间的时候退出,再重进还能在上一次的基础上接着做题。这里面都有一个环节,那就是回复到之前的某个节点,这个怎么实现的呢?其中一种方式就是通过备忘录模式去实现,它能保存对象当前状态,并在之后恢复到此状态(后悔药),当然它原创 2021-04-25 19:53:21 · 206 阅读 · 0 评论 -
命令模式Command —— 我不认识你,但我可以命令你
命令模式的核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法。一、什么是命名模式?命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。命令模式包含如下角色: Receiver接收者角色 命令接收者模式,命令传递到这里执行对应的操作。 Command命令角色 需要执行的命令都在这里声明 Inv.原创 2021-04-29 22:30:37 · 311 阅读 · 0 评论 -
桥接模式 bridge —— 关注多维场景!
类比于二维平面的坐标,或多维坐标。"桥"将多个维度的接口(或实现)连接起来,构成新的产品。一、什么是桥接模式?为什么关注的是多维的?因为当某个类具有两个或两个以上的维度变化,若仅用继承将无法实现这种需要,或会使得设计变得相当臃肿。这个多维度变化怎么理解?正好前几天新房到手要装修了,准备买个热水器,就以热水器为例,热水器有很多的品牌(海尔、格力等),每个品牌下按加热原理热水器也有很多类型(燃气、电、太阳能等),也就是说要挑选一个热水器要经过两个维度:一个是选啥品牌、一个是选啥加热类型。原创 2021-05-04 10:52:32 · 310 阅读 · 0 评论 -
责任链模式(Chain of Responsibility Pattern)—— 嵌套拦截器
一、what is 责任链模式?我前面的文章介绍过动态代理模式,该模式设计者只需要向开发者暴露拦截器即可。当有多个拦截器时,就衍生出了责任链。什么是责任链?比如请假流程:请假单看成对象,你要请假需要经过开发经理、部门经理、人事部门负责人等多个环节,每个环节的人都可以拦截你的请假申请单进行修改或审批,这里把每个环节都看成拦截器的话,总共有三个拦截器。一个对象在一条链上被多个拦截器处...原创 2020-03-22 22:19:38 · 484 阅读 · 0 评论 -
原型模式(Prototype) —— 就是复制那回事
一、什么是原型模式?原型模式:就是去拷贝复制原型对象再创建另一个对象。我看网上都是用简历来举例子,挺形象的那我们也用简历吧,都知道要针对不同的公司准备不同的简历,那一个人可能会有不同的简历:public class Resume { private String name; private String position; private int salary; public String getName() { return nam..原创 2021-04-15 22:06:46 · 297 阅读 · 0 评论 -
Redis的基本数据类型及其底层实现原理
最近去面试,面试官都会先问:Redis中有哪些数据类型?接着就会问你知道某个类型的底层实现么?现在一块来了解下。四、Redis支持的6种数据类型三种特殊数据类型:1.geospatial: Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。2.hyperloglog:基数:数学上集合的元素个数,是不能重复的。这个数据结构常用于统计网站的 UV。3.bitmap: bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状原创 2021-10-03 12:31:34 · 3338 阅读 · 0 评论 -
分布式限流方案
一、限流算法主要的限流算法包含:漏桶算法、令牌桶算法、计数器 。每种限流算法详细可以参考这里二、分布式限流方案一般也就分为三种:Gateway限流,redis+lua实现限流,nginx限流 。2.1 Gateway限流Spring Cloud Gateway 中提供了 RequestRateLimiterGatewayFilterFactory 类,这个是基于令牌桶实现的。它内置RedisReteLimiter,依赖于Redis存储限流配置和统计数据,也可以通过继承org.spri.原创 2021-09-24 18:09:03 · 919 阅读 · 0 评论 -
Spring Cloud 核心组件协作及原理
SpringCloud不能只停留在使用的层面,其底层的很多原理也需要去知晓。业务举例:一、Eureka如上图所示,库存服务、仓储服务、积分服务中都有一个EurekaClient组件,这个组件专门负责将这个服务的信息注册到EurekaServer中。说白了,就是告诉EurekaServer,自己在哪台机器上,监听着哪个端口。而EurekaServer是一个注册中心,里面有一个注册表,保存了各服务所在的机器和端口号。比如订单服务里的EurekaClient组件,它会找EurekaS原创 2021-09-14 21:39:31 · 497 阅读 · 0 评论 -
如何引用 application.yml 或者 application.properties 之外的其它配置文件?
我们都知道 @Value 和 @ConfigurationProperties 获取默认配置文件的属性值,也就是application.yml或者application.properties的属性值。若想引用其它配置文件里的属性值怎么办呢?可以使用 @PropertySource + @ConfigurationProperties 去实现。一、 新建配置文件新建一个user.properties的配置文件:user.userName= rootuser.isAdmin= trueuse原创 2021-06-19 17:39:10 · 2513 阅读 · 0 评论 -
实现定时任务的 6 种方式,一网打尽!
实现定时任务有5种方式:使用线程创建定时任务使用 TimerTask 创建定时任务使用线程池创建定时任务使用 Quartz 框架实现定时任务使用 @Scheduled 注解实现定时任务xxl-job 实现分布式定时任务一、使用线程创建定时任务public class ThreadTask { public static class Demo01 { static long count = 0; public static void main原创 2021-06-18 21:01:32 · 13215 阅读 · 1 评论 -
代码逆向生成 —— mybatis-generator-maven-plugin
根据表结构自动生成mapper、xml、实体类。使用mybatis-generator-maven-plugin。步骤:(1)引入插件原创 2021-06-04 22:31:16 · 1046 阅读 · 2 评论 -
IDEA中用过且好用的插件及使用方法
插件旨在提高效率,但是好用、安全是前提。各插件的安装就不介绍了,拷贝插件名字去市场找到然后Install就行了 。一、Mybatis-log这个插件是把mybatis使用log4j打印执行的sql语句转换成可执行的sql语句:选中Preparing与Parameters部分的sql语句,点击2所示选项,就可生成可执行的sql语句,如下:二、GsonFormat-Plus这个是在GsonFormat插件基础上的二次开发,用于快速将JSON字符串转换为实体类。...原创 2021-05-27 15:03:42 · 395 阅读 · 0 评论 -
自定义注解实现参数验证 —— @Constraint 注解
一、一般的参数校验怎么做的?我们知道在Post接受一个对象参数的时候可以使用 @Valid 去验证,然后通过统一异常处理,直接返回给前端,不用在业务代码中对这些参数进行校验。且约束的类型也有很多,比如:@Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的..原创 2021-05-05 12:39:57 · 1693 阅读 · 0 评论 -
NotePad++ 快捷键操作
一、匹配以某字符开头某一行(?:^|\n)字符位置.* 比如(?:^|\n)prompt.*表示以prompt开头的这一行字符串二、匹配以a字符串开头,b字符串结尾的字符,中间不管a字符串位置(.+?)b字符串位置 ,比如 匹配以to_date开头,以 ), 字符串结尾的字符串 ====》 to_date(.+?)\), 即可,注意对)进行转义。注意很多字符有特殊意义,要加上\来转义。三、匹配行首、行尾$表示行尾,^表示行首。可以结合替换来在行首...原创 2021-04-27 17:23:19 · 330 阅读 · 0 评论