• 编写高质量代码:改善Java的151个建议七(数组和集合)60-82


    该书籍PDF下载地址:http://download.csdn.net/download/muyeju/10001473

    60.对基本类型的操作,数组比集合的性能好

      在实际测试中发现:对基本类型进行进行求和计算时数组的效率是集合的10倍。

      用集合进行基本类型的加减,会出现装箱拆箱操作,导致性能消耗

    61.若有必要,使用变长数组 

    public static <T> T[] expandCapacity(T[] datas ,int newLength){
    		newLength = newLength<0?0:newLength ;
    		return Arrays.copyOf(datas, newLength) ;
    	}
    

    62.警惕数组的浅拷贝

      数组的clone()和Arrays.copyof()都是浅拷贝,即基本类型拷贝的是值,对象拷贝的是引用

    63.在明确的场景下,为集合指定初始长度

      ArrayList底层使用的是数组存储,而且数组是定长的,添加数据时,数组的长度是判断是否达到某个临界点,是的话长度就增加临界点的1.5倍,没有数组的长度就还是以前的值。好处是避免了多次调用copyOf()方法的性能开销。默认长度是10

      为什么是增加1.5倍,不是2.5,3.5倍呢?这是因为经过多次测试验证,扩容1.5倍,即满足了性能要求,也减少了内存消耗。

      如果不设置初始值,系统按照1.5倍的规则扩容,每一次扩容就是一次数组的拷贝,如果数据量很大,这样的拷贝会非常消耗资源,而且效率非常低下。但是如果对ArrayList设置了一个适当的初始长度,则可以提高性能。

    64.多种最值算法,适时选择

      1.循环判断(当元素小于1W的话,和方法和没什么区别,但是大于1W,还是循环判断性能高些)

    public static void main(String[] args) {
            int[] i = {1,5,3,9,4,10,43,21} ;
            int max = i[0] ;
            for(int j = 0 ;j<i.length ;j++){
                max = max>i[j]?max:i[j] ;
            }
            System.out.println("---------"+max);
        
        }    
    结果:---------43

      2.先排序,在取值(如果对顺序有要求的话,就的先拷贝一份出来,然后在排序,再取最值)

    public static void main(String[] args) {
            int[] i = {1,5,3,9,4,10,43,21} ;
            Arrays.sort(i);
            System.out.println("-------"+i[i.length-1]);
        }

      3.数组中去重在排序

        通过Set的子类TreeSet去重,还能自动排序

    public static void main(String[] args) {
            Integer[] i = {1,5,3,9,4,10,43,21,21,4,88} ;
            List<Integer> list = Arrays.asList(i) ;
            TreeSet<Integer> t = new TreeSet<>(list) ;
            int result = t.last() ;
            int result2 = t.lower(result) ; //获得小于最大元素的元素
            System.out.println("----最大---"+result);
            System.out.println("------第二大-----"+result2);
            结果:----最大---88
                 ------第二大-----43
        }
        

    65.避开基本类型数组转换列表问题

      数组转换成集合通过asList()方法,该方法接受的是一个变成参数(泛型参数),而基本类型是不能泛型化的,要想作为它的泛型参数,就必须使用它的包装类。

      原来类型(基本类型)数组不能作为asList的输入参数,否则会引起程序逻辑混乱

    66.asList产生的list对象不可更改

      通过asList产生的集合是一个定长集合,不能再对齐添加、移除,否则会报错。只能进行下面5个方法

      

    67.不同的列表,采用不同的排序方法

      随机存取(ArrayList):采用下标方式遍历

      例:

    public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>(10) ;
            list.add(100) ;
            list.add(123) ;
            list.add(110) ;
            list.add(73) ;
            list.add(0) ;
            long sum = 0l ;
            for(int i=0;i<100000000;i++){
                for(int k=0,size=list.size();k<size;k++){
                    sum += list.get(k) ;
                }
            }
        }

      有序存取(LinkList):采用foreach方式遍历

    68.频繁插入和删除使用LinkList

      LinkList的插入效率比ArrayList快50倍以上

      大批量的删除动作,LinkList比ArrayList快40倍以上

      ArrayList的修改比LinkList高

    69.判断集合是否相等,只需关注元素是否相等即可

    70.子列表只是原列表的一个视图

    71-82

  • 相关阅读:
    哈希冲突详解(拉链法,开放地址法)
    哈希冲突详解(拉链法,开放地址法)
    排序算法
    排序算法
    加分二叉树
    加分二叉树
    动态规划
    动态规划
    动态规划
    动态规划
  • 原文地址:https://www.cnblogs.com/-scl/p/7651450.html
Copyright © 2020-2023  润新知