正例:
- // 调用别人的服务获取到list
- List<Integer> list = otherService.getList();
- if (list instanceof RandomAccess) {
- // 内部数组实现,可以随机访问
- System.out.println(list.get(list.size() - 1));
- } else {
- // 内部可能是链表实现,随机访问效率低
- }
频繁调用 Collection.contains 方法请使用 Set
在 java 集合类库中,List 的 contains 方法普遍时间复杂度是 O(n) ,如果在代码中需要频繁调用 contains 方法查找数据,可以先将 list 转换成 HashSet 实现,将 O(n) 的时间复杂度降为 O(1) 。
反例:
- ArrayList<Integer> list = otherService.getList();
- for (int i = 0; i <= Integer.MAX_VALUE; i++) {
- // 时间复杂度O(n)
- list.contains(i);
- }
正例:
- ArrayList<Integer> list = otherService.getList();
- Set<Integer> set = new HashSet(list);
- for (int i = 0; i <= Integer.MAX_VALUE; i++) {
- // 时间复杂度O(1)
- set.contains(i);
- }
让代码更优雅
长整型常量后添加大写 L
在使用长整型常量值时,后面需要添加 L ,必须是大写的 L ,不能是小写的 l ,小写 l 容易跟数字 1 混淆而造成误解。
反例:
- long value = 1l;
- long max = Math.max(1L, 5);
正例:
- long value = 1L;
- long max = Math.max(1L, 5L);
不要使用魔法值
当你编写一段代码时,使用魔法值可能看起来很明确,但在调试时它们却不显得那么明确了。这就是为什么需要把魔法值定义为可读取常量的原因。但是,-1、0 和 1不被视为魔法值。
反例:
- for (int i = 0; i < 100; i++){
- ...
- }
- if (a == 100) {
- ...
- }
正例:
- private static final int MAX_COUNT = 100;
- for (int i = 0; i < MAX_COUNT; i++){
- ...
- }
- if (count == MAX_COUNT) {
- ...
- }
不要使用集合实现来赋值静态成员变量
对于集合类型的静态成员变量,不要使用集合实现来赋值,应该使用静态代码块赋值。
反例:
- private static Map<String, Integer> map = new HashMap<String, Integer>() {
- {
- put("a", 1);
- put("b", 2);
- }
- };
-
-
- private static List<String> list = new ArrayList<String>() {
- {
- add("a");
- add("b");
- }
- };
正例:
- private static Map<String, Integer> map = new HashMap<>();
- static {
- map.put("a", 1);
- map.put("b", 2);
- };
-
-
- private static List<String> list = new ArrayList<>();
- static {
- list.add("a");
- list.add("b");
- };
建议使用 try-with-resources 语句
Java 7 中引入了 try-with-resources 语句,该语句能保证将相关资源关闭,优于原来的 try-catch-finally 语句,并且使程序代码更安全更简洁。
(编辑:ASP站长网)
|