关于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 ...
随机推荐
- 你 MySQL 中重复数据多吗,教你一招优雅的处理掉它们!
在需要保证数据唯一性的场景中,个人觉得任何使用程序逻辑的重复校验都是不可靠的,这时只能在数据存储层做唯一性校验.MySQL 中以唯一键保证数据的唯一性,那么若新插入重复数据时,我们可以让 MySQL ...
- day08文件的操作(0221)
#1.文件操作之追加数据01:f = open("yesterday01",'a+U',encoding="utf-8")#a= append,追加之意,w则为 ...
- python3.x 基础八:socket网络编程
Socket socket就是一直以来说的“套接字”,用于描述:ip:端口,是通信链的句柄,客户端通过这个句柄进行请求和响应 普通文件的操作顺序:打开-读写-关闭,针对的是文件 socket是特殊的文 ...
- MySQL(9)— 规范数据库设计
九.规范数据库设计 9-1.为什么要设计? 当数据库比较复杂时,我们就需要设计了! 糟糕的数据库设计: 数据冗余,浪费大量存储空间 使用物理外键,大量的增删改操作麻烦,异常 查询效率低下 良好的数据库 ...
- LightOJ1236
题目大意: 给你一个 n,请你找出共有多少对(i,j)满足 lcm(i,j) = n (i<=j) . 解题思路: 我们利用算术基本定理将 n,i,j 进行分解: n = P1a1 * P2a2 ...
- POJ1733
题目链接:https://vjudge.net/problem/POJ-1733 解题思路:并查集+离散化 AC代码: #include <iostream> #include <c ...
- Docker安装常见的应用与将本地镜像推送到阿里云
一.Docker安装常用的应用 1,docker安装mysql #拉取镜像mysql5.7 docker pull mysql:5.7 #启动容器(绑定对应的配置文件和日志,默认密码为123456) ...
- eatwhatApp开发实战(十四)
之前我们就输入框EditText做了优化,而这次,我们为app添加拨打电话的功能. 首先是布局,将activity_shop_info.xml中对应的电话那一栏进行重新设计: <Relative ...
- Bank1
Bank1: package banking1; //账户 public class Account { private double balance;// 账户余额 public Account(d ...
- win10系统下计算器界面变成英文的解决方法
标题: win10系统下计算器界面变成英文的解决方法 作者: 梦幻之心星 347369787@QQ.com 标签: [win10, 计算器, 英文] 目录: 软件 日期: 2019-04-20 目录 ...