Collection集合是单列集合,其下有两个分支,分别是List集合和Set集合。
List集合,可以存放重复的元素,比如其下的ArrayList集合。
Set集合,不可以存放重复的元素,比如其下的HashSet集合。
本文主要探讨这个“重复”针对的是什么。
先来准备一个Person类,下文将用Person对象作为集合元素。
public class Person {
private int age;
public Person(int age) {
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" + "age=" + age + '}';
}
}
集合为了存放元素,一般使用add方法来追加元素,所以下面分析一下add方法。
List集合的可重复性
在ArrayList集合中,最基本的add方法的相关源码:
transient Object[] elementData; // 元素数组
private int size; // 元素数量
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 根据元素数量控制元素数组的容量
elementData[size++] = e; // 元素数量加1,且新元素追加到元素数组中
return true;
}
可以看出来,ArrayList集合在新增元素时,对新元素是否重复,没有任何相关的判定,直接就给新增了,符合了List集合的可重复性特征。
Set集合的不可重复性
在HashSet集合中,最基本的add方法的相关源码:
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object(); //
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
Set集合是单列集合,但在底层是用HashMap双列集合来实现,PRESENT属性仅仅为了拿来占用其中一列。
再看一下HashMap集合的