【阿里巴巴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