Java
文章平均质量分 91
traveler100
吾行吾道,虽远必至。
展开
-
【优雅的避坑】不安全!别再共享SimpleDateFormat变量了
0x01 开场白JDK文档中已经明确表明了SimpleDateFormat不应该用在多线程场景中:SynchronizationDate formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized external原创 2020-10-22 17:46:23 · 366 阅读 · 0 评论 -
【优雅的避坑】避免HashMap扩容的正确姿势
设置HashMap的初始容量设置HashMap的初始容量只是优化的开始。HashMap在Java的使用中占据着很重要的地位,平时使用的时候,相信很多Java程序员都知道在定义HashMap的时候,给它设置一个初始容量,以便减少hashMap扩容(resize)带来的额外开销,比如像我同(zi)事(ji)的这段代码:@Testpublic void longLongAGo() { int count = 1000000; System.out.println("---------原创 2020-10-15 23:38:22 · 1687 阅读 · 1 评论 -
【优雅的避坑】你的钱算错了!为什么0.1+0.2不等于0.3了!?
问题初现我碰到过这样一个问题,对项目上用车记录中的用车里程、油耗、计价等数据进行计算,有一辆车花费了108.1元,还有一辆车的花费是29.2元,当计算这两个价格的和时出问题了,结果竟然不是137.3,而是137.29999999999998!@Testpublic void test() { Double d = 108.1; Double dd = 29.2; System.out.println("108.1 + 29.2 = " + (d + dd));}结果:1原创 2020-10-14 09:09:46 · 361 阅读 · 2 评论 -
【优雅的避坑】从验证码生成代码的优化到JVM栈和堆
验证码功能实际业务中用验证码进行登录、注册等场景非常普遍,基本上现在的应用都会有这个功能,Java中已为我们提供了Math.random()以及Random类。Math.random():public static double random()返回大于或等于0.0且小于1.0的double类型的整数。返回值的选择是伪随机的,在这个范围内(近似)均匀分布。Random类:public class Randomextends Objectimplements Serializable原创 2020-09-30 17:37:46 · 171 阅读 · 0 评论 -
【优雅的避坑】不要轻易使用==比较两个Integer的值
引入没有前戏,直奔代码,来看下面这段代码的运行结果:@Testpublic void test() { Integer i = 666; int j = i + 1; System.out.println("j = " + j);}自然,我们都知道会打印 j = 667,曾经我很好奇,i是Integer对象,属于包装类型,而j是int基础数据类型,他俩怎么会在一起运算呢?直到我扒开Integer的外表,直接看到了他的内涵…当然我是借助于工具看到程序运行的内涵的,IDE原创 2020-09-30 17:10:07 · 270 阅读 · 0 评论 -
【设计模式】详解访问者(Visitor)模式-有多段代码出没
前方有多段代码出没,祝您理解访问者模式...原创 2020-09-29 22:23:01 · 320 阅读 · 0 评论 -
【设计模式】Prototype原型模式-一段关于对象拷贝的故事
原型模式原型(Prototype)模式的定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。比如,用过VMware安装过虚拟机的可能知道,我们可以先安装一个模板机,然后通过克隆模板机创建出很多虚拟机出来,这种采用复制的方法大大提升了效率。再比如,群发消息的场景,我们希望群发出去的东西title随着发送对象的不同而改变,这时可以构造出一个消息对象,群发复制这个对象,然后title进行个性化定制。用消息原创 2020-09-27 22:05:01 · 193 阅读 · 0 评论 -
多图养眼!Partition,荷兰国旗问题与随机快排
快速排序的思想是通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归方式实现,以此达到整个数据变成有序序列。在实现快速排序之前,先了解:Partition荷兰国旗问题这两个问题,将有助于我们实现快速排序算法。PartitionPartition的过程:给定一个数组arr,和一个整数num。把小于等于num的数放在数组的左边,大于num的数放在数组的右边。比如数组int[] a.原创 2020-09-27 18:42:25 · 196 阅读 · 0 评论 -
排序算法-归并排序的实现与时间复杂度分析
归并排序归并排序是分而治之的排序算法。划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序。递归写法归并排序递归写法的思想是,设定一个函数,函数实现的目的是让int[] arr在L ~ R位置上有序,处理过程是从L ~ R上找一个中间位置M,递归调用该函数,让int[] arr的L ~ M上有序,M+1 ~ R上有序,每一次不能往下递归了,便调用归并的方法将左右两边的数组合并成一个数组,到最后整个数组便有序了。因此,原创 2020-09-15 08:25:30 · 2768 阅读 · 0 评论 -
记一次线上调优:我用线程池ThreadPoolExecutor处理任务和Redis做缓存查询,将程序效率提升了5倍!
痛苦的源头我们线上有个小程序,主要用来实时查询某省所有地市上报的一些信息,这些信息在后台,每5分钟推送一次Excel文件到我们的Kafka服务,这些信息就存储在Excel文件中。我要做的是,监听Kafka消息,得到Excel文件后,处理16个地市的消息,并将结果存储为图片(比较耗时),处理完之后,提供给小程序查询。为了追求开发速度,我直接按照地市顺序解析了Excel,截图,将图片url以及一些相关信息存储在MySQL数据库。但是,问题出现了:虽然勉强能够保证大部分时候5分钟内能处理完16个地市的原创 2020-09-08 12:10:30 · 655 阅读 · 0 评论 -
终于看懂别人的代码了!总结Java 8之Lambda表达式的写法套路
引入相信现在搞Java的童鞋都知道启动一个线程可以这样写:Thread t = new Thread(() -> System.out.println("Hello"));t.start();Thread里面需要传的是一个Runnable接口,为什么我们可以直接一个括号(),加上->,然后直接sout呢?这得益于Java 8引入的新特性:Lambda表达式。如果没有Lambda表达式的写法,我们需要老老实的这么写:Thread t1 = new Thread(new Runnab原创 2020-08-29 17:35:53 · 412 阅读 · 0 评论 -
Java8新特性Stream还有这种操作?
Java 8新特性之一Stream的官方描述:Classes in the new java.util.stream package provide a Stream API to support functional-style operations on streams of elements.The Stream API is integrated into the Collections API, which enables bulk operations on collections, su原创 2020-08-28 09:39:18 · 666 阅读 · 1 评论 -
从一道面试题进入Java并发新机制---J.U.C
什么是J.U.C?它是Java java.util.concurrent包的缩写,从包的名称就可以看出,它应该主要提供一些线程同步的类。这个包下面的类提供了多种实现线程同步的方式,还有诸如Executor、Callable、Future、ExecutorService等耳熟能详的接口。本着天天向上的原则,非常有必要学习它。一道面试题实现一个容器,提供两个方法add,size,实现两个线程:线程1,向容器中添加10个元素到容器中;线程2,实时监控容器元素个数,当元素个数到5个时,线程2给出提.原创 2020-08-27 23:58:27 · 134 阅读 · 0 评论 -
synchronized底层实现知多少?synchronized加锁还会升级?
还记得当初我们刚接触Java或者刚写Java代码时怎么处理多线程访问共享数据的吗?加锁synchronized。但是,why?为什么加了synchronized就能保证共享数据一致了呢?带着这样的疑问,我们来深入底层探究一下synchronized的实现原理。synchronized实现细节Java代码实现我们先来了看下如果多线程间竞争共享资源,不采取措施会出现什么情况:public class TestSync implements Runnable { private int c.原创 2020-08-26 17:04:37 · 211 阅读 · 0 评论 -
Java 动态调试技术原理及实践
作者:胡健 美团到店餐饮研发中心研发工程师原文链接:https://tech.meituan.com/2019/11/07/java-dynamic-debugging-technology.html断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调试技术给了我们创造新的调试模式的想象空间。本文将研究Java语言中的动态调试技术,首先概括Java动态调试所涉及的技术基础,.转载 2020-08-24 17:26:31 · 359 阅读 · 0 评论 -
你知道Object o = new Object()在内存中占多少字节吗?
如何知道一个对象在内存中的大小呢?C语言有个叫sizeOf的东西,很方便就能知道对象大小。但是Java没有这样的东西啊,不慌,Java本身有一个Agent技术。Java Agent技术Agent是个什么机制呢?有一个jvm虚拟机,还有一个class要load到内存,在load内存的过程中可以加一个Agent代理,这个代理可以截获这些class文件(001 010等二进制码),并可以对他做任意修改,当然也就可以读取到整个Object的大小。制作一个探测Object大小的Agent新建一个项目.原创 2020-08-24 09:17:39 · 763 阅读 · 0 评论 -
Elasticsearch Java API之增删改查
在基本了解并在Kibana Dev Tools控制台操作Elasticsearch的查询语法之后,是时候在实际应用中使用ES了。那么怎么在Java中使用ES呢?可以有下面几种方式来实现:Transport ClientJava High Level REST ClientSpring Data ElasticsearchTransportClient可用于老版本的Elasticsearch;新版本建议使用Java High Level REST Client(向下兼容);当然还可以使用Sp.原创 2020-08-23 10:22:59 · 423 阅读 · 0 评论 -
【设计模式】1分钟整明白什么是Builder建造者模式
建造者模式(Builder Pattern)也叫做生成器模式,其定义:Separate the construction of a complex object from its representation so that the sameconstruction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)原创 2020-08-21 22:20:12 · 537 阅读 · 0 评论 -
通过Java Socket编程观察内核级TCP的三次握手
客户端和服务端之间建立连接的三次握手是咋回事?我们来从java代码运行到观察linux内核来稍微分析一下。Socket Server与ClientJava代码先准备好上传到linux,server代码在虚拟机node1,client代码在虚拟机node2,从略。下面重点看一下client与server是如何建立连接的。在server node1机器上抓取网卡(我的虚拟机网卡名是ens33)数据包tcpdump -nn -i ens33 port 9090启动服务端还未accept.原创 2020-07-30 17:34:12 · 402 阅读 · 0 评论 -
内核中PageCache和java文件系统IO/NIO以及内存中缓冲区的作用
准备工作Linux磁盘IO关于脏页数据写入磁盘的方式的配置,是可以通过配置文件配置的:[root@node1 ~]# sysctl -a | grep dirtyvm.dirty_background_ratio = 0vm.dirty_background_bytes = 1048576vm.dirty_ratio = 0vm.dirty_bytes = 1048576vm.dirty_writeback_centisecs = 5000vm.dirty_expire_centisecs原创 2020-07-29 22:07:22 · 1192 阅读 · 0 评论 -
【学而时习之】SpringCloud技术点
SpringCloud微服务知识思维导图其中的备注、超链接部分由于生成的图片没有体现出来,本文加以详细描述。Eureka Server端项目搭建 pom.xml文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schem原创 2020-07-25 11:50:19 · 194 阅读 · 0 评论 -
【学而时习之】JVM相关及调优实战
前言行百里者半九十。我的Java生涯“不知不觉”已过了8年,在Java知识的积累上,总想写一些东西记下来,但是我的能力实在有限,以至于“望博客兴叹”。于是现在想用画图的方式弥补写作上的不足,希望能用图来保存一些有用的东西。那么就从今天开始吧,希望自己能够坚持下去,做一个真正的“行百里者”!JVM先从JVM开始。目前这个图尚未做完,后续会不断完善。...原创 2020-07-11 11:12:44 · 89 阅读 · 0 评论