阿里Java开发手册剖析:
-
6.5【强制】ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException
-
6.8【强制】在subList场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生 ConcurrentModificationException
-
6.9【强制】使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一致、长度为 0 的空数组。
-
6.11【强制】使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法, 它的 add/remove
-
6.14【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式
-
6.16【推荐】集合泛型定义时,在 JDK7 及以上,使用 diamond 语法或全省略。 说明:菱形泛型,即 diamond,直接使用<>来指代前边已经指定的类型。
【推荐】使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。
说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 Map.forEach 方法。
正例:values()返回的是 V 值集合,是一个 list 集合对象;keySet()返回的是 K 值集合,是一个 Set 集合对 象;entrySet()返回的是 K-V 值组合集合。
public static void main(String[] args) {
HashMap<String, Person> persons = new HashMap<>();
persons.put("小名",new Person(11,0,"小名"));
persons.put("小黄",new Person(12,0,"小黄"));
persons.put("小红",new Person(13,1,"小红"));
Set<String> strings = persons.keySet();
for (String string : strings) {
System.out.println(persons.get(string).toString());
}
}
}
使用下面写法效率更高:
public static void main(String[] args) {
HashMap<String, Person> persons = new HashMap<>();
persons.put("小名",new Person(11,0,"小名"));
persons.put("小黄",new Person(12,0,"小黄"));
persons.put("小红",new Person(13,1,"小红"));
Set<Map.Entry<String, Person>> entries = persons.entrySet();
for (Map.Entry<String, Person> entry : entries) {
System.out.println(entry.getValue());
}
}
JDK8后有更简单的写法:
persons.forEach((s, person) -> {
System.out.println(person.toString());
});
如果不会用lamada表达,可以写成下面样式:
persons.forEach(new BiConsumer<String, Person>() {
@Override
public void accept(String s, Person person) {
System.out.println(person.toString());
}
});