Java 提高代码效率小技巧
前言代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。
代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。
代码优化的目标是:
减小代码的体积
提高代码运行的效率
优化细节不要创建和导入不使用的对象或不使用的类如果代码中出现“The value of the local variable i is not used”、“The import java.util is never used”,那么请删除这些无用的内容。
尽量指定类、方法的final修饰符
带有 final 修饰符的类是不可派生的。
在 Java 核心 API中,有许多应用final的例子,例如java.lang.String,整个类都是 final ...
常见的for循环优化方式
前言我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。
首先,我们初始化一个集合 list,如下:
List<String> list = new ArrayList<String>();
方法一:最常规的不加思考的写法for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i));}
优点:较常见,易于理解缺点:每次都要计算list.size()
方法二:数组长度提取出来int m = list.size();for (int i = 0; i < m; i++) { System.out.println(list.get(i));}
优点:不必每次都计算缺点:
m的作用域不够小,违反了最小作用域原则
不能在for循环中操作list的大小,比如除去或新加一个元素
方法三:数组长度提取出来 ...
数据库连接池到底应该设多大?颠覆你的认知
我在研究HikariCP(一个数据库连接池)时无意间在HikariCP的Github wiki上看到了一篇文章(即前面给出的链接),这篇文章有力地消除了我一直以来的疑虑,看完之后感觉神清气爽。故在此做译文分享。
数据库连接池的配置是开发者们常常搞出坑的地方,在配置数据库连接池时,有几个可以说是和直觉背道而驰的原则需要明确。
1万并发用户访问想象你有一个网站,压力虽然还没到Facebook那个级别,但也有个1万上下的并发访问——也就是说差不多2万左右的TPS。那么这个网站的数据库连接池应该设置成多大呢?结果可能会让你惊讶,因为这个问题的正确问法是:
“这个网站的数据库连接池应该设置成多小呢?”
下面这个视频是Oracle Real World Performance Group发布的,请先看完:
http://www.dailymotion.com/video/x2s8uec
(因为这视频是英文解说且没有字幕,我替大家做一下简单的概括:)视频中对Oracle数据库进行压力测试,9600并发线程进行数据库操作,每两次访问数据库的操作之间sleep 550ms,一开始设置的中间件线程 ...
如何把Java的Jar包做成exe?超详细教程来了!
近期做了一个前后端合并的spring boot项目,但是要求达成exe文件,提供给不懂电脑的小白安装使用,就去研究了半天,踩了很多坑,写这篇文章,是想看到这篇文章的人,按照我的步骤走,能少踩坑。
准备工作
一个jar包,没有bug能正常启动的jar包
exe4j,一个将jar转换成exe的工具,百度链接:https://pan.baidu.com/s/1J30uUMJcYnqWCJSr6gkM5w,提取码:6esr,注册码:L-g782dn2d-1f1yqxx1rv1sqd
inno setup,一个将依赖和exe一起打成一个安装程序的工具,链接:https://pan.baidu.com/s/1DgFo1ceM_8Bqx_b-veibbQ,提取码:g9jd
制作步骤exe4j
将jar包放在了桌面
打开安装好的exe4j
直接下一步进入界面,选择JAVA转EXE
然后点下一步,输入名称和输出路径
继续点击下一步,选择启动模式
下方有个选项,需要设置打包后的程序兼容32和64位系统
进来后勾选上
然后一直下一步,一直出现如下界面,开始选择 ...
compileflow 淘宝工作流引擎
compileflow是什么compileflow是一个非常轻量、高性能、可集成、可扩展的流程引擎。
compileflow Process引擎是淘宝工作流TBBPM引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成java代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。
compileflow能让开发人员通过流程编辑器设计自己的业务流程,将复杂的业务逻辑可视化,为业务设计人员与开发工程师架起了一座桥梁。
最新插件安装包下载
设计意图
希望为业务开发提供端至端,从设计至实现的业务流程解决方案。
提供多种流程引擎,实现从战略至商业能力,商业能力至业务流程,业务流程至系统,并最终实现业务的可视化全局架构。
设计高效的执行引擎,实现对服务的快速组合或扩展,提升idea(构思)至value(价值)的研发响应与交互速度。
特色
高性能:通过将流程文件转换生成java代码编译执行(爽啊,Activiti可没这功能),简洁高效。
丰富的应用场景:在阿里巴巴中台解决方案中广泛使用,支撑了导购、交易、履约、资金等多个业务场景。
可集成:轻量、简洁的设计 ...
Rabbitmq 消息延迟推送(插件模式)
应用场景目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如:
淘宝七天自动确认收货。在签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持续七天,就是使用了消息中间件的延迟推送功能。
12306 购票支付确认页面。在选好票点击确定跳转的页面中往往都会有倒计时,代表着 30分钟内订单不确认的话将会自动取消订单。其实在下订单那一刻开始购票业务系统就会发送一个延时消息给订单系统,延时30分钟,告诉订单系统订单未完成,如果我们在30分钟内完成了订单,则可以通过逻辑代码判断来忽略掉收到的消息。
在上面两种场景中,如果使用下面两种传统解决方案无疑大大降低了系统的整体性能和吞吐量:
使用 redis 给订单设置过期时间,最后通过判断 redis中是否还有该订单来决定订单是否已经完成。这种解决方案相较于消息的延迟推送性能较低,因为我们知道redis都是存储于内存中,我们遇到恶意下单或者刷单的将会给内存带来巨大压力。
使用传统的数据库轮询来判断数据库表中订单的状态,这无疑增加了IO次数,性能极低。
使用 jvm 原生的 DelayQueue, ...
60岁开发者的建议,尝试改变一下吧!
35岁焦虑是程序员间讨论最多的话题之一。
是不是一直以为这个话题只有我们国内开发者会讨论?
最近,在国外的reddit上出现了这样一个热门贴:
当程序员老了会怎么样?对于45-50岁之间的程序员,你有什么故事和建议吗?对于职业规划方面有什么好的建议吗?
这些问题相信也是很多开发者想了解的。从这个帖子中,我们发现了很多高年龄程序员的建议,下面跟着小编一起看看有哪些高赞回复吧!
60多岁的开发者 @dhjdhj
他给出的建议是:“不惧怕改变,才能长期保持自己的价值”。
他还分享了自己的职业经历:
30多岁的时候,他任职于一家大型研究机构,与很多世界著名科学家共事。在一次具有很大挑战的事情上,为了快速解决问题,很多人都被要求参与进去。这里面就有很多人无法适应这样的变化,最终离开了。
因为这件事的发生,给了他很大的触动,他认为这样的根源是由于那些人无法应对变化的环境导致的(也就是我们常说的)。因此,自从这件事之后,他就开始坚持这两件事:
经常换工具,包括编辑器等各种基础工具。因为如果一直坚守自己已经会的东西,会让自己僵化,甚至对它们产生宗教版的迷恋
关注最新的开发趋势,评估新技术的重要性 ...
枚举,你了解它吗?
枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错误码等。
枚举类型不止存在在 Java 语言中,在其它语言中也都能找到它的身影,例如 C# 和 Python 等,但我发现在实际的项目中使用枚举的人很少,所以本文就来聊一聊枚举的相关内容,好让朋友们对枚举有一个大概的印象,这样在编程时起码还能想到有“枚举”这样一个类型。
本文的结构目录如下:
枚举的 7 种使用方法很多人不使用枚举的一个重要的原因是对枚举不够熟悉,那么我们就先从枚举的 7 种使用方法说起。
用法一:常量在 JDK 1.5 之前,我们定义常量都是 public static final… ,但有了枚举,我们就可以把这些常量定义成一个枚举类了,实现代码如下:
public enum ColorEnum { RED, GREEN, BLANK, YELLOW }
用法二:switch将枚举用在 switch 判断中,使得代码可读性更高了,实现代码如下:
enu ...
非对称加密RSA与对称加密AES项目应用
在项目中,为了保证数据的安全,我们常常会对传递的数据进行加密。常用的加密算法有对称加密(AES)和非对称加密(RSA)。
AESAES加密算法对称加密就是指,加密和解密使用同一个密钥的加密方式;加密计算量小、速度块,适合对大量数据进行加密的场景。AES取代DES成为加密标准(微信小程序加密传输就是用这个加密算法的)。
AES加密的五个关键词
分组密码体制
AES采用分组密码体制,即AES加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节了,就需要用Padding来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼起来形成最终的密文。
Padding
Padding就是用来把不满16个字节的分组数据填满16个字节用的,它有三种模式PKCS5、PKCS7和NOPADDING。解密端需要使用和加密端同样的Padding模式,才能准确的识别有效数据和填充数据。开发通常采用PKCS7 Padding模式。
初始向量IV
初始向量IV的作用是使加密更加安全可靠,我们使用AES加密时需要主动提供初始 ...
Thumbnailator 图片处理类库
简介Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。
支持的处理操作:图片缩放、裁剪、水印添加、旋转、保持比例、格式转换等等。Thumbnailator至今仍在不断更新……
准备工作依赖<!-- Thumbnailator图片处理 --><dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version></dependency>
上传页面<!DOCTYPE html><html lang="en" xmln ...