- 博客(532)
- 收藏
- 关注
原创 去哪儿网北京Java开发一、二、HR面全部通过
10.20一天面完三面技术面一面自我介绍,二面无简要介绍项目以及项目过程中遇到的问题项目拓展问题 Redis和MySQL缓存一致性问题和解决策略(旁路缓存 / 延时双删) Redis键删除策略(定时、惰性),策略的特点和优劣(定时内存友好,惰性CPU友好) 项目用到的Redis数据结构(继续深入介绍项目) 场景:存储一件商品的信息,最适用的Redis数据结构(Hash) 缓存采用Redis的原因(内存型、速度快),如何判断比直接使用SQL查询快.
2021-11-01 11:35:44
3484
25
原创 DDD实战与进阶学习之值对象
DDD实战与进阶 - 值对象整体思路:在实现此效果之前,我们先来捋一下思路,用思维导图来设计一下我们的实现步骤,如下:你可以审查元素,下载数字背景图片,复制图片地址,或者使用其他背景图片、背景颜色然后作者用“地址”这一概念给大家扩充了一下什么是值对象,我们应该怎么去发现值对象。所以你会发现现在很多的DDD文章中都是用这个例子给大家来解释。当然读懂了的人就会有一种醍醐灌顶的...
2019-11-28 18:21:52
889
原创 Java多线程看这一篇就足够了(吐血超详细总结)
进程与线程进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多进程操作系统能同时达运行多个进程(程序),由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并...
2019-11-28 14:57:01
1032
原创 Spring Security框架下实现两周内自动登录"记住我"功能
本文是Spring Security系列中的一篇。在上一篇文章中,我们通过实现UserDetailsService和UserDetails接口,实现了动态的从数据库加载用户、角色、权限相关信息,从而实现了登录及授权相关的功能。这一节就在此基础上新增,登录过程中经常使用的“记住我”功能,也就是我们经常会在各种网站登陆时见到的"两周内免登录",“三天内免登录”的功能。该功能的作用就是:当我们登录成功之...
2019-11-28 14:56:31
738
原创 Java多线程详解(一)Java多线程入门
最近听很多面试的小伙伴说,网上往往是一篇一篇的Java多线程的文章,除了书籍没有什么学习多线程的一系列文章。但是仅仅凭借一两篇文章很难对多线程有系统的学习,而且面试的时候多线程这方面的知识往往也是考察的重点,所以考虑之下决定写一系列关于Java多线程的文章。文章参考了高老师的《Java多线程编程核心技术》。力争使用最短的篇幅把Java多线程的知识作以系统的讲述。本节思维导图:思维导图...
2019-11-27 20:18:20
2310
5
原创 程序员的迷茫,迷茫的程序员
程序员的迷茫来自于多种因素吧,层出不穷的技术,层出不穷的各种大牛的的培训课,感觉不去学习,好像就要被这个时代抛弃,想学习,又眉毛胡子一把抓,今天看两眼这个,明天看两眼那个。最后把自己折腾的很累。感觉一直很忙,却收效甚微。身边的朋友充斥着各种年龄大了,然后就想转管理…每个人的迷茫不同,或许以下几点能让你的迷茫减轻一些.目标感:没有对自己的职业规划设置目标也很容易迷失自己,造成眉毛胡子一把抓的...
2019-08-07 09:02:53
622
原创 树状数组入门(简单的原理讲解)
树状数组可以解决什么样的问题:这里通过一个简单的题目展开介绍,先输入一个长度为n的数组,然后我们有如下两种操作:输入一个数m,输出数组中下标1~m的前缀和 对某个指定下标的数进行值的修改多次执行上述两种操作寻常方法对于一个的数组,如果需要求1~m的前缀和我们可以将其从下标1开始对m个数进行求和,对于n次操作,时间复杂度是O(n^2),对于值的修改,我们可以直接通过下标找到要修改的...
2019-08-01 13:56:17
361
原创 springBoot的过滤器,监听器,拦截器
概述 在开发中,我们经常要考虑一些问题,对敏感词进行过滤,用户是否已经登录,是否需要对他的请求进行拦截,或者领导问现在在线人数有多少人?我们如何实现这些功能哪@WebFilterpackage com.xmlxy.firstspringbootproject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;...
2019-07-31 15:08:35
367
原创 Maven中央仓库发布历程
一、前言最近自己在学习Spring boot的过程中开发了一个组件multithreadpool-spring-boot-starter,通过这个组件,我们可以动态根据配置文件进行多个线程池的初始化。既然有这个产出后,肯定是希望能够上传到maven中央仓库,给更多的人使用,于是就产生了这次项目发布经历。整个过程可谓是一波三折,由于平时工作比较忙只能晚上花一个小时搞,所以在经历了近一周的时...
2019-07-31 12:49:06
419
原创 听说小米进入世界500强啦?解读历年500强数据了解国情
前言:前几天看到新闻才知道今年的500强已经出炉了,后面又看到小米首次进榜,第468名,雷军蜀黍开心的像个只有几十亿元的小孩子。还特意发了好几条微博:据说进入世界五百强之后都是这样的:视频放不出来,请移步公众号观看我后面对这个五百强很感兴趣,于是就抓了财富杂志公布的历年来的500强信息分析了一下,发现很多有用的信息。财富杂志自1995年开始发布500强榜单,至今25年,...
2019-07-30 15:32:11
590
1
原创 程序员创业之如何获取第一笔风险投资
假定你已经准备好了你的产品(不管是虚拟的还是现实的),想好了你的商业模式,接下来我们就来讨论一下如何获取第一笔风险投资。融资三步骤:我简单的归纳成9个字: 做不做,做多大,怎么做。我们来分别讲解。步骤一、决定做不做(要不要融资)首先要有一个清楚的认识,创业是一件很困难的事。我指的是创立一个正经企业,而不是半年后一定会倒闭的咖啡店 :)如果还没有清楚的认识,建...
2019-07-30 10:48:08
440
原创 一个Java程序员该有的良好品质
一、前言多年来,在IT领域,从一个普通的程序员到一个技术主管,再到一个技术经理,再到一个技术主管,他们践踏了许多坑,劳累了许多课程,还背着许多罐子。在提高他们的技术和管理能力的同时,他们一直在考虑如何作为IT技术从业人员这样做。这个领域发展得更好。随着年龄的增长,我们可以平静地应付所谓的“中年危机”,或者IT技术人员的自我培养。我们该怎么办?本文不是关于所谓成功人士的经验(作者离他对成功的理解...
2019-07-30 08:26:48
2065
5
原创 查找算法吐血超详细总结
源代码地址首先我们会使用符号表这个词来描述一张抽象的表格。 我们将信息(值)储存在里面,然后通过特定的键来搜索并获取这些信息。那么首先我们来定义这个符号表的抽象类。public abstract class AbstractST<Key extends Comparable<Key>,Value>{ /** * 将键值存入表中 * @...
2019-07-29 12:39:15
379
原创 Java工具Lombok的使用和原理详解
Lombok 是一款好用顺手的工具,就像 Google Guava 一样,在此予以强烈推荐,每一个Java工程师都应该使用它。Lombok 是一种 Java 实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及...
2019-07-29 09:56:52
1026
原创 Java创建实例方法的区别
近来打算自己封装一个比较方便读写的Office Excel 工具类,前面已经写了一些,比较粗糙本就计划重构一下,刚好公司的电商APP后台原有的导出Excel实现出现了可怕的性能问题,600行的数据生成Excel工作簿居然需要50秒以上,客户端连接都被熔断了还没导出来,挺巧,那就一起解决吧。对于消息中间件RabbitMQ,想必各位小伙伴没有用过、也该有听过,它是一款目前市面上应用相当广泛的消息中...
2019-07-28 14:52:46
478
原创 final、finally和finalize的区别总结
1、finalFinal可以用于成员变量(包括方法参数),方法、类。Final成员 作为变量变量一旦被初始化便不可改变(对于基本类型,指的是值不变;对于对象类型,指的是引用不变),初始化只可能在两个地方:定义处和构造函数。作为方法参数对于基本类型,定义成final参数没有什么意义,因为基本类型就是传值,不会影响调用语句中的变量;对于对象类型,在方法中如果参数确认不需要改变时,定...
2019-02-07 15:47:23
1846
原创 SpringMVC工作原理详解
SpringMVC的工作原理图:SpringMVC流程1、 用户发送请求至前端控制器DispatcherServlet。2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet...
2019-02-06 11:38:13
639
原创 并发、并行傻傻分不清楚?
今天,我们正在解决一个问题:同时的,同时的愚蠢的困惑?线程在其生命周期中经历了什么?知识给你解答生活中所有困难的问题。=concurrent和parallel==并发是指在一定时间内,多任务交替处理的能力。并行性是指同时处理多个任务的能力。案例:当一个商场的销售员需要面对许多顾客时,有些顾客要求价格,有些顾客要求质量。这时,业务员需要不断地回答客户,不断地改变话题,记住前面的话...
2019-01-29 17:51:25
313
原创 Java并发编程之阻塞队列与Fork/Join框架
阻塞队列阻塞队列是支持两个附加操作的队列。这两个附加操作支持阻塞插入和移除方法:阻塞启用的插入:当队列满时,它会阻塞插入元素的线程,直到队列不满意为止。 阻塞删除:当队列为空时,检索元素的线程等待队列变为非空。阻塞队列通常用于生产者-消费者场景。生产者是向队列添加元素的线程,使用者是将元素从队列中取出的线程,阻塞队列是存储和检索元素的容器。阻塞队列的4种处理方式:抛出异常: ...
2019-01-04 11:30:46
564
原创 Java数据流的所有应用场景全面总结
数据流是一种数据分发技术。数据生成器将数据记录写入顺序数据流。数据使用者可以按照相同的顺序从数据流中读取数据。这是一个用于数据生产者、数据流和数据消费者的简单数据流图: 数据流可以有很多变量从“表面”的角度来看,数据流是一个非常简单的概念。数据生产者将记录存储在数据流中,然后消费者可以读取这些数据流。然而,通过这个图面,我们可以看到仍然有一些细节会影响数据流系统的“外观”,这...
2019-01-02 15:23:31
1832
原创 Java Stream API实用指南
StreamAPI是在Java 8中引入的。它提供了一种声明性编程方法,用于迭代和执行集合上的操作。在Java 7及之前版本中,for和for each是唯一遍历集合的可用选项,这是一种 命令式编程方法。在本文中,我将向您介绍StreamAPI以及它如何提供对集合执行的常见操作的抽象。在使用命令式编程时,开发人员使用语言结构来编写 要执行的操作和操作方法。在使用声明性编程时,开发人员必须只关注...
2018-12-17 16:44:00
276
原创 记一位朋友斩获BAT技术专家Offer的面试经历
背景介绍PS:面试者是笔者以前的下属,多年的好朋友。这是他今年早些时候出去面试,拿到BAT等多家一线互联网公司技术专家Offer的面试经历。先介绍一下这位朋友的个人经历:本科毕业,接近10年工作经验。跳槽之前,在国内某大型互联网公司里带一个8人左右的技术团队。 由于公司业务发展较为平缓,所以职业上升机会较少。 朋友对其负责的系统架构和技术已经非常熟悉,薪资上也较难有大幅度的...
2018-12-17 09:26:56
1359
1
原创 Spring AOP用法详解
什么是AOPAOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需 要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定...
2018-12-16 10:43:35
746
原创 SLF4J源码解析(一)
提出问题阅读源码之前,首先提几个问题SLF4J是如何整合不同的日志框架的 Class Path中为什么只能有且仅有一种日志框架的binding这段文字摘录自官网:In your code, in addition to slf4j-api-1.8.0-beta2.jar, you simply drop one and only one binding of your choice ...
2018-12-15 14:19:56
481
原创 全面解析Java HashMap类
HashMap也是一个常用的Java集合框架类,它涉及大量的知识,包括数组、链表、红黑树等,以及一些高效而巧妙的计算,并且这个类已经被改进了几个版本,不同版本之间也有一些差异,这里都是基于JDK8的源代码。像通常的源代码翻译一样,看看能否回答以下问题?(有些地方真的很难翻译,看看就知道了。)问题 1:HashMap 中的 initCapacity、size、threshold、loadFact...
2018-12-15 10:26:50
293
原创 Java第三方支付接入案例(支付宝)
开源项目链接Kitty 开源权限管理系统项目地址:https://gitee.com/liuge1988/kitty演示地址:http://139.196.87.48:9002/kitty用户名:admin 密码:admin注册沙箱账号到蚂蚁金服注册开发者账号,注册地址:https://open.alipay.com,用你的 支付宝 账号扫码登录,完善个人信息,选择服务类型...
2018-12-14 19:03:37
3886
1
原创 Java NIO之Selector
这篇文章来介绍一下另一个比较重要的概念----Selector。我们知道系统线程的切换是消耗系统资源的,如果我们每一个连接都用一个线程来管理,资源的开销会非常大,这个时候就可以用Selector。通过Selector可以实现一个线程管理多个Channel,如下图: Selector使用打开使用之前获得一个Selector对象Selector selector = Sele...
2018-12-14 14:30:06
332
原创 Linux 驱动程序入门
驱动是具有入口和出口的一组方法的集合,这一组方法才是驱动的核心内容。对于字符设备驱动程序,最核心的就是 file_operation 结构,这个结构实际上是提供给虚拟文件系统 [ VFS ] 的文件接口,它的每一个成员函数一般都对应一个系统调用。用户进程利用系统调用对设备文件进行诸如读和写操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序。可根据这篇 https://www.cnb...
2018-12-13 15:14:03
665
原创 Java内存模型详解
一、Java内存模型硬件处理电脑硬件,我们知道有用于计算的cpu、辅助运算的内存、以及硬盘还有进行数据传输的数据总线。在程序执行中很多都是内存计算,cpu为了更快的进行计算会有高速缓存,最后同步至主内存,大概的交互如下图为了使处理器内部的运算单元能够被充分的利用,处理器可能会对输入代码进行乱序执行优化,然后将计算后的结果进行重组,保证该结果和顺序执行的结果是一致的(单位时间内,一个...
2018-12-13 14:57:20
254
原创 Java并发数据结构的基础
Java的并发能力的基础是Park()和unPark()方法、易失性变量、同步化、CAS操作和AQS队列。进入这些知识点并不容易。本节中提到的与锁相关的知识并不特别完整,还有许多细节我还没有完全理解,因此让我们稍后讨论关于锁的更多细节。线程阻塞原语Java的线程阻塞和唤醒是通过不安全的类公园和不停机方法实现的。这些方法都是本机方法,是C语言实现的核心功能。Park意味着停车,它允许...
2018-12-13 14:34:29
574
原创 系统架构中为什么要引入消息中间件?
“在本文的开头,我们将讨论消息中间件的高频访问问题,它也将涵盖MQ中间件的一些常见技术问题。如果面试官看了你的简历中使用MQ中间件的经历,可能会有以下问题:在你的公司的生产环境中使用了什么消息中间件?为什么要将消息中间件引入系统?引入消息中间件的优点和缺点是什么?好,让我们逐一分析。一、你们公司生产环境用的是什么消息中间件?首先,您可以说您的公司选择了哪种消息中间件,比如Rabbit MQ...
2018-12-13 12:15:41
1944
2
原创 Java重点基础:反射机制
一、什么是反射?Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。二、反射的三种方式这里需要跟大家说一下,所谓反射其实是获取类的字节码文件,也就是.class文件,那么我们就可以通过Class这个对象进行获取。1、第一种方式...
2018-12-13 11:13:55
241
原创 从源代码的角度理解Java设计模式的装饰模式
一、装饰模式介绍修饰符模式定义:不改变原始对象的附加函数比生成子类更灵活。适用场景:动态的给一个对象添加或者撤销功能。优点:它能够在不改变原有对象的情况下动态扩展函数,使扩展函数按照期望的顺序执行,达到不同的效果。缺点:更多的类,使程序复杂类型:结构型。类图:源码分析中的典型应用Java I/O 中的装饰者模式 Spring Session 中的装饰者模式 ...
2018-12-12 13:40:04
268
2
原创 String居然还能这样玩!
Java 11 增加了一系列的字符串处理方法,如以下所示。// 判断字符串是否为空白" ".isBlank(); // true// 去除首尾空格" Javastack ".strip(); // "Javastack"// 去除尾部空格 " Javastack ".stripTrailing(); // " Javastack...
2018-12-12 13:32:37
257
2
原创 你不可不知的Java引用类型之ReferenceQueue源码详解
定义引用队列是用于存储要回收的引用对象的引用队列。说明对于软引用、弱引用和虚拟引用,如果希望在垃圾收集器回收对象以进行其他处理时得到通知,则需要使用引用队列。当垃圾收集器扫描要回收的对象时,将对应的引用包装器类(引用对象)放入其注册的引用队列队列中。可以从队列中获得相应的对象信息,并且可以同时进行附加处理。例如,反向操作、数据清理、资源释放等。使用例子public cla...
2018-12-11 21:35:11
279
原创 浅析Java中的四种线程池
1.使用线程池的好处 2.JUC中几种常用的线程池java.util.concurrent包下的Executors工厂类,提供了一系列的线程池的创建方法,其构造方法如下:public ThreadPoolExecutor(int corePoolSize, //线程池线程核心数量,线程池维护线程的最少数量 ...
2018-12-11 19:20:35
224
原创 Java如何实现哈夫曼编码
哈夫曼树既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 哈夫曼编码在日常计算机的使用中,我们一定会出现下面这种情况:假如给定a、b、c、d、e五个字符,它们在文本中出现的概率如下...
2018-12-08 20:04:03
2413
原创 volatile关键字全面解析
在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,深入地话还可以考察JVM底层实现以及操作系统的相关知识。下面我们以一次假想的面试过程,来深入了解下volitile关键字吧!面试官: Java并发这块了解的怎么样?说说你对vola...
2018-12-08 14:22:41
281
原创 从Spring到SpringBoot构建WEB MVC核心配置详解
理解Spring WEB MVC架构的演变基础Servlet架构核心架构:前端控制器Spring WEB MVC架构认识Spring WEB MVC传统时代的Spring WEB MVC怎么讲呢?就是很传统的使用Spring Framework WEB MVC的方式,例如Bean配置在xml中,前端控制器配置在web.xml中等。Maven 依赖 ...
2018-12-07 19:33:04
235
原创 Java注解(annotation)机制
前言jdk1.5引入了注解机制(Annotation),用于对java里面的元素(如:Class、Method、Field等等)进行标记。同时,java的反射类库也加入了对Annotation的支持,因此我们可以利用反射来对特殊的Annotation进行特殊的处理,增强代码的语义。本文主要是对Annotation的语法和Annotation的用法进行分析阐述。然后对一些java自带的、常用...
2018-12-07 16:23:47
272
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人