编写高质量代码:改善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