自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java NIO 底层原理

Java NIO 底层原理

2020-07-06 16:51:52 302

原创 equals方法的姐妹篇——如何实现高效的hashCode方法

1、何时实现hashCode方法hashCode跟equals一样,都是基类Object中的一个方法。而什么时候该重写hashCode方法呢?其实这个问题的答案我们也许都知道,就是我们的类需要使用到集合框架时,绝大多数情况都要实现equals和hashCode方法,而不能只实现这两个方法其中一个。为什么呢?我们可以看一个例子:public class Goods { public int ...

2020-04-19 13:36:55 289

原创 契约测试 No stubs or contracts were found for [XXX]问题解决

1、问题最近在学习契约测试,用到的是spring-cloud-contract,网上有很多教程,便试着照葫芦画瓢的方式,来实现一遍。由提供者建立契约、生成存根,然后把存根交给消费方测试时,抛出了一个异常No stubs or contracts were found for [XXX],详细异常如下:Caused by: org.eclipse.aether.resolution.Artifa...

2020-04-19 10:38:56 858

原创 听说你还不会实现equals方法?收藏这篇文章就够了!

1、何时需要重写equals相信javaer们应该都知道equals方法,它是基类大佬Object中的一个方法,所以java下面所有的类都“自带”这个方法。看方法名就知道,意图就是对比传入的目标对象, 跟自己是否“相等”。我们先看看这个方法在Object类中的实现: public boolean equals(Object obj) { return (this == o...

2020-04-12 14:58:48 381

原创 带你用广度优先搜索实现地铁计费功能

文章目录1、地铁是如何实现收费的?1.1 数组实现方式1.2 无向图实现方式2、广度优先搜索找到两个站点最短路径2.1 构建站点对象2.2 用邻接表构造地铁无向图2.3 建立搜索类2.4 测试站点距离计算2.5 为什么广度优先搜索的路径是最短路径3、广度优先搜索的性能3.1 时间复杂度3.2 空间复杂度4、实现更好的地铁计费系统5、本文源码地址1、地铁是如何实现收费的?我们平时坐地铁去上班的时...

2020-04-05 22:59:19 1036

原创 Spring Data Redis事务的正确使用姿势

之前使用Spring Data Redis的时候,由于使用不当,导致redis连接不释放的血案。现在来总结下Spring Data Redis事务的两种使用方式。1、execute(SessionCallback session)方法我们都知道Redis的事务的命令主要有multi、exec、discard和watch,在RedisTemplate中也是对应的有这几种方法 public i...

2020-03-26 15:08:55 1965

原创 为什么HotspotJVM垃圾回收中的“标记-复制”算法需要两个survivor空间?

一、提出问题如题,为什么HotspotJVM垃圾回收中的“标记-复制”算法需要两个survivor空间?为什么要强调Hotspot JVM呢,因为JVM有很多种,每种JVM的实现方式都不一样。本文提到的JVM,一律是代表Hotspot JVM。二、背景熟悉jvm的童鞋,都应该了解到,一些经典的新生代垃圾收集器运用了“标记-复制算法”,并且,为了较好的实现复制算法,通常把新生代分为两种逻辑分区...

2020-03-08 17:14:54 534

原创 记一次filebeat与logstash配合使用遇到的坑

背景初学filebeat和logstash,于是根据官方文档,做了个最简单的filebeat采集日志,然后输出到logstash的最简配置。本以为可以愉快的输出“helloworld”的…问题启动配置好的filebeat和logstash,正想见证奇迹的时刻,没想到logstash启动完之后,紧接着给我来个当头棒喝,抛了下面一个很长的异常:io.netty.handler.codec.De...

2020-03-02 22:28:41 7137 1

原创 volatile关键字的作用及使用场景

volatile关键字是java虚拟机提供的最轻量级的同步机制。在并发的场景下,我们都习惯于使用synchronized锁进行同步,其实,有些简单的场景下,我们也可以使用volatile来代替,但volatile有它本身的使用规则,不能滥用,要结合它自身的特性把它应用于适合的场景下。下面就来简单叙述一下volatile关键字的作用,及其适用场景。一、volatile的特性被volatile修饰...

2020-02-16 22:29:19 4938

原创 windows修改了my.ini后无法启动mysql

最近试过修改了mysql的配置文件my.ini之后,发现无法重启mysql了。后来网上查了很多资料,终于找到了解决方法。原来在修改my.ini之后,文件保存的时候保存为了utf-8,重新另存为ANSI编码,再重启mysql服务即可。...

2019-10-16 17:27:13 1174

原创 释放sqlite文件占用的多余空间

当删除sqlite文件里的数据之后,会发现sqlite文件占的磁盘空间并不会缩小,那是因为:当你从Sqlite删除数据后,未使用的磁盘空间被添加到一个内在的”空闲列表”中用于存储你下次插入的数据。磁盘空间并没有丢失。但是也不向操作系统返回磁盘空间。sqlite这种处理方式自有它的道理之处,但有些场景,我们还是希望删除了数据之后,被删除数据所占用的空间也得以释放。这要怎么做呢?其实很简单。方法...

2019-10-11 13:37:47 2809 1

原创 Happens-Before原则

一、让人又爱又恨的指令重排了解过Java并发编程知识的童鞋都知道,Java内存模型是围绕着并发过程中如何处理原子性、可见性和有序性3个特征来建立的,其中有序性最为复杂。我们习惯性的认为代码总是从先到后、依次执行的,这在单线程的时候确实是没错的(至少程序是正确的运行的)。但在并发时,有时候给人感觉写在后面的代码,比写在前面的代码先执行,如同出现了幻觉。这就是鼎鼎大名的指令重排,指令重排是很有必要...

2019-10-10 17:53:14 1955

原创 @Transactional注解实现事务管理的原理

在实际项目中,用Spring进行事务控制,我们通常都用@Transactional注解。这个注解用法很简单,把原来jdbc繁琐的事务控制都浓缩在这个注解的使用上了。秉着“知其然,知其所以然”的心态,我们可以思考,这个注解那么牛掰,spring是如何实现的呢?这一切都得益于Spring那套强大的生态系统。...

2019-09-26 12:05:13 4527 1

原创 码农的书法窝

本人除了是个低调不奢华的码农,还是个平时喜欢乱写乱画的书法爱好者。小时候崇拜爷爷苍劲有力的字体,因而模仿起来,从此一发不可收拾,走上了习字之路。硬笔方面,我的启蒙老师是我爷爷,后来有临摹庞中华、司马彦等大家字体;毛笔方面,我首先是从隶书(曹全碑)练起,后楷书习王羲之、欧阳询、颜真卿,行书受兰亭序和祭侄文稿的影响较深远...... 想起以前,帖子还是临摹得不少的,但后来因为工作原因,键盘...

2019-09-16 22:24:57 248

原创 连接池中的maxidle和maxactive

目前项目中使用了redis连接池。最近的一次压测中发现如下问题:org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could n...

2019-08-13 13:36:40 11724

原创 maven项目用eclipse打包发布的问题(No compiler is provided in this environment!)

一、问题 如果用到maven来管理项目,eclipse的‘maven install’就可以自动编译并打包一个可执行的jar,然后可以直接发布一个版本。 但初次用这个方法打包的时候发现,会出现一个错误:No compiler is provided in this environment. Perhaps you are running on a JRE rat...

2018-06-03 16:39:35 792

原创 CentOS开放端口

在服务器上跑一个服务,如果不对这个服务对外开放,外部系统是无法访问的。就比如在服务器上部署一个在8080端口监听的http服务,如果8080端口没对外开放,外部的浏览器是访问不到的。一、系统版本查看redhat系的系统版本:$ cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core)centos7之后,防火墙...

2018-04-28 17:31:18 486

原创 JVM学习笔记(一)之内存分区

JVM中内存区可以根据受访问权限的不同定义为线程共享和线程私有两大类。以下是我学习的一些笔记,这些知识是基于java7的,java7以后的版本会有点不同,但是大同小异,核心是不会变的。一、线程私有内存区1、PC寄存器(PC计数器)如果线程执行的方法是个java方法,那么pc寄存器就会存储正在执行的字节码指令的地址 ,如果是native方法,这时候pc寄存器就是空(undefined)...

2018-03-16 14:59:26 228

原创 排序(二):插入排序

一、概念 通常在整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机实现中,为了要给插入的元素腾出空间,我们需要将其余所有元素再插入之前都向右移一位。这种算法叫做插入排序二、特点 1、插入排序所需的时间取决于输入元素的初始顺序。 2、对一个很大且其中元素已经有序(或接近有序)的数组进行排序将会比随机顺序的数组或是逆序数组进行排序要快得多。三、算法实现...

2018-02-28 20:28:21 232

原创 排序(一):选择排序

一、步骤 1、找到数组中的最小元素; 2、将第一步找到的最小元素与数组第一个元素交换位置(如果第一个元素就是最小元素则和自己交换); 3、在剩下的元素中找到最小元素,将它与第二个元素交换位置。如此反复,直到将整个数组排序。二、优缺点 1、运行时间和输入无关。为了找出最小的元素而扫描一遍数组并不能为下一次扫描提供什么信息。这种性质在某些情况下是缺点,因为一个有序的数组或是主键全部相等的数...

2018-02-22 19:47:04 248

原创 年终感悟

今天是年终最后一天上班了,工作没什么状态,所以闲来写一篇感悟。每到年终,我都会回首今年自己收获了什么,是否已达到自己年初时的目标。但工作快四年以来,每次问自己是否达到目标的时候,都很惘然,因为我发现自己根本没有一个切切实实的目标,每次年初的目标都是很模糊,就是希望来年过得更好、更加优秀等等。其实这些都是虚的,谁不想来年更好、更优秀?但要达到一个什么样的好,什么程度的优秀?或者说什么才算是好?怎...

2018-02-08 16:57:50 1594 1

原创 redis探索(一):安装与测试

一、什么是redis redis作为一种Nosql产品,在分布式系统中起了很重要的作用。以下是套用Redis官网的话: “Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询...

2018-02-08 11:57:21 235

原创 pac4j探索(二): buji-pac4j+Cas+Shiro+SpringMvc实现单点登录

在pac4j探索的上一篇文章大致讲述了一下buji-pac4j+CAS的认证流程。这里记录一下本人实现的最简单的单点登录,仅作为笔记、学习交流之用,戳这里获取本文源码。一、项目框架 1、 buji-pac4j(v.3.0.0) 2、shiro (v.1.4.0) 3、springmvc (v.4.3.2) 4、CAS (v.4.2.6) 5

2018-02-01 18:22:35 17914 15

原创 Dijkstra双栈算术表达式计算器

一、一个简单的算术表达式(8*(7-2))给出一个算术表达式“(8*(7-2))”,我们很快可以口算出来结果是40。如果把这条式子扔给java计算,结果如何?如果不对这条表达式作任何处理,java或者其他计算机语言都只是把它当做是一个简单的字符串,java不会像人那样认识加减乘除、括号内优先计算等操作,如果真要编程语言算出人类的算术表达式的结果,只能去解析这个表达式,把它解析成编程语言自己能读

2018-01-30 16:16:00 899

原创 pac4j探索(一)之buji-pac4j

一、初步认识buji-pac4j公司单点登录cas客户端用的是shiro的shiro-cas模块,但从源码看来,shiro不建议再使用shiro-cas,也就是说shiro-cas模块的相关都被shiro标注为@Deprecated,并推荐使用的代替方案是buji-pac4j(https://github.com/bujiio/buji-pac4j)。那么什么是buji-pac4j呢?原文档如是说:

2018-01-27 17:26:05 10395 4

原创 shiro学习之LifecycleBeanPostProcessor的作用

在使用spring整合shiro的系统中,配置bean的时候往往要配置LifecycleBeanPostProcessor,一直没有深究这个的具体作用,只大概知道是用来管理shiro一些bean的生命周期。今天查了一下源码,总算揭开它的神秘面纱。先来看看日常的配置:id="lifecycleBeanPostProcessor" class="org.apache.shiro.sprin

2017-12-02 18:11:07 25366 6

转载 httpservletrequest的获取真实的ip

request方法客户端IP: request.getRemoteAddr() 输出:192.168.0.106 客户端主机名:request.getRemoteHost()输出:abc request.getHeader(“Host”) 输出:192.168.0.1:8080 Web服务器名字:request.getServerName()输出:192.168.0.1 服务器监听的端口:r

2017-11-29 16:35:07 1160

原创 &、|与&&、||的区别

1、&、|可作为位运算符; 2、&、|、&&、||作为逻辑运算符时,&&、||是短路的,而&、|是非短路的。例如,假设“&&”前面的表达式是false时,其后面的表达式将不会被运算,“&”前面表达式是false时,仍然会运算其后面的表达式;同理,“||”前面的表达式是true时,其后面的表达式将不会被运算,“|”前面表达式是true时,仍然会运算其后面的表达式。

2017-11-26 10:14:16 310

原创 java读取mysql形如‘0000-00-00’时间出现异常问题

当mysql的date类型或者datetime类型对应的字段值为‘0000-00-00’或‘0000-00-00 00:00:00’时,java用jdbc访问此类数据并转化为Date类型时如果不作处理会报sql异常。解决办法是在jdbc连接配置的连接url加上参数:zeroDateTimeBehavior=convertToNull 如:jdbc:mysql://localhost:3306/te

2017-09-14 11:59:24 1246

原创 jasig cas笔记(一):基础(非代理)认证流程

单点登录的概念不再赘述。而关于jasig cas 的认证流程,其实十分简单明了,直接上图: 上图中几个角色分别为:user(用户)、browser(浏览器)、cas server(jasig cas认证服务)、(app1)应用1、(app2)应用2。一、两个关键元素:ST、TGC ST:即service ticket;用于验证用户认证状态的一种凭证。当用户请求某个应用的资源时,若该用户尚未认证,

2017-08-29 17:59:16 905

原创 centos7编译openjdk8

最近在学习jvm,平时有关java虚拟机的知识都是从别人的认识,或者书本中获得,然而“纸上得来终觉浅,绝知此事要躬行”。想更深刻的认识jvm,还得自己亲自去研究一番。于是利用工作之余的时间自己编译一套jdk。编译前注意问题1、编译openjdk时,需要提供一个启动jdk,即boot JDK; 2、boot JDK需为当前编译的openjdk的上一个版本。例如这里编译的openjdk8,就要用jdk

2017-08-19 22:20:57 2543

原创 清理linux大文件

今天发现服务器有个奇怪的现象:文件上传不了。于是估计是磁盘满了。df -h 执行df -h命令可查看磁盘使用情况:Filesystem Size Used Avail Use% Mounted on/dev/vda1 40G 40G 0 100% /tmpfs 939M 0 939M 0% /dev/shm使用率100%。

2017-08-15 19:03:56 1160

原创 根据经纬度计算两地距离java实现

最近项目有个需求是:已知两地经纬度,计算两地的距离。于是网上搜索了一下计算公式,在这里记录一下,方便以后使用,数学公式理解起来太复杂,所以直接上代码:public static double getDistance(double lon1, double lat1, double lon2, double lat2) { double radLat1 = rad(lat1);

2017-08-10 13:10:34 4166

原创 android应用程序组件概述

组件是一个Android程序至关重要的构建模块。每一个组件都是系统进入你的应用的不同途径。但并不是所有的组件都是用户进入程序的真实入口,其中一些要依赖于其它组件, 但是每一个组件都以自己独有的形式存在,并发挥特殊的作用;每一个组件都是一个唯一的模块,帮助你实现程序的各种行为。有四种不同的应用程序组件。每一种组件都有其唯一的目的并且有独有的生命周期,这个生命周期定义了附件被创建和销毁的方式。Activ

2017-07-10 13:26:31 389

原创 在Eclipse启动tomcat超时解决方法

Eclipse启动tomcat的时限默认设置为45s,在实际项目中可以根据自己需要,对timeout时间进行设置。方法很简单,找到当前eclipse的工作空间的.metadata.plugins\org.eclipse.wst.server.core目录下的server.xml文件,把start-timeout=”45”设置为足够大的值即可。

2017-02-09 15:12:55 851

原创 <<、>>、>>>的运用

虽然在项目中很少用上移位运算,但基础知识还是要掌握好的。众所周知移位运算的效率比运算符要高很多,在底层开发和游戏开发运用得比较多。<<:左移。例如 x<

2016-05-15 17:21:13 513

原创 jdk动态代理实现总结和范例

最近在研究spring aop,其中代理在aop扮演着一个很重要的角色,现在来总结一下动态代理(这里只总结动态代理,代理模式和静态代理略)。动态代理是跟静态代理的目的都一样,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 先来看看动态代理

2016-05-11 23:20:42 505

原创 hibernate中的乐观锁和悲观锁

hibernate支持两种锁:悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)悲观锁:指的是对数据库数据被外界的修改持保守态度(无论是本系统的事务处理,或者是外部系统的事务处理),在整个数据处理的过程数据都处于锁定的状态。hibernate中的悲观锁,是依靠数据库中的锁机制(因为只有数据库层才能控制本系统和外部系统对数据库的数据操作)。例如”selec

2016-05-10 00:49:21 2648

原创 web.xml中classpath:和classpath*:的区别

在web项目中,web.xml文件往往看到classpath和classpath*:的配置。classpath指的是WEB-INF文件夹下的classes目录。classes目录是个定位资源的入口: 1、class文件的存放,也就是项目src下经过编译的文件; 2、配置文件的存放; 3、模板文件的存放,例如.ftl文件classpath和classpath*:的区别: 1、classpath

2016-03-22 09:59:52 441

原创 org.eclipse.swt.SWTError: No more handles解决方法

最近两天eclipse莫名其妙出现如题所示问题 ,以下是详细的错误日志:org.eclipse.swt.SWTError: No more handles at org.eclipse.swt.SWT.error(SWT.java:4517) at org.eclipse.swt.SWT.error(SWT.java:4406) at org.eclipse.swt.SWT.

2016-03-18 15:59:20 14710 1

空空如也

空空如也

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

TA关注的人

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