阿里JAVA 开发手册----整理



一、命名严禁使用拼音与英文混合的方式。

二、领域模型命名规约
1) 数据对象: xxxDO, xxx 即为数据表名。
2) 数据传输对象: xxxDTO, xxx 为业务领域相关的名称。
3) 展现对象: xxxVO, xxx 通常为网页名称。
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。java

三、long 或者 Long 初始赋值时,必须使用大写的 L,小写容易跟数字 1
混淆,形成误解。mysql

四、避免经过一个类的对象引用访问此类的静态变量或静态方法,无谓增长编译器解析成
本,直接用类名来访问便可。sql

五、说明: 可变参数必须放置在参数列表的最后。(提倡同窗们尽可能不用可变参数编程)
正例: public User getUsers(String type, Integer... ids);(可为null的参数放最后)数据库

六、Object 的 equals 方法容易抛空指针异常,应使用常量或肯定有值的对象来调用 equals。
正例: "test".equals(object);编程

七、全部的相同类型的包装类对象之间值的比较,所有使用 equals 方法比较。
说明: 对于 Integer var=?在-128 至 127 之间的赋值, Integer 对象是在 IntegerCache.cache
产生,会复用已有对象,这个区间内的 Integer 值能够直接使用==进行判断,可是这个区间之
外的全部数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方
法进行判断。数组

八、注意 serialVersionUID 不一致会抛出序列化运行时异常。数据结构

九、关于基本数据类型与包装数据类型的使用标准以下:
1) 全部的 POJO 类属性必须使用包装数据类型。
2) RPC 方法的返回值和参数必须使用包装数据类型。
3) 全部的局部变量推荐使用基本数据类型。并发

十、final 可提升程序响应效率,声明成 final 的状况:
1) 不须要从新赋值的变量,包括类属性、局部变量。
2) 对象参数前加 final,表示不容许修改引用的指向。
3) 类方法肯定不容许被重写。框架

十一、对象的 clone 方法默认是浅拷贝,若想实现深拷贝须要重写 clone 方法实现属性对象的
拷贝。
dom



十二、Map/Set 的 key 为自定义对象时,必须重写 hashCode 和 equals。
正例: String 重写了 hashCode 和 equals 方法,因此咱们能够很是愉快地使用 String 对象做
为 key 来使用。

1三、ArrayList 的 subList 结果不可强转成 ArrayList,不然会抛出 ClassCastException
异常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ;
说明: subList 返回的是 ArrayList 的内部类 SubList,并非 ArrayList ,而是 ArrayList
的一个视图,对于 SubList 子列表的全部操做最终会反映到原列表上。

1四、List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
说明: 使用 toArray 带参方法,入参分配的数组空间不够大时, toArray 方法内部将从新分配
内存空间,并返回新数组地址;若是数组元素大于实际所需,下标为[ list.size() ]的数组
元素将被置为 null,其它数组元素保持原值。

1五、使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,
它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
说明: asList 的返回对象是一个 Arrays 内部类,并无实现集合的修改方法。 Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据还是数组。
String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);
第一种状况: list.add("c"); 运行时异常。
第二种状况: str[0]= "gujin"; 那么 list.get(0)也会随之修改。

1六、不要在 foreach 循环里进行元素的 remove/add 操做(会抛出ConcurrentModificationException)。 remove 元素请使用 Iterator
方式,若是并发操做,须要对 Iterator 对象加锁。

1七、Map集合:values()返回的是 V 值集合,是一个 list 集合对象; keySet()返回的是 K 值集合,是
一个 Set 集合对象; entrySet()返回的是 K-V 值组合集合。



1八、高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能
锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。

1九、线程池不容许使用 Executors 去建立,而是经过 ThreadPoolExecutor 的方式,这样
的处理方式让写的同窗更加明确线程池的运行规则,规避资源耗尽的风险。
说明: Executors 各个方法的弊端:
1) newFixedThreadPool 和 newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费很是大的内存,甚至 OOM。
2) newCachedThreadPool 和 newScheduledThreadPool:
主要问题是线程数最大数是 Integer.MAX_VALUE,可能会建立数量很是多的线程,甚至 OOM。

20、注意,子线程抛出异常堆栈,不能在主线程 try-catch 到。

2一、注意 Math.random() 这个方法返回是 double 类型,注意取值范围 0≤x<1(可以取
到零值,注意除零异常)。



2二、单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。

2三、where a=? and b>? 多个查询条件,区分度高的在前,有=的在前。

2四、禁止使用存储过程,存储过程难以调试和扩展,更没有移植性(隐藏在DB中,不直观难维护)。

2五、删除和修改记录时,要先 select,避免出现误删除,确认无误才能
提交执行。

2六、in 操做能避免则避免,若实在避免不了,须要仔细评估 in 后边的集合元素数量,控
制在 1000 个以内。

2七、<isNotEmpty>表示不为空且不为 null 时执行; <isNotNull>表示不为 null 值时执行。

2八、mysql类型DECIMAL 实际是以串存放的。尽可能用DECIMAL取代float和double。

--分为Java语言部分、集合框架、Java线程与并发、数据库。

https://yq.aliyun.com/articles/240163?spm=5176.10695662.1996646101.searchclickresult.7b4515c54fNXir