该书籍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