1.使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型
完全一样的数组,大小就是list.size()。
说明:使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,
并返回新数组地址;如果数组元素个数大于实际所需,下标为[ list.size() ]的数组元素将被置为
null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
正例:
List<String> list = new ArrayList<String>(2); list.add("guan"); list.add("bao"); String[] array = new String[list.size()]; array = list.toArray(array);
2.使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,
它的add/remove/clear方法会抛出UnsupportedOperationException异常。
说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。
Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] {"you", "wu"}; List list = Arrays.asList(str); //第一种情况:list.add("yangguanbao");运行时异常。 //第二种情况:str[0] = "gujin"; 那么list.get(0)也会随之修改。
3.不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,
如果并发操作,需要对Iterator对象加锁。
正例:
List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (删除元素的条件) { iterator.remove(); } }
4.集合初始化时,指定集合初始值大小。
说明:HashMap使用HashMap(int initialCapacity) 初始化。
正例:initialCapacity = (需要存储的元素个数 / 负载因子) +1。注意负载因子(即loaderfactor)
默认为0.75,如果暂时无法确定初始值大小,请设置为16(即默认值)。
反例:HashMap需要放置1024个元素,由于没有设置容量初始大小,随着元素不断增加,
容量7次被迫扩大,resize需要重建hash表,严重影响性能。
5.高度注意Map类集合K/V能不能存储null值的情况,如下表格:
6.利用Set元素唯一的特性,可以快速对一个集合进行去重操作,避免使用
List的contains方法进行遍历、对比、去重操作。