建议六十一:若有必要,使用动态数组
建议六十二:警惕数组的浅拷贝
数组中的copyOf方法和clone方法是浅拷贝,会直接修改指向的地址中的值,使得拷贝对象和被拷贝对象的值同时改变。
建议六十三:在明确的场景下,为集合指定初始容量
建议六十四:多种最值算法,适时选择
public class Client {
public static void main(String[] args) throws Exception {
int[] data = {5, 4, 2, 7, 7, 4, 9, 1};
Integer[] data2 = new Integer[]{5,2,4,2,8,8,9,1};
System.out.println("快速查找:" + max(data) + " 排序查找:" + max2(data) + " 最值查找:" + max3(data2));
}
// 快速查找求最大值
public static int max(int[] data) {
int max = data[0];
for (int i : data) {
max = max > i ? max : i;
}
return max;
}
// 先排序,后取值
public static int max2(int[] data) {
Arrays.sort(data.clone());
return data[data.length-1];
}
// 求最值,如最大值,第二大值等,剔除重复数据
public static int max3(Integer[] data) {
// 转换为列表
List<Integer> dataList = Arrays.asList(data);
// 转换为TreeSet,删除重复元素并升序排列
TreeSet<Integer> ts = new TreeSet<Integer>(dataList);
// 取得最大值
return ts.last();
}
}
最值计算时,使用集合最简单,使用数组性能最优
建议六十五:避开基本类型数组转换列表陷阱
基本类型数组不能作为array.asList的输入参数
建议六十六:asList方法产生的List对象不可更改
建议六十七:不同列表选择不同遍历方法
建议六十八:频繁插入和删除时使用LinkedList
建立六十九:列表相等时只需关心元素数据
public class Client {
public static void main(String[] args) throws Exception {
ArrayList<String> strs = new ArrayList<String>();
strs.add("A");
Vector<String> strs2 = new Vector<String>();
strs2.add("A");
System.out.println(strs.equals(strs2));
}
}
判断集合是否相等时只须关注元素是否相等
建议七十:子列表只是原列表的一个视图
subList产生的列表只是一个视图,所有修改动作直接作用在原列表