集合
java.util
包下的API。
Collection<E>
综述
-
Collection<E>
集合体系结构: -
Collection<E>
集合概述:-
它是单例集合的顶层接口,它表示一组对象,这些对象也称为
Collection<E>
的元素; -
JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如
Set<E>
和List<E>
)的实现,它的对象的创建也要通过多态的方式。
-
-
常用方法:
方法名 说明 boolean add(E e) 添加元素 boolean remove(Object o) 从集合中移除指定的元素 int size() 集合的长度,也就是集合中元素的个数 boolean contains(Object o) 判断集合中是否存在指定的元素 boolean isEmpty() 判断集合是否为空 void clear() 清空集合中的元素 Iterator<E> iterator 创建一个此集合的迭代器对象并返回 -
Collection<E>
集合的通用遍历方式:-
显式地使用迭代器:
调用
iterator()
方法(为其实现类所重写的),返回一个迭代器对象(Iterator<E>
),用它的hasNext()
方法作为判别条件、next()
方法得到下一个元素,用循环结构完成遍历。注意:当一个迭代器对象被创建之后,要保证其正常使用,类似像
add()
、remove()
等会修改此集合长度的方法不能被调用,因为每次用此迭代对象调用next()
方法时都会作一次判断,若是检测到集合长度被修改过,则抛出并发修改异常ConcurrentModificationException
。 -
使用增强 for 循环:
- 在 Java 中,所有实现
Iterable<E>
接口的类的对象,都可使用增强 for 循环语法来遍历,因此它可以简化数组和Collection<E>
集合的遍历。 - 增强 for 循环实质上就是隐式地使用了迭代器
Iterable<E>
。
for (元素类型 变量名 : 被遍历对象) { // 使用上面的变量名 }
- 在 Java 中,所有实现
-
-
补充——常见数据结构:
-
**栈:**是一种数据先进后出的模型。
-
数据进入栈模型的过程称为压/进栈;
-
数据离开栈模型的过程称为:弹/出栈;
-
-
**队列:**是一种数据先进先出的模型。
-
数据从后端进入队列模型的过程称为:入队列;
-
数据从前端离开队列模型的过程称为:出队列;
-
-
**数组:**是一种查询快,增删慢的模型。
-
查询数据通过索引定位,查询任意数据耗时相同,查询效率高;
-
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低;
-
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率低;
-
-
**链表:**是一种增删快、查询满的模型。
-
查询数据是否存在必须从头节点开始;
-
删除数据时,将节点中存储的下一节点的地址改为下下个节点的地址,再删除下一节点数据即可;
-
添加数据时,将后一个节点的地址信息存到要添加的节点中,再将要添加的节点的地址存到前一个节点中即可;
-
-
**哈希表:**可以说是一种元素为链表的数组。
-
List<E>
-
List<E>
集合特点:-
它被称为有序集合,也称为序列;
-
元素由索引组织,可由索引快速访问元素,用户可以精确控制列表中每个元素的插入位置;
-
元素允许重复。
-
-
List<E>
接口中常用方法:方法名 说明 void add(int index,E element) 在此集合中的指定位置插入指定的元素 E remove(int index) 删除指定索引处的元素,返回被删除的元素 E set(int index,E element) 修改指定索引处的元素,返回被修改的元素 E get(int index) 返回指定索引处的元素 -
List<E>
接口实现类之ArrayList<E>
:-
底层基于数组模型实现;
-
常用方法:
方法名 说明 public boolean add(E e) 将指定元素追加到此集合的末尾,返回追加是否成功 public void add(int index, E e) 将指定元素插入到此集合中的指定索引位置 public boolean remove(Object o) 删除指定的元素,返回删除是否成功 public E remove(int index) 删除指定索引处的元素,返回被删除的元素 public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素 public E get(int index) 返回指定索引处的元素 public int size() 返回集合中的元素的个数
-
-
List<E>
接口实现类之LinkedList<E>
:-
底层基于链表模型实现;
-
除了同样有
ArrayList<E>
那些方法外,还有如下几个与链表模型特点有关的方法:方法名 说明 public void addFirst(E e) 在该列表开头插入指定的元素 public void addLast(E e) 将指定的元素追加到此列表的末尾 public E getFirst() 返回此列表中的第一个元素 public E getLast() 返回此列表中的最后一个元素 public E removeFirst() 从此列表中删除并返回第一个元素 public E removeLast() 从此列表中删除并返回最后一个元素
-
-
List<E>
集合的3种遍历方式:-
使用
Collection<E>
接口中规定的迭代器,即,用iterator()
方法返回一个Iterator<E>
对象,用它来遍历。用增强 for 循环,则和此本质一样。
-
使用
List<E>
接口自己规定的专用迭代器,即,用listIterator()
方法返回一个ListIterator<E>
对象,用它来遍历。其中,
ListIterator<E>
除了hasNext()
、next()
方法外,还有倒序迭代的hasPrevious()
、previous()
方法,另外还有在遍历过程中添加和删除元素且不会抛出并发修改异常的方法,但用的都很少。 -
使用普通 for 循环配合 List 自己特有的
get()/set()
等方法,完成遍历。这种方法是最实用的,可以自己控制在遍历的过程中增删改元素都行。
-
Set<E>
-
Set<E>
集合特点:-
不允许重复元素。
-
常用方法就是
Collection<E>
中规定的方法。
-
-
Set<E>
接口实现类之HashSet<E>
:-
底层基于哈希表模型实现,无法保证迭代时取出顺序和存入时一致。
-
add()
方法保证元素唯一性的源码流程:由此可见,若需自己定义什么是重复什么不是重复,就自己重写元素继承自
Object
的hashCode()
、equals()
方法。
-
-
Set<E>
接口实现类之LinkedHashSet<E>
:- 底层基于哈希表模型结合链表实现,能保证迭代时取出顺序和存入时一致。
- 由链表保证元素有序,由哈希表保证元素唯一。
-
Set<E>
接口实现类之TreeSet<E>
:-
它是能按一定规则排序存储的
Set<E>
集合。 -
常用两种构造方法:
-
无参构造方法:
public TreeSet<E>()
-
要求存入的元素的类型
E
必须是实现Comparable<E>
接口的,此接口规定了int compareTo()
方法,TreeSet<E>
集合会据此方法进行排序存储;(也被称为”自然排序“) -
每次
TreeSet<E>
集合执行add(E e)
方法时:(大致推测)会用这个新 add 的元素
e
调用compareTo()
方法,对已在集合中的元素,按从前到后的次序,逐次作为参数传入compareTo()
方法,与新添加的元素e
进行比较:- 若方法返回 0,则不添加;
- 若方法返回正数,则把新 add 的元素
e
放在本次对比的老元素后面; - 若方法返回负数,则把新 add 的元素
e
放在本次对比的老元素前面;
由此便可最终确定出本次新 add 的元素
e
在集合中的存储位置。习惯性的一种用法:在
compareTo()
方法用新 add 的元素的属性减去老元素的,这样最终的排序效果是升序排列。
-
-
含参构造方法:
public TreeSet<E>(Comparator comparator)
- 这种方式使用时,不要求存入的元素的类型
E
实现Comparable<E>
接口,而是将排序的依据作为一个比较器Comparator<E>
对象,在TreeSet<E>
集合构造之时传入保存,与此集合关联。 - 传入比较器的方式就是传入比较器接口实现类对象(用匿名内部类),其比较
int compare(E e1, E e2)
方法,第一个参数会被传入新 add 的对象,第二个参数会被传入老对象,剩下的和前面的一种一样。
- 这种方式使用时,不要求存入的元素的类型
-
-
Map<K,V>
-
Map<K,V>
集合概述:- 它是双列集合的顶层接口,它表示一组对象对(键值对),JDK 提供了它的实现类,它的对象的创建要通过多态的方式;
- 特点:键值对的键不允许重复,这里判别重复与否的依据和
Set<E>
集合那里一样。 - 关系如下:
-
Map<K,V>
集合常用方法:方法名 说明 public V put(K key,V value) 添加元素,若键不存在则添加,存在则覆盖已有的值 public V get(Object key) 根据键获取值,若不存在则返回 null public V remove(Object key) 根据键删除键值对元素 public void clear() 移除所有的键值对元素 public boolean containsKey(Object key) 判断集合是否包含指定的键 public boolean containsValue(Object value) 判断集合是否包含指定的值 public boolean isEmpty() 判断集合是否为空 public int size() 集合的长度,也就是集合中键值对的个数 public Set<K> keySet() 获取所有键的集合 public Collection<V> values() 获取所有值的集合 public Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合(entry n.条目,记录) -
Map<K,V>
实现类之一为HashMap<K,V>
。 -
Map<K,V>
的遍历方式:- 方法1: 先调用
keySet()
方法,再遍历它返回的Set<K>
对象,将每个元素传入Map
的get()
方法即可。 - 方法2: 先调用
entrySet()
方法,再遍历它返回的Set<Map.Entry<K,V>>
对象,对于每个元素调用Map.Entry
的getKey()
和getValue()
方法即可。
- 方法1: 先调用