1、List
List接口继承自Collection接口,因此也继承了Collection集合中的所有方法。所有已知的实现类有:AbstractList、AbstractSequenceList、ArrayList、AttributeList、CopyOnWriteArrayList , LinkedList , RoleList , RoleUnresolvedList , Stack , Vector,其中比较常见的是ArrayList、LinkedList、Vector等。
2、Set
同List接口一样,Set接口也是继承自Collection,所有已知的实现类有:AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet,其中比较常见的是HashSet 、LinkedHashSet、TreeSet
3、两者的区别
- List是有序集合,输入的顺序就是输出的顺序;Set是无序集合,无法保证每个元素的存储顺序(注意:元素虽然无放入顺序,但是元素在Set中的位置是有该元素的HashCode决定的,其位置其实是固定的)。
- List的元素是可重复,可以存在多个null值;Set是不可重复的,只能有一个null值。
- List的元素有下标,因此可以精确的控制元素的插入位置,也能以此去查询元素,所以查询效率比较高,但是插入删除元素时需要依次改变元素的位置,所以效率相对比较低;Set的元素没有固定的位置,因此查询元素的效率比较低,但是相对的插入删除元素时并不会使元素位置发生变化,所以插入删除效率比较高。
- List可以用for循环也可以用迭代器,Set只能使用迭代器循环,因为Set没有下标,也就没有get(index)方法。
- Set的判断元素是否重复是通过比较该元素的HashCode决定的,因此Set中的Object必须重写equals和hashCode方法。
public class Test1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1元素");//list的元素是有序
list.add("2元素");
list.add("3元素");
list.add("1元素");//list的元素是可重复的
list.add("2元素");
list.add("3元素");
list.add(null);//list可以存储多个null值
list.add(null);
list.add(null);
for (String s : list) {
System.out.println("list>>" + s);
}
Set<String> set = new HashSet<>();
set.add("1元素");//set的元素是无序,根据hashCode确定其位置,hashCode不变,则位置不会发生改变
set.add("2元素");
set.add("3元素");
set.add("1元素");//set的元素不可重复,通过hashCode值判断两者是否相同
set.add("2元素");
set.add("3元素");
set.add(null);//set只能存储一个null值
set.add(null);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println("set>>" + iterator.next());
}
}
}
4、总结
List是有序的、可重复的集合,适用于查询比较多的场景下;而Set是无序的、不可重复的集合,适用于增删比较多的场景下,同时也可以用于去重。