1. 集合UML图
集合主要分两类:Collection 和 Map.

Vector、HashTable、Properties是线程安全的;
ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。
List,Set,Map在遍历过程中是不允许更新操作的(增,删,改)
2. Collection接口
2.1 Collection接口API
// jdk1.8public interface Collection<E> extends Iterable<E> {int size(); //集合中元素的数量boolean isEmpty(); //集合中是否有元素boolean contains(Object o); // 判断某个元素是否存在Iterator<E> iterator(); // 由于继承了接口Iterable,继承于IterableObject[] 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;}//实现口 Iterabledefault 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 + jList<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开始)```javapublic 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(不包含)的子集合}
