有人说,去看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;
// 这里初始化代码....
}
}
然后使用后的效果就比较明显:
1 private AtomicBoolean done_ = new AtomicBoolean(false);
2
3 public void init()
4 {
5 if( done_.compareAndSet(false, true) )
6 {
7 // 这里放置初始化代码....
8 }
9 }
2.尽可能不要在For遍历中创建对象引用
很显然,创建对象意味着需要分配内存,一把小心,内存就爆了,哈哈,解决方法,我摘了师兄的
1 for (int i = 1; i <= count; i++)
2 {
3 Object obj = new Object();
4 }
5
6 //优化方法
7
8 Object obj = null;
9 for (int i = 0; i <= count; i++)
10 {
11 obj = new Object();
12 }
3.要不要初始化HashMap的容量
1 public static void main(String[] args) {
2
3 long l1 = System.currentTimeMillis();
4 for (int i=0;i<10000000;i++){
5 // Map<String, String> FileName = new HashMap<String, String>();//26 23 32
6 // Map<String, String> FileName = new HashMap<String, String>(5);//86 41 29
7 Map<String, String> FileName = new HashMap<String, String>(18);//25 29 24
8 }
9
10
11 System.out.println(System.currentTimeMillis()-l1);
12 }
我测试了3种情况,一种是默认的int capacity=16;一种是小于16,一种是大于16,跑了3次,所耗时间如右侧注释,得出结论如下,
如果给定的capacity<16时反而会增加创建对象的所需时间;
>=16时,给定一个初始化值,显然比默认的更加快。
4.要不要初始化HashMap的内容
1 public static void main(String[] args) {
2
3 long l1 = System.currentTimeMillis();
4 //1044
5 /* for (int i=0;i<10000000;i++){
6 Map<String, String> FileName = new HashMap<String, String>(){
7 {
8 put("1", "66");
9 put("2", "deptAnnualSummary");
10 }
11 };
12 }*/
13
14 //1107
15 /*for (int i=0;i<10000000;i++){
16 Map<String, String> FileName = new HashMap<String, String>();
17 FileName.put("1", "66");
18 FileName.put("2", "deptAnnualSummary");
19 }*/
20
21
22 System.out.println(System.currentTimeMillis()-l1);
23 }
如上2种代码,一种是初始化的时候给HashMap赋值,一种则是我们常常看到的那种,我也反复测了几次性能,初始化赋值显然要优于另一种.
第一种方式一气呵成,定义了一个匿名内部类(Anonymous Inner Class),然后匿名内部类中再实例化一个代码块,即实例初始化块 (instance initializer block),在类构造时执行这个块。
推荐第一种
5.Java Stream for each如何用index
eg:循环List ,取第一个,并修改它属性,在不破坏streams 的优雅编码风格前提下,略感棘手,那么现在解决方法来了
1 List<MemberFollowUpRecordVO> params = Lists.newArrayList();
2 IntStream.range(0, params.size())
3 .forEach(idx ->
4 query.bind(
5 idx,
6 params.get(idx)
7 )
8 )
9 ;
6. 待续,我会持续更新,对自己代码质量有提交的代码段子,在这个随笔里面的,系希望有人扶正我的错误表达