《编写高质量代码之JAVA》阅读摘要-基础篇
程序员文章站
2022-06-21 16:25:42
...
前言: 温故而知新。
之前阅读过Python版本的《编写高质量代码》,收获颇丰。在此,我分享下我的部分阅读笔记,供大家参考。
通用方法与准则
1.自增陷阱
count = count++;
- i++:先赋值后加1
- ++i:先加1后赋值
c++里面,如上写法是ok的,但是java里面这是一个表达式,返回值是count 自加前的值,所以上述写法有误。
2.静态导入问题
3.break
switch case用法里一定要加break
4.异变业务逻辑部分使用脚本语言
如Groovy
5.动态编译
慎用,损失性能
6.instanceof
判断一个对象是否是某个类的实例
boolean b = new String() instanceof String
7.断言(Assertion)
- 防御式编程写法,默认不启用
- 可以避免不恰当的输入,或者错误环境而产生的逻辑异常。
assert str !=null;
基本类型
8.用偶判断
i%2==0?"偶数":"奇数"
9.包装类型
需要谨慎:
- null值处理
- 比大小
包装类型本质是类
10.随机数
- Math.random 方法
- Random类
注意不要暴露随机种子
11.静态变量
类加载时分配到数据区,内存中只有一个拷贝
12.gc
不确定的情况下,避免主动gc
字符串
13.字符串池(String Pool)
创建字符串时,检查池中是否有字面相等的值。
String a = "中国"; # 使用字符串池,减少内存占用
new String("中国"); # 不检查,不放入 字符串 池
14.String是线程安全的
15. StringUtils
xxx.replaceAll(sub,”“); 等
16.String 与 StringBuffer 、 StringBuilder
- String:性能最高,适合长度不变场景
- StringBuffer:可变字符序列,使用多线程场景,线程安全
- StringBuilder:线程不安全,性能高,适合SQL拼装、JSON拼装场景
17.字符串拼接
- +号: 最符合思维习惯,性能低
- concat
- StringBuilder和StringBuffer的append方法,性能极高
数组与集合
18.数组与集合的性能
- 基础类型: 在栈内存中操作,速度快,容量小
- 对象:堆内存中操作,速度慢,容量大
19.ArrayList
- 大小可变的数组(底层仍然是数组)
- 初始化容量,显著提升性能
new ArrayList<String>(75); # 1.5倍问题
- Vector是ArrayList的多线程版本
20.Array
- Arrays.sort(data.clone()); 给int[] 的data排序
- Arrays.asList();返回的是一个长度不可变的list
21.foreach写法
java中foreach是iterator迭代器。
引申: 遍历方法的选择
22.LinkedList
是一个双向列表,与ArrayList相比:
- 删除动作,比ArrayList快20倍
- 插入动作,LinkedList占优
- 修改动作,LinkedList比ArrayList慢几个数量级
- add操作,五五开
23.List相等问题
满足两个条件:
- 元素相等
- 长度相等
24.List检索问题
- {List}.indexOf(“值”); —本质是遍历
- Collections.binarySearch({List},”值”);
binarySearch的前提:数据集已经实现升序排序
25.HashMap
- 键值对存储结构
- 元素不宜过多(存储放大)
- 底层也是数组,查询时比ArrayList快40+倍
- 增加元素前会计算hash值
- HashMap与HashTable,HashTable是线程安全的,其他几乎一样。
26.Set与List
最大区别:Set中元素不可重复
TreeSet: 默认排序的Set集合
枚举与注解
27.枚举
- 数量限制在64个以内
- 注解+枚举,实现强大的功能
28.override注解
注意不同jdk版本的区别
反射与泛型
29. 泛型
编译时擦除类型
30.反射
待补充
上一篇: YOLO代码解析(1)