-
关于hashCode和equals的处理,遵循如下规则:
只要重写equals,就必须重写hashCode。
因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。
如果自定义的对象作为Map的键,那么必须重写hashCode和equals。 -
ArrayList的subList结果不可强转成ArrayList,否者会抛出ClassCastException异常。subList的用法:https://blog.csdn.net/qq_37745636/article/details/100555732
-
在subList场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常。
-
使用集合转数组的方法,必须使用集合的toArray,传入的是类型完全一样的数组,大小就是list.size();直接使用toArray无参方法存在问题。此方法返回值只能是Object类
List list = new ArrayList();
list.add(“guan”);
list.add(“bao”);
String[] array = new String[list.size()];
array = list.toArray(array);
for (String str : array) {
System.out.println(str);
} -
在使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常,asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
-
泛型通配符<? extends T>用来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,因为其作为接口调用赋值时易出错。第一,频繁往外读取内容的,适用<? extends T>;第二,经常往里插入的,适合用<? super T>。
-
不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
正解:
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(“a”);
list.add(“b”);
list.add(“c”);
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
String item = iterator.next();
if(“a”.equals(item)) {
iterator.remove();
}
}
for (String string : list) {
System.out.println(string);
}
} -
在JDK7及其以上版本中,Comparator要满足如下三个条件,不然Arrays.sort,Collections.sort会报IllegalArgumentException异常。三个条件如下。
1)x,y的比较结果和y,x的比较结果相反
2)x>y,y>z,则x>z
3)x=y,则x,z比较结果和y,z比较结果相同。 -
在集合初始化时,指定集合初始值大小。如果无法确定初始值大小,请设置为16
-
. 使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历
-
利用Set元素唯一的特性,可以快速的对一个集合进行去重复操作,避免使用List的contains方法进行遍历、对比、去重操作。
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("a");
Set<String> set = new HashSet<>();
set.addAll(list);
for (String string : set) {
System.out.println(string);
}