hashCode和equals
1.只要重写equals,就必须重写hashCode
2.因为Set存储的是不重复的对象(根据hashCode和equals判断),所以Set储存的对象必须重写这两个方法
3.如果自定义对象作为Map的Key,必须重写hashCode和equals
ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常
reason:subList()方法返回的是ArrayList的内部类SubList(ArrayList的一个视图),对于SubList子列表的所有操作最终会反映到原列表上(使用subList截取ArrayList要特别小心)
在subList场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍历,增加,删除产生ConcurrentModificationException
集合转数组的方法,使用toArray(T[] array) 传入的是类型完全一样的数组,大小是list.size()
String[] array=new String[list.size()];
array=list.toArray(array)
使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常
asList的返回对象时一个Arrays内部类,并没有实现集合的修改方法(适配器模式),只是转换接口,后台的数据仍是数组
泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,
而<? super T> 不能使用get方法,作为接口调用赋值时易出错
PECS(Producer Extends Consumer Super)原则:
第一:频繁往外读取内容,适合用<? extends T>
第二:经常往里插入的,适合用<? super T>
不要在foreach循环里进行元素的remove/add操作.remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁
在JDK7及以上,Comparator实现类要满足以下三个条件,才能使用Arrays.sort;Collections.sort 不然会抛出异常
1.x,y的比较结果和y,x的比较结果相反
2.x>y,y>z,则x>z
3.x=y,则x,z比较结果和y,z比较结果相同
集合泛型定义时,在jdk7及以上,使用diamond语法或全省略
diamond,直接使用<>来指代前边已经指定的类型
//diamond
HashMap<String,String> userCache=new HashMap<>(16);
//全省略
ArrayList<User> users=new ArrayList(10);
集合初始化时,指定集合初始值大小(减少resize次数)
HashMap使用HashMap(int initialCapacity)初始化 initialCapacity)=(需要存储的元素个数/负载因子)+1 负载因子默认0.75
HashMap未知大小,默认16
使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历(要先转为Iterator对象,遍历两次 效率低)
Map类集合K/V能不能存储null值的情况
集合类 Key Value Super 说明
Hashtable 不能为null 不能为null Dictionary 线程安全
ConcurrentHashMap 不能为null 不能为null AbstractMap 锁分段技术(JDK8:CAS)
TreeMap 不能为null 可以null AbstractMap 线程不安全
HashMap 可以null 可以null AbstractMap 线程不安全
合理利用集合的有序性(sort)和稳定性(order),避免集合的无序性(unsort)和不稳定性(unorder)带来的负面影响
有序性指遍历的结果按某种比较规则依次排列.稳定性指每次遍历的元素次序是一定的.
ArrarList(order/sort) HashMap(unorder/unsort) TreeSet(order/sort)
利用Set元素唯一的特性,可以快速对一个集合进行去重操作,避免使用List的contains方法进行遍历,对比,去重操作