关于Java优质代码的那些事
以前别人告诉我,代码都是粘贴复制,然后写多了,就有了自己的思想,然后1,2年过去了,我的代码质量并没有什么提高,问了一些博客园里的前辈,前辈们都是语重心长的说:"少年,多看书呀!",我只当是敷衍我。知道我无意中看到一篇博客面试感悟----一名3年工作经验的程序员应该具备的技能,然后结实了大师哥:5月的仓颉,然后拜读了他的另一篇文章:给Java程序猿们推荐一些值得一看的好书,我一口气买了他文章里说的《Java多线程编程核心技术》,《Effective Java中文版》,《深入分析Java Web技术内幕》,《大型网站技术架构 核心原理与案例分析》,《Spring源码深度解析》,没有全部买下,主要是外文书理论比较强烈,我理解能力和兴趣不太感冒咬文嚼字。虽然还没看完,但是我坚持着,我一下子感觉到什么叫做优质代码。
有人说,去看java源代码呀,可能个人性格使然吧,不是那种拔尖的人才,能慢慢咀嚼枯燥无味的源码,还是靠依赖大神的文章带着我去看源码,这样进度慢点,但是我觉得适合我,我能学到东西,有所沉淀。扯远了,这边随笔的目的,主要是告我自己,这些代码,我以后也可以尝试着用,代码看起来不是那么low。
1.使用 AtomicBoolean 高效并发处理 “只初始化一次” 的功能要求:
可能会AtomicBoolean 这个对我来说,我都不知道这个啥意思,
对于官方的说明是:
可以用原子方式更新的 boolean 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic
包规范。AtomicBoolean 可用在应用程序中(如以原子方式更新的标志),但不能用于替换 Boolean。
换一句话说,Atomic就是原子性的意思,即能够保证在高并发的情况下只有一个线程能够访问这个属性值。
假设不使用AtomicBoolean ,代码如下:
public static volatile initialized = false;
public void init(){
if( initialized == false ){
initialized = true;
// 这里初始化代码....
}
}
然后使用后的效果就比较明显:
private AtomicBoolean done_ = new AtomicBoolean(false);
public void init()
{
if( done_.compareAndSet(false, true) )
{
// 这里放置初始化代码....
}
}
2.尽可能不要在For遍历中创建对象引用
很显然,创建对象意味着需要分配内存,一把小心,内存就爆了,哈哈,解决方法,我摘了师兄的
for (int i = 1; i <= count; i++)
{
Object obj = new Object();
} //优化方法 Object obj = null;
for (int i = 0; i <= count; i++)
{
obj = new Object();
}
3.要不要初始化HashMap的容量
public static void main(String[] args) {
long l1 = System.currentTimeMillis();
for (int i=0;i<10000000;i++){
// Map<String, String> FileName = new HashMap<String, String>();//26 23 32
// Map<String, String> FileName = new HashMap<String, String>(5);//86 41 29
Map<String, String> FileName = new HashMap<String, String>(18);//25 29 24
}
System.out.println(System.currentTimeMillis()-l1);
}
我测试了3种情况,一种是默认的int capacity=16;一种是小于16,一种是大于16,跑了3次,所耗时间如右侧注释,得出结论如下,
如果给定的capacity<16时反而会增加创建对象的所需时间;
>=16时,给定一个初始化值,显然比默认的更加快。
4.要不要初始化HashMap的内容
public static void main(String[] args) {
long l1 = System.currentTimeMillis();
//
/* for (int i=0;i<10000000;i++){
Map<String, String> FileName = new HashMap<String, String>(){
{
put("1", "66");
put("2", "deptAnnualSummary");
}
};
}*/
//
/*for (int i=0;i<10000000;i++){
Map<String, String> FileName = new HashMap<String, String>();
FileName.put("1", "66");
FileName.put("2", "deptAnnualSummary");
}*/
System.out.println(System.currentTimeMillis()-l1);
}
如上2种代码,一种是初始化的时候给HashMap赋值,一种则是我们常常看到的那种,我也反复测了几次性能,初始化赋值显然要优于另一种.
第一种方式一气呵成,定义了一个匿名内部类(Anonymous Inner Class),然后匿名内部类中再实例化一个代码块,即实例初始化块 (instance initializer block),在类构造时执行这个块。
推荐第一种
5.Java Stream for each如何用index
eg:循环List ,取第一个,并修改它属性,在不破坏streams 的优雅编码风格前提下,略感棘手,那么现在解决方法来了
List<MemberFollowUpRecordVO> params = Lists.newArrayList();
IntStream.range(0, params.size())
.forEach(idx ->
query.bind(
idx,
params.get(idx)
)
)
;
6. 待续,我会持续更新,对自己代码质量有提交的代码段子,在这个随笔里面的,系希望有人扶正我的错误表达
关于Java优质代码的那些事的更多相关文章
- Java你可能不知道的事(3)HashMap
概述 HashMap对于做Java的小伙伴来说太熟悉了.估计你们每天都在使用它.它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作为它的key呢?带着 ...
- java你可能不知道的事(2)--堆和栈
在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- java你可能不知道的事(2)--堆和栈<转>
在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...
- 程序计数器(关于java虚拟机内存的那些事)
<深入理解java虚拟机> 读书感悟 作者:淮左白衣 --------------写于2018年4月9日17:44:48 关于java虚拟机内存的那些事之程序计数器 关于java虚拟机内存 ...
- pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页
java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...
- 经典KMP算法C++与Java实现代码
前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...
随机推荐
- chosen.jquery.min.js select2.js 弊端
chosen.jquery.min.js --将select放在页面最下方,会导致页面高度增加,最下方空白多出来 select2.js --点击select 但未选择,然后移出鼠标,发现其他文本框.关 ...
- HDU2819
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819 题目大意: 给出一个N*N的0/1矩阵,只能交换整行或者整列,问最少交换多少次可以变成一个主对角 ...
- C# 使用RestClient 调用接口
最近做项目使用RestClient 向第三方接口推送数据.不废话直接贴代码 /// <summary> /// 获取Token /// </summary> /// <r ...
- Kubernetes学习笔记(四):服务
服务介绍 服务是一种为一组相同功能的pod提供单一不变接入点的资源.当服务存在时,他的IP和端口不会改变.客户端通过IP和端口建立连接,这些连接会被路由到任何一个pod上.如此,客户端不需要知道每个单 ...
- 微信小程序开发 -- 通过云函数下载任意文件
微信小程序开发 -- 通过云函数下载任意文件 1.云开发介绍 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...
- 初尝 Blazor WebAssembly
一. 前言 Blazor 的整体介绍以及特点与优势,建议翻阅 Blazor 介绍. Blazor 是一个可是使用 .NET/C# 来编写交互式客户端的 Web UI 框架,在官网有一句话概括 &quo ...
- [JavaWeb基础] 002.JSP和SERVLET初级入门
上一篇中,我介绍了javaweb项目的创建和Tomcat的搭建和部署,接下来我们要在上一篇的基础上去讲解一下简单的jsp和servlet交互,做出一个简单的登陆功能页面.该例子主要讲解了从页面请求道后 ...
- Spring boot Sample 003之spring-boot-configuration-properties
一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 通过properties文件配置spring boot 属性文件 三.步骤 3.1.点击File -> New Pro ...
- 折腾自己的js闭包(一)
闭包是什么鬼? 15年10月份初到现在的公司时,有天晚上加班后临下班时,当时的组长问我知道闭包不,由于我是半路出家来做程序的,几乎很少用到闭包这个东东,并不是很了解这个概念,组长写出了这么段代码. v ...
- No grammar constraints (DTD or XML Schema) referenced in the document.的两种解决办法
方法一:常用方法 关闭XML验证 工具栏:windows => preferences => xml => xml files => validation => Indi ...