- 博客(265)
- 收藏
- 关注
原创 想成为Java架构师?先学会如何画好架构图吧!
技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提高我们的专业能力。当我们想用一张或几张图来描述我们的系统时,是不是经常遇到以下情况:对着画布无从下手、删了又来?用一张图描述我的系统,并且让产品、运营、开发都能看明白?画了一半的图还不清楚受众是谁?画出...
2019-05-12 22:16:15
2194
1
原创 重构:高手的姿势你学不会
软件开发是一门工程技术,其中任何一个技术或技能如果孤立地看都会是管中窥豹,只见一斑。任何一个作者在写书时都有一些前提和细节,然而经常是要不作者没说清楚,要不读者直奔主题而忽略了这些前提和细节,结果是东施效颦,适得其反,照猫画虎不成反类犬。我在和很多人交流重构的时候发现,大家非常注重重构的结果,即重构前后的代码是什么样的,但会忽略重构的姿势。高手重构的姿势老马在书中强调频繁且小步地进行重构:"...
2019-05-10 21:15:12
338
原创 腾讯大牛教你如何使用Java实现二叉树的添加,删除,获取以及遍历
一段来自百度百科的对二叉树的解释:在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是...
2019-05-09 16:59:22
785
1
原创 技巧分享丨可以提高千倍效率的Java代码的35个小技巧
前言代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每...
2019-05-08 15:18:20
394
原创 再不懂ZooKeeper,就安安心心把这篇文章看完
我本人曾经使用过 ZooKeeper 作为 Dubbo 的注册中心,另外在搭建 Solr 集群的时候,我使用到了 ZooKeeper 作为 Solr 集群的管理工具。前几天,总结项目经验的时候,我突然问自己 ZooKeeper 到底是个什么东西?想了半天,脑海中只是简单的能浮现出几句话:Zookeeper 可以被用作注册中心。Zookeeper 是 Hadoop 生态系统的一员。构...
2019-05-07 16:19:00
338
原创 JVM 与 Linux 的内存关系详解
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m。从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用 了),如下图所示。由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了?要分析这个...
2019-05-05 21:52:36
227
原创 Java大学问——优雅地处理异常
一.前言你有没有这样的印象,当你想要更新一款 APP 的时候,它的更新日志里总有这么一两句描述:修复若干 bug杀了某程序员祭天,并成功解决掉他遗留的 bug作为一名负责任的程序员,我们当然希望程序不会出现 bug,因为 bug 出现的越多,间接地证明了我们的编程能力越差,至少领导是这么看的。事实上,领导是不会拿自己的脑袋宣言的:“我们的程序绝不存在任何一个 bug。”但当程序出现 ...
2019-05-05 16:34:45
231
原创 微服务探索与实践—服务注册与发现
前言微服务从大规模使用到现在已经有很多年了,从之前的探索到一步步的不断完善与成熟,微服务已经成为众多架构选择中所必须面对的一个选项。服务注册与发现是相辅相成的,所以一般会合起来思索。其依托组件有很多,比如Zookeeper,Consul,Eureka等等。本文,我们将探讨服务注册和发现的概念及其使用机制,以使得微服务能够在不知道其确切位置(通常是URL)的情况下消费其他服务。由于本文主要是个人...
2019-05-04 17:13:04
458
原创 讲一些你所不知道的Java动态代理
简介Proxy 是设计模式中的一种。当需要在已存在的 class 上添加或修改功能时,可以通过创建 proxy object 来实现通常 proxy object 和被代理对象拥有相同的方法,并且拥有被代理对象的引用,可以调用其方法代理模式应用场景包括在方法执行前后打印和记录日志认证、参数检查lazy instantiation (Hibernate, Mybatis)AOP (t...
2019-05-02 21:24:15
201
原创 讲一些你所不知道的Java动态代理
简介Proxy 是设计模式中的一种。当需要在已存在的 class 上添加或修改功能时,可以通过创建 proxy object 来实现通常 proxy object 和被代理对象拥有相同的方法,并且拥有被代理对象的引用,可以调用其方法代理模式应用场景包括在方法执行前后打印和记录日志认证、参数检查lazy instantiation (Hibernate, Mybatis)AOP (t...
2019-05-02 21:24:06
156
原创 深入学习Java序列化
前言对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了,具体内部实现一直不是很了解,正好这次在重复造RPC的轮子的时候涉及到序列化问题,就抽时间看了下 Java序列化的底层实现,这篇文章算是这次的学习小结吧。第一部分:WhatJava序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。那么为什么需要序...
2019-04-30 16:08:32
227
原创 详解SpringBoot——启动原理及自定义starter
一、引言SpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置。在日常开发中,我们也会自定义一些Starter,特别是现在微服务框架,我们一个项目分成了多个单体项目,而这些单体项目中会引用公司的一些组件,这个时候我们定义Starter,可以使这些单体项目快速搭起,我们只需要关注业务开发...
2019-04-30 11:50:39
957
原创 对于MySQL你必须要了解的锁知识
一、前言MySQL 的锁按照范围可以分为全局锁、表锁、行锁,其中行锁是由数据库引擎实现的,并不是所有的引擎都提供行锁,MyISAM 就不支持行锁,所以文章介绍行锁会以InnoDB引擎为例来介绍行锁。二、全局锁MySQL 提供全局锁来对整个数据库实例加锁。语法:FLUSH TABLES WITH READ LOCK这条语句一般都是用来备份的,当执行这条语句后,数据库所有打开的表都会被...
2019-04-29 11:32:03
195
原创 阿里架构师手写Tomcat——Session源码解析
在 web 开发中,我们经常会用到 Session 来保存会话信息,包括用户信息、权限信息,等等。在这篇文章中,我们将分析 tomcat 容器是如何创建 session、销毁 session,又是如何对 HttpSessionListener 进行事件通知tomcat session 设计分析tomcat session 组件图如下所示,其中Context对应一个webapp应用,每个web...
2019-04-28 20:45:21
273
原创 吐血总结——90%程序员面试都用得上的索引优化手册
目录多关于索引,分为以下几点来讲解:一、索引的概述(什么是索引,索引的优缺点)二、索引的基本使用(创建索引)三、索引的基本原理(面试重点)四、索引的数据结构(B树,hash)五、创建索引的原则(重中之重,面试必问!敬请收藏!)六、百万级别或以上的数据如何删除一、索引的概述Ⅰ、什么是索引?索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数...
2019-04-27 21:54:03
227
原创 哪有什么中年危机,不过是把定目标当成了有计划
一、计划比总结更具有建设性个人以为,计划其实比总结更具有建设性。计划是主动的,总结是被动的。计划首先意味著你有目标,有了目标,才会有决心和动力。人们常常讲求方法与效率的重要性,固然不错,但在方法之前,是方向。“对于盲目航行的帆船,什么风都是逆风。”打个比方,以理财中的储蓄为例——很多人应该有过这样的体会:如果每个月给自己设定一个固定储蓄目标,每次领到工资的第一件事就是把目标金额先存好,一年...
2019-04-27 20:31:48
298
原创 JDK源码——利用模板方法看设计模式
前言:相信很多人都听过一个问题:把大象关进冰箱门,需要几步?第一,把冰箱门打开;第二,把大象放进去;第三,把冰箱门关上。我们可以看见,这个问题的答案回答的很有步骤。接下来我们介绍一种设计模式——模板方法模式,你会发现,它与这个问题的答案实际上有很多共同之处。一、定义定义一个算法骨架,允许子类为一个或多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。二...
2019-04-25 12:28:28
522
原创 面试中可能被问到的常用排序算法
排序算法排序算法是一种比较简单的算法,从我们一开始接触计算机编程开始接触的可能就是排序或者搜索一类的算法,但是因为排序在其他的一些算法中应用较多,所以为了提高性能已经研究了多种排序算法。目前区别排序算法主要还是以时间复杂度,空间复杂度,稳定性等来排序,接下来我们分别分析。稳定性算法区别一个排序算法是否是稳定算法只需看相同的关键字在排序完成后是否保持原来两者的前后关系即可,比如对于[1,2,3...
2019-04-24 17:18:44
227
原创 MySQL的可重复读级别能解决幻读吗
引言之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测试复现这些问题。关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。但是对于幻读,我发现在可重复读的隔离级别下没有出现,当时想到难道是MySQL对幻读做了什么处理?测试:创建一张测试用的表dept:CREATE TABLE `dept` ( `id` int(11) ...
2019-04-24 15:40:58
1337
原创 通过Spring Boot Webflux实现Reactor Kafka
在Apache Kafka简介中,我们研究了分布式流媒体平台Apache Kafka。这一次,我们将关注Reactor Kafka,这个库可以创建从Project Reactor到Kafka Topics的Reactive Streams,反之亦然。我们将使用两个小型示例应用程序,Paymentprocessor Gateway和PaymentValidator。这些应用程序的代码可以在这里找到...
2019-04-24 12:23:09
897
原创 源码泄露到底是裁员报复,还是程序员反抗 996?
“后院”都要失守了,就先别馋大碗宽面了——B 站,你可长点儿心吧!“你的源代码泄露了,还搁这儿吃面?”2019 年 4 月 22 日,B 站(bilibili 弹幕网)官方微博账号内一片风平浪静岁月静好,照常发着安利视频。蹭着吴亦凡的新歌热度,16:56 分的推送是一碗货真价实的“大碗宽面”,但评论里的画风却是清一色的跑题——集体喊话 B 站,“回家看看吧,你家后院被点炮了”!吃面路人一脸...
2019-04-23 21:49:28
251
原创 这样做源码肯定不能被泄露,但你会疯...
今天吃个瓜。昨天下午B站源码竟然被恶意开源,想必很多读者都已吃过。就不在赘述了。不少网友吐槽官方对项目代码安全方面管理不到位也是造成泄露的主要原因。今天就说说关于代码安全方面的事情,真的是企业不够重视项目代码安全或管理不到位吗?算上实习我也是入职过各类有代表性的公司,规模有大有小,性质有国企也有私企。他们对于代码安全方面的管理措施也各不相同。确实有不重视代码安全的企业,但一般也都是些创业型...
2019-04-23 21:10:18
207
原创 面试京东Java架构师,竟然被问这些题,学到了!
前言其实收到jd的面试邀请的时候,我真心有点小激动。因为在地理位置上,jd应该是最合适我也是最想去的。但是我在看到方向的时候其实心里有很多的问题,也做好了被拒的准备。面试过程及感受因为是开车去,所以到亦庄的时候第一个问题是找车位,但是京东周边的马路上是基本不可能找到的了,还看到一个司机因为倒车慢了一点,被另外的小车司机迅速停入,吵吵了半天。最后在一个角落找到一个停车场,需要预约码才能停,门口...
2019-04-23 15:27:38
574
原创 我来告诉你解决死锁的100种方法
死锁是多线程编程或者说是并发编程中的一个经典问题,也是我们在实际工作中很可能会碰到的问题。相信大部分读者对“死锁”这个词都是略有耳闻的,但从我对后端开发岗位的面试情况来看很多同学往往对死锁都还没有系统的了解。虽然“死锁”听起来很高深,但是实际上已经被研究得比较透彻,大部分的解决方法都非常成熟和清晰,所以大家完全不用担心这篇文章的难度。虽然本文是一篇介绍死锁及其解决方式的文章,但是对于多线程程序...
2019-04-22 17:03:32
1251
原创 详解Spring的AOP切面编程
一 、基本理解AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊、解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下。原因很简单,别人的思想终究是别人的,自己的理解才是自己的,尤其当用文字、代码来阐述一遍过后,理解层面上又似乎变得不一样了。博主就不概念化解释AOP了,这里只简单说下为啥要使用这样一种编程思想和相关的AOP技术。其实很简单,就是为了业务模块间的解耦,...
2019-04-22 15:19:43
261
原创 Java必备技能:IDEA一定要懂的32条快捷键
这些IntelliJ IDEA键盘快捷键可以让你专注于编写代码,让你的双手在键盘上起舞。1,搜索文件名↑ Shift 快速连续按两下2,显示便捷提示和快速修复⌘ Cmd + ⤶ Enter3,快速生成代码Control + ⤶ Enter4,选中方法,查看参数信息⌘ Cmd + P5,弹出当前打开的文件列表⌘ Cmd + E6,根据0到9之间的数字,打开各个相应的工具窗口...
2019-04-21 21:42:21
157
原创 大整数相乘“分治法”和“循环暴力法”
前言今天刷到一道很有趣的面试题,感觉很有意思,来分享给大家。题目描述有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。输入描述:空格分隔的两个字符串,代表输入的两个大整数输出描述:输入的乘积,用字符串表示示例1输入72106547548473106236 982161082972751393输出70820244829634538040...
2019-04-21 20:41:00
569
原创 redis源码阅读之集合对象
redis当中集合对象的底层实现为intset和hashtable实现,用hashtable实现时,存储具体值的是key,value统一用NULL。其实集合对象的实现和hash对象的实现还是非常类似的,都是尽可能用占用空间小的底层类型存储,如果实在存不下了,就得鸟枪换炮了老规矩,还是先说转换的条件,由于占地较小的实现为intset,这就导致发生转化的条件比zipmap->hashtable要...
2019-04-18 20:32:06
174
原创 什么是JPA?Java Persistence API简介
作为规范,Java Persistence API关注持久性,它将Java对象的创建过程和具体的创建形式解耦。并非所有Java对象都需要持久化,但大多数应用程序都会保留关键业务对象。JPA规范允许您定义应该保留哪些对象,以及如何在Java应用程序中保留这些对象。JPA本身不是一个工具或框架; 相反,它定义了一组可以由任何工具或框架实现的概念。虽然JPA的对象关系映射(ORM)模型最初基于Hibe...
2019-04-18 16:13:57
1676
原创 Java异常处理:给程序罩一层保险
人这一生,总会遇到一些不可预料的麻烦,这些麻烦可能会让我们遭受沉重的打击。为了减轻因此承受的负担,我们就会买保险。本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?Java为此提供的解决方案是——异常处理机制...
2019-04-17 15:22:56
155
原创 Java工程师的职业生涯应该如何规划
很多人事程序员这个职业的人,在到了30岁以后就会有一大部分想要转行,为什么会出现这种情况呢?程序员无疑是个调薪行业,所有高薪行业都有围城现象,圈外人看高薪,圈内人看苦逼,而真正热爱的人,一定会走下去,直到牛气冲天,比如安全界的tomkeeper、黑哥都是医学界跨过来的大牛。另外一种原因,很多人是喜欢编程才干这一行的,但大多数人是为了糊口才来掺和一下的。混口饭吃和喜欢才去做是完全不同的,所能到达...
2019-04-17 14:34:49
1387
原创 史上最全的Java并发面试题(珍藏版)
多线程java中有几种方法可以实现一个线程?继承Thread类;实现Runnable接口;实现Callable接口通过FutureTask包装器来创建Thread线程;使用ExecutorService、Callable、Future实现有返回结果的多线程(也就是使用了ExecutorService来管理前面的三种方式)。如何停止一个正在运行的线程?使用退出标志,使线程正常退...
2019-04-16 16:51:41
382
原创 这才是高手!Java大牛腾飞指南
编者有言:每个大牛的诞生都是从菜鸟起步的,只是在成长的过程中,他们为自己设立了长期而鉴定的奋斗目标,梳理了清晰而受用的知识架构。用这种知识框架去按部就班地成长,每个人都有成为大牛的可能。本文就将展示一种知识体系的构建方法,希望能够对你有所帮助。面试的时候,我会问面试者,你日常如何构建自己的知识体系,如何让自己更高更快更强?多数工程师并没有深入地思考过这个问题,基本上是零敲碎打,随机性大,基...
2019-04-16 15:46:34
247
原创 宁撞金钟一下,不打破鼓三千,IT人要有志气,要进就进大的好的公司
最近我也在帮一些朋友面试,再结合自身的经验,发现了一个意料之外情理之中的事情:个别挣钱能力一般或规模比较小的公司,对候选人的要求普遍比一些大公司反而高,而且工作时间普遍会比一些好公司要长。比如一个税前15k的高级开发岗位,一些小公司面试起来不仅问的面比较多,而且会要求候选人尽可能多地掌握各种技能,生怕出了这些钱雇来一个不值当的程序员,还最好这个程序员值20k,而且即使应聘成功,在试用期内,一些...
2019-04-15 16:59:31
315
原创 作为面试官,我是如何甄别应聘者的包装程度
一、初选如何鉴别劣质简历培训机构除了提供技术培训,往往还提供简历编写指导、面试指导。很多潜移默化的东西,我们很难甄别。但培训机构包装的简历,存在千遍一律的特征。1、年龄较小却具备高级文凭年龄较小却具备高级文凭,这个或许不能作为一项标准,但是大部分的应聘者,均符合传统文凭的市场情况。个别技术爱好者可能通过自考获得文凭,这种情况需提供独有的技术亮点。2、年龄较大却几乎不具备技术经验年龄较大...
2019-04-15 15:58:14
712
原创 详解Java中的守护线程
线程分类守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程,这是它的作用——而其他的线程只有一种,那就是用户线程。所以java里线程分2种:用户线程:比如垃圾回收线程,就是最典型的守护线程守护线程:就是应用程序里的自定义线程用户线程举例public class UserTest { public static void main(String...
2019-04-14 20:42:03
157
原创 一文讲解Java泛型的本质(非类型擦除)
背景昨天,在逛论坛时遇到个这么个问题,上代码:public class GenericTest { //方法一 public static <T extends Comparable<T>> List<T> sort(List<T> list) { return Arrays.asList(list.toArra...
2019-04-13 12:59:21
150
原创 编程心智——二八定律对软件开发的影响
相信很多人都听说过二八定律,这是一个适用性非常广泛的定律。我发现二八定律同样适用于软件开发,并对其产生了十分深远的影响。这次我想聊聊二八定律是如何影响我们日常的开发工作的,希望通过这个话题来改变一下大家习以为常的开发思维。定义二八定律是19世纪末20世纪初意大利经济学家巴莱多发现的。他认为:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,因此又称二...
2019-04-12 15:19:50
510
原创 程序员怎么快速接手一个项目
可能不管新手老手有些程序员,接手一个项目之后都会多少有些迷惘。以下是本人总结出来的一点小心得,如果错误希望大家给我留言,一起讨论:最重要的事儿如果你总是看见代码多就发愁,看见代码脏乱差就诅咒埋怨,看见代码逻辑复杂就头疼,搞不清调用关系就放弃,那你可能永远也变不成代码的主人,只能一次又一次被代码蹂躏。所以,其实交接代码最重要的事儿,就是:不要被浩渺如烟并且陌生怪诞的代码吓得不敢动弹,现...
2019-04-11 21:36:28
4118
2
原创 你可能不知道,做一名合格的Java程序员,需要哪些必备技能?
对于一个Java开发来说,编程技能毋庸置疑是很重要的。但是,除了基本的编程开发能力,其他方面的能力也是体现一个程序员的能力的很重要因素。比如,问题排查能力、线上运维能力、项目管理能力、协调沟通能力等。本文,主要来简单介绍一下,作为一个合格的Java开发,除了自身技术成长之外,还有哪些方面可以提升。类开发技能第一类,并不是纯coding技能,但是也和开发相关,我称之为类开发技能。Lin...
2019-04-11 15:15:18
221
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人