Java高质量代码之 — 数组与集合(1)
前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间拜读了秦小波老师的《改善Java程序的151建议》,感觉廓然开朗,注意到了很多平时在编写代码中并不会注意的问题,甚至感觉自己对Java只是略懂皮毛,不足以登大雅之堂,特此与读者分享读书笔记,以下内容摘自《改善Java程序的151建议》一书和笔者的理解
Java高质量代码系列文章
面向对象篇:http://ray-yui.iteye.com/blog/1926984
数据类型篇:http://ray-yui.iteye.com/blog/1927251
字符串篇:http://ray-yui.iteye.com/blog/1927647
数组与集合(1):http://ray-yui.iteye.com/blog/1928170
还记得当初学习编程的时候,老师曾经说过,什么是程序?就是数据结构加算法,这句话当时并没有多大的体会,对编程逐渐熟悉后,回想起来,确实如此,而在Java中的数据结构,就体现在集合框架当中,而使用集合有哪些地方需要注意呢?
1.性能考虑,优先选择数组
数组在项目开发当中使用的频率是越来越少,特别是在业务为主的开发当中,首先数组没有List,Set等集合提供的诸多方法,查找增加算法都要自己编写,极其繁琐麻烦,但由于List,Set等集合使用泛型支持后,存放的都为包装类,而数组是可以使用基本数据类型,而使用基本数据类型的执行运算速度要比包装类型快得多,而且集合类的底层也是通过数组进行实现.
2.若有必要,使用变长数组
在学习集合类当中,很多人喜欢将数组的定长拿来和集合类型的自变长来做比较,但其实这种比较并不合适,通过观察集合类例如ArrayList的实现其实可以看出,所谓的集合变长,其实只是用婉转的方式对原数组进行了扩容
public static <T> T[] expandCapacity(T[] data, int newLength) {// 判断是否为负值newLength = newLength < 0 ? 0 : newLength;// 生成新数组,拷贝原值并制定长度return Arrays.copyOf(data, newLength);}
public static int getMaxByArray(int[] data) {// 最简单自行实现的查找方式int max = data[0];for (int i = 1, size = data.length; i < size; i++) {max = max < i ? i : max;}return max;}
public static int getMaxByArray(int[] data) {// 先排序后获取最后位Arrays.sort(data);return data[data.length - 1];}
public static void main(String[] args) {int[] nums = new int[] { 1, 2, 3, 4, 5 };List list = Arrays.asList(nums);System.out.println(list.size());// 此时输出的size为1}
public static void main(String[] args) {// 以下为ArrayList集合的遍历方式int num = 80 * 10000;List<Integer> arrayList = new ArrayList<Integer>(num);for (int i = 0, size = arrayList.size(); i < size; i++) {arrayList.get(i);}// 以下为LinkedList集合的遍历方式List<Integer> linkedList = new LinkedList<Integer>();for (Integer integer : linkedList) {}}
public static void main(String[] args) {List<Integer> arrayList = new ArrayList<Integer>();arrayList.add(1);arrayList.add(2);List<Integer> linkedList = new LinkedList<Integer>();linkedList.add(1);linkedList.add(2);System.out.println(arrayList.equals(linkedList));// 不用关心具体实现,输出为true}