1. 集合UML图
集合主要分两类:Collection 和 Map.
Vector、HashTable、Properties是线程安全的;
ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。
List,Set,Map在遍历过程中是不允许更新操作的(增,删,改)
2. Collection接口
2.1 Collection接口API
// jdk1.8
public interface Collection<E> extends Iterable<E> {
int size(); //集合中元素的数量
boolean isEmpty(); //集合中是否有元素
boolean contains(Object o); // 判断某个元素是否存在
Iterator<E> iterator(); // 由于继承了接口Iterable,继承于Iterable
Object[] toArray(); // 转成Object数组
<T> T[] toArray(T[] a); // 转成指定类型的数组
boolean add(E e); //添加元素
boolean remove(Object o); //删除指定元素
boolean containsAll(Collection<?> c); // 判断多个元素是否包含
boolean addAll(Collection<? extends E> c); // 添加多个元素
boolean removeAll(Collection<?> c); // 移除多个元素
boolean retainAll(Collection<?> c); // 保留交集的元素
void clear(); //清空集合
boolean equals(Object o);
int hashCode();
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
//实现口 Iterable
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}
2.2 Collection接口实现类的特点
- Collection实现子类可以存放多个元素,每个元素可以是Object
- 有些Collection的实现类,可以存放重复的元素,有些不可以
- 有些Collection的实现类,有些是有序的(LIst),有些不是有序的(Set)
- Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的
2.3 Iterator遍历集合
- Collection 继承了接口 Iterable
- Iterator
iterator(); 调用iterator()返回Iterator, Iterator 是迭代器,主要用于遍历集合中的元素。 Iterator仅用于集合遍历,Iterator本身并不存放对象。
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
public static void main(String[] args) {
List<String> list =new ArrayList<>(Arrays.asList("a","b","c"));
//调用iterator()得到迭代器
Iterator<String> iterator = list.iterator();
//hasNext判断是否还有下一个元素
while (iterator.hasNext()){
//next 指针下移,并将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
}
注意:
- 在调用next之前一定要调用hasNext()方法,若不调用,且下一条记录无效,直接调用next会抛出异常(NoSuchElementException)。
- 当退出while循环后,这时Iterator迭代器,指向最后的元素, 如果希望再次遍历,需要重置我们的迭代器(即:再次调用iterator()方法)
2.4 增强for循环遍历集合
增强for循环,可以代替iterator迭代器,特点:增强for循环是简化版的iterator,本质是一样。只能用于遍历集合或数组。 ```java public static void main(String[] args) {
}// itit ctrl + j
List<String> list = new ArrayList<>();
//增强for循环其实就是 Iterator
//当然我们可以给ArrayList中的iterator()中打断点验证
for (String s : list) {
}
main方法字节码
0 new #2
<a name="p8CPp"></a>
#### 3. List接口
- List集合类中元素有序(即添加元素顺序和取出元素顺序一致),且可重复
- List集合中的每个元素都有其对应的顺序索引,即支持索引(索引从0开始)
```java
public interface List<E> extends Collection<E> {
// 父接口中的方法
//List接口独有
default void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
final ListIterator<E> li = this.listIterator();
while (li.hasNext()) {
li.set(operator.apply(li.next()));
}
}
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
E get(int index); //获取指定index的元素,因此支持fori循环
E set(int index, E element); //设置指定index的元素为element,相当于替换
void add(int index, E element);// 在index位置插入element元素
E remove(int index); // 移除指定index的元素,并返回该元素
int indexOf(Object o); // 返回o在集合中首次出现的位置
int lastIndexOf(Object o);// 返回o在集合中最后出现的位置
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
List<E> subList(int fromIndex, int toIndex);
//返回fromIndex(包含)到toIndex(不包含)的子集合
}