1、实现了compareTo方法,就有必要实现equals方法,同时还需要确保两个方法同步
compareTo是判断元素在排序中的位置是否相等,equals是判断元素是否相等,既然一个决定排序位置,一个决定相等,所以我们非常有必要确保当排序位置相同时,其equals也应该相等。
2、subList返回的只是原列表的一个视图,它所有的操作最终都会作用在原列表上
如:从list中删除部分数据:list.subList(100, 200).clear();
3、在使用asList时不要将基本数据类型当做参数,应使用其包装类
如:int[] intA = {1,2,3,4,5};
List list = Arrays.asList(intA);--------返回的list的size是1,内部item第一个元素是int[] intA的数组值;
使用包装类时:
因为:asList的源码
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);//该ArrayList是Arrays的一个内部类,不是java.util.ArrayList
}
该方法的接受参数是变长泛型T的,8种基本数据类型是无法发型化,所以在将int[] intA数组对象作为一个泛型T的方法入参;
4、不要试图改变(dd、remove等)asList返回的列表结构,否则会直接抛出UnsupportedOperationException异常
在第3点说到,Arrays.asList(T... a)的源码,返回的该ArrayList是Arrays的一个内部类java.util.Arrays.ArrayList,不是java.util.ArrayList。该内部类提供了size、toArray、get、set、indexOf、contains方法,而像add、remove等改变list结构的方法从AbstractList父类继承过来,它会直接抛出UnsupportedOperationException异常:
内部类java.util.Arrays.ArrayList支持的方法有:
其他操作结构的方法(add、remove等),来自java.util.AbstractList的实现:
如果非要操作,可以使用 java.util.ArrayList包一层:new java.util.ArrayList(将asList的java.util.Arrays.ArrayList)
5、如果知道集合容器的大小,要为集合指定初始容量,优化性能
如:ArrayList:动态扩容时,新容量=旧容量的1.5倍,使用System.copy方法完成数组拷贝;
HashMap:动态扩容时(达到阈值),新容量=旧容量的2倍,新阈值=旧阈值的2倍,新建节点数组,完成拷贝;