【阿里巴巴JAVA开发手册.pdf】阅读笔记

项目开发,先确定规范是很重要的,规范的目的实际是集合了很多知识点后,省略说明,直接以规定的方式进行的约束。
阅读规范,尝试从规范中学习,差缺不漏。


【强制】IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不要使用 Windows 格式。
encoding是需要的,单换行这个还真没注意,找了下,在ide的file-setting,找Editor-code style,line separator(for new files)可以修改。影响的是回车是(\r\n)还是(\n)这种问题。
有什影响呢?找了下,发现一来是保证不同工作环境下的协作同意,二来,window的换行格式在部分情况下会造成识别问题,需要注意。


【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。
这个还真不知道,所以进行了以下测试,这么看起来,中间存在null是没问题的,但是如果是最后存在NULL的情况,转换的数组长度真的可能和预想的不一致。需要注意。
// 正常:
String[] test_01 = "AAA,BBB,CCC".split(",");
System.out.println(Arrays.asList(test_01).toString());
// 结果:[AAA, BBB, CCC]

    // 最后多一个,:
    String[] test_02 = "AAA,BBB,CCC,".split(",");
    System.out.println(Arrays.asList(test_02).toString());
    // 结果:[AAA, BBB, CCC]

    // 最后多多个,:
    String[] test_03 = "AAA,BBB,CCC,,".split(",");
    System.out.println(Arrays.asList(test_03).toString());
    // 结果:[AAA, BBB, CCC]

    // 中间存在,的空值:
    String[] test_04 = "AAA,BBB,,CCC".split(",");
    System.out.println(Arrays.asList(test_04).toString());
    // 结果:[AAA, BBB, , CCC]

    // 中间存在多个,的空值:
    String[] test_05 = "AAA,BBB,,,CCC".split(",");
    System.out.println(Arrays.asList(test_05).toString());
    // 结果:[AAA, BBB, , , CCC]

    // 中间存在多个,的空值,带间隔空格:
    String[] test_06 = "AAA,BBB, ,,CCC".split(",");
    System.out.println(Arrays.asList(test_06).toString());
    // 结果:[AAA, BBB,  , , CCC]

【强制】ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList.
说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是
ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

没怎么用过subList,所以顺便查了下subList。
原来,返回的subList是原本list的一个视图,两者相互影响,包括值也包括结构,所以想要删除某几个元素时,有以下的方法

list.subList(from, to).clear();  

同时,如果对原list进行了增加或者删除,都会使subList的对象不可用。所以在规范里,有以下提醒。

【强制】在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均会产生 ConcurrentModificationException 异常。

总之,由于不是返回新对象,使用的时候需要注意其对原对象造成的影响。


【推荐】集合初始化时,指定集合初始值大小。
StringBuffer的情况,设置初始大小已减少扩充问题比较常见,集合的情况确实较少注意,测试如下。结果来看,加与不加确实时间差别较大。一倍的差距,需要注意。不过一般集合的速度较快,除非数要插入以下的百位级的数据,所以差别不是很大。
// 【推荐】集合初始化时,指定集合初始值大小。
long time1 = System.currentTimeMillis();
HashMap<String,String> testMap = new HashMap<String,String>();
for (int i = 0; i < 1000000 ;i++){
testMap.put(String.valueOf(i),String.valueOf(i));
}
System.out.println(System.currentTimeMillis() - time1);
// 结果:1299

    long time2 = System.currentTimeMillis();
    HashMap<String,String> testMap2 = new HashMap<String,String>(1000000);
    for (int i = 0; i < 1000000 ;i++){
        testMap2.put(String.valueOf(i),String.valueOf(i));
    }
    System.out.println(System.currentTimeMillis() - time2);
    // 结果:2458

    long time3 = System.currentTimeMillis();
    ArrayList<String> testList = new ArrayList<String>();
    for (int i = 0; i < 1000000 ;i++){
        testList.add(String.valueOf(i));
    }
    System.out.println(System.currentTimeMillis() - time3);
    // 结果:63

    long time4 = System.currentTimeMillis();
    ArrayList<String> testList2 = new ArrayList<String>(1000000);
    for (int i = 0; i < 1000000 ;i++){
        testList2.add(String.valueOf(i));
    }
    System.out.println(System.currentTimeMillis() - time4);
    // 结果:144
原文地址:https://www.cnblogs.com/changfanchangle/p/8830770.html