• 【阿里巴巴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
  • 相关阅读:
    动态代理:JDK动态代理和CGLIB代理的区别
    spring启动component-scan类扫描加载,以及@Resource,postConstruct等等注解的解析生效源码
    spring启动component-scan类扫描加载过程---源码分析
    spring源码分析之spring-core asm概述
    Spring组件扫描 <context:component-scan/>
    【OSGI】1.初识OSGI-到底什么是OSGI
    superrvisor application config ini
    doris 0.9.0版本docker镜像制作与使用
    Docker系列09:搭建Harbor本地镜像仓库
    Docker系列08:容器监控
  • 原文地址:https://www.cnblogs.com/changfanchangle/p/8830770.html
Copyright © 2020-2023  润新知