List和Set

接口 List

 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

特点:有序的(添加顺序和输出顺序一致),不去重复,列表通常允许重复的元素,有index

所有超级接口:Collection, Iterable

1、Collection接口中的方法:

增加
add(E e) 添加成功返回true,添加 失败返回false.
addAll(Collection c) 把一个集合 的元素添加到另外一个集合中去。
删除
clear() 移除此 collection 中的所有元素(可选操作)。
remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
removeAll(Collection c) 删除指定集合中包含的所有此集合的元素(可选操作)。
retainAll(Collection c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
判断
isEmpty()
contains(Object o) 其实contains方法内部是依赖于equals方法进行比较的。
containsAll(Collection c)
查看
size()
iterator() 注意:默认指向集合的首位
迭代器的作用:就是用于抓取集合中的元素。
2、 Iterable迭代器的方法:
hasNext() 是否有元素可遍历。如果有元素可以遍历,返回true,否则返回false 。
next() 获取元素,并移动到集合下一个位置
remove() 移除迭代器最后一次返回 的元素。
注意:迭代器在打开后,不要再随意修改集合

常用已知实现类: ArrayList,LinkedList, Vector

1、ArrayList
Object[]可变数组,默认长度为0,当add添加元素时,初始化长度为DEFAULT_CAPACITY=10
int newCapacity = oldCapacity + (oldCapacity >> 1),每次扩容,会增长0.5倍
线程不安全,查询效率高,修改效率低,Arrays.copyOf()
2、Vector
Object[]可变数组,线程安全的,效率低
3、LinkedList
双向链表,查询效率低,修改效率高

接口 Set

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

Set和List使用基本(CRUD)一致,但没有提供index相关操作
特点:set去除重复元素,无序的

所有超级接口: Collection, Iterable

同List基本相同。

常用已知实现类:HashSet, TreeSet

1、HashSet
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
HashSet先执行hashCode()返回 set 的哈希码值:(1)哈希码值不同,元素则直接放入哈希表中;(2) 如果哈希码值一致将调用equals(Object o) : 比较指定对象与此 set 的相等性来判断是否元素是否重复,如果返回结果为真则去除重复,如果返回结果为假,则放入同一个“桶”中。
2、TreeSet
基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
去重复,输出顺序是"自然排序" 。

如何判断自然排序,去除重复?
执行:
(1)如果元素已经具备比较功能,例如String,int,可以直接添加
(2)如果元素没有具备比较功能,例如自定义Person类,实现Comparable接口,重写compareTo方法
(3)当重写比较方法时,如果返回值为零,则认为是重复元素
去除重复?
跟hashcode和equals无关,跟比较的方法返回值有关。
(4)如果元素没有具备比较功能,也可以实现比较器Comparator,重写Comparator方法,并且把比较器传递给TreeSet----推荐
(5)当实现Comparable接口,也实现比较器Comparator,优先调用比较器Comparator

你可能感兴趣的:(List和Set)