2.集合处理
一.集合处理
1.只要重写equals就必须重写hashCode
-
Set存储的对象会根据hashCode和equals进行判断
-
Map的键如果是对象也必须重写
-
String已经重写了hashCode和equals对象,所以可以利用String作为Map的键
-
一般我们遵守equals相等hashCode必须相同,而hashCode相同equals不一定相同
2.ArrayList的subList结果不可以强转成ArrayList,否则会报错。由于subList返回的是ArrayList的内部类SubList,并不是ArrayList而是ArrayList的一个视图,对于SubList自列表的所有操作最终会反映到列表上
3.集合转数组方式,避免强制类型转换,使用toArray(T[] array)方法而不是toArray()
标准写法:
String[] array = new String[list.size()]; list.toArray(array);
错误写法:
-
不能把Object[]转为任意类型数组,只能一个一个转
4.使用工具类Arrays.asList()把数组转换成集合是,不能使用集合的相关方法否则报错,asList返回对象是一个Arrays的内部类,并没有实现集合的方法。
5.不要在foreach循环里进行remove/add操作,使用Iterator方式进行操作,如果是并发的需要加锁。
由于使用remove/add操作会是原数据移动,foreach是拿下标进行遍历,Iterator是拿到地址。
错误示例:
正确示例:
6.使用entrySet遍历Map类集合KV,而不是keySet方式遍历。由于keySet遍历2次,第一次转化为iterator,第二次从中取key对应的value。而entrySet遍历一次效率高,推荐使用Map的foreach方法
7.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 |
线程不安全 |