JAVA中的Collection集合及ArrayList,LinkedLIst,HashSet,TreeSet和其它实现类的常用方法

文章目录

  • 前言
  • [一、Collection 接口常用方法](#一、Collection 接口常用方法)
    • [1.boolean add(E e)](#1.boolean add(E e))
    • [2.boolean remove(Object o)](#2.boolean remove(Object o))
    • [3.boolean contains(Object o)](#3.boolean contains(Object o))
    • [4.boolean isEmpty()](#4.boolean isEmpty())
    • [5.int size()](#5.int size())
    • [6.void clear()](#6.void clear())
    • [7.Object[] toArray()](#7.Object[] toArray())
    • [8.boolean containsAll(Collection<?> c)](#8.boolean containsAll(Collection<?> c))
    • [9.boolean addAll(Collection<? extends E> c)](#9.boolean addAll(Collection<? extends E> c))
    • [10.boolean removeAll(Collection<?> c)](#10.boolean removeAll(Collection<?> c))
    • [11.boolean retainAll(Collection<?> c)](#11.boolean retainAll(Collection<?> c))
    • [12.Iterator<E> iterator()](#12.Iterator<E> iterator())
    • [Java 8 开始在 Collection 接口中引入](#Java 8 开始在 Collection 接口中引入)
    • [13.forEach(Consumer<? super E> action)](#13.forEach(Consumer<? super E> action))
    • [14.removeIf(Predicate<? super E> filter)](#14.removeIf(Predicate<? super E> filter))
  • [二、Collection 实现接口/类拓展方法](#二、Collection 实现接口/类拓展方法)
  • [1.List 接口的其他通用方法](#1.List 接口的其他通用方法)
    • [add(int index, E element)](#add(int index, E element))
    • [remove(int index)](#remove(int index))
    • [set(int index, E element)](#set(int index, E element))
    • [get(int index)](#get(int index))
    • [forEach(Consumer<? super E> action)](#forEach(Consumer<? super E> action))
    • [removeIf(Predicate<? super E> filter)](#removeIf(Predicate<? super E> filter))
  • [2.LinkedList 类的扩展方法](#2.LinkedList 类的扩展方法)
  • [3.Set 集合forEach(),removeIf()方法](#3.Set 集合forEach(),removeIf()方法)
  • HashSet
    • [forEach(Consumer<? super E> action)](#forEach(Consumer<? super E> action))
    • [removeIf(Predicate<? super E> filter)](#removeIf(Predicate<? super E> filter))
  • LinkedHashSet
    • [forEach(Consumer<? super E> action)](#forEach(Consumer<? super E> action))
    • [removeIf(Predicate<? super E> filter)](#removeIf(Predicate<? super E> filter))
  • TreeSet
    • [forEach(Consumer<? super E> action)](#forEach(Consumer<? super E> action))
    • [removeIf(Predicate<? super E> filter)](#removeIf(Predicate<? super E> filter))
  • [4.Set 集合在自定义类中重写 equals() 和 hashCode() 方法保证元素不重复](#4.Set 集合在自定义类中重写 equals() 和 hashCode() 方法保证元素不重复)
  • 总结

前言

Collection 是 Java 中的一个接口,定义了所有集合类的通用操作。它是所有单一元素集合类(如 List、Set)的父接口。Collection 接口包括一些常用的方法,并且其不同的实现类(如 ArrayList、HashSet 等)可能会扩展出一些额外的方法。


一、Collection 接口常用方法

这些方法所有Collection实现类都可以使用。

ArrayList、LinkedList、HashSet、LinkedHashSet、TreeSet集合都可以调用下面的方法。

下面,我们以 ArrayList 为例,解释 Collection 接口中的常用方法。

1.boolean add(E e)

向 ArrayList 中添加一个元素。如果成功添加,返回 true。

java 复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
System.out.println(list);  // 输出:[Apple, Banana]

2.boolean remove(Object o)

从 ArrayList 中移除指定的元素。如果成功移除,返回 true。

java 复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.remove("Apple");  // 移除元素"Apple"
System.out.println(list);  // 输出:[Banana]

注意

对于 List 接口(如 ArrayList, LinkedList)

调用 remove(Object o) 时,只会删除第一个匹配的元素
对于 Set 接口(如 HashSet, TreeSet)

不允许重复元素,所以不会有多个相同的元素

3.boolean contains(Object o)

判断 ArrayList 中是否包含指定的元素。返回 true 如果存在,false 如果不存在。

java 复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
System.out.println(list.contains("Apple"));  // 输出:true
System.out.println(list.contains("Grape"));  // 输出:false

4.boolean isEmpty()

检查 ArrayList 是否为空。如果集合中没有任何元素,返回 true,否则返回 false。

java 复制代码
ArrayList<String> list = new ArrayList<>();
System.out.println(list.isEmpty());  // 输出:true
list.add("Apple");
System.out.println(list.isEmpty());  // 输出:false

5.int size()

返回 ArrayList 中元素的数量

java 复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
System.out.println(list.size());  // 输出:2

6.void clear()

清空 ArrayList 中的所有元素

java 复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.clear();  // 清空集合
System.out.println(list);  // 输出:[]

7.Object[] toArray()

将 ArrayList 转换为一个包含所有元素的数组

java 复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
Object[] array = list.toArray();
for (Object obj : array) {
    System.out.println(obj);  // 输出:Apple  Banana
}

8.boolean containsAll(Collection<?> c)

判断 ArrayList 是否包含指定集合中的所有元素。

java 复制代码
ArrayList<String> list1 = new ArrayList<>();
list1.add("Apple");
list1.add("Banana");

ArrayList<String> list2 = new ArrayList<>();
list2.add("Apple");

System.out.println(list1.containsAll(list2));  // 输出:true

9.boolean addAll(Collection<? extends E> c)

将指定集合中的所有元素添加到 ArrayList 中。

java 复制代码
ArrayList<String> list1 = new ArrayList<>();
list1.add("Apple");
list1.add("Banana");

ArrayList<String> list2 = new ArrayList<>();
list2.add("Orange");
list2.add("Grape");

list1.addAll(list2);  // 添加list2中的所有元素到list1
System.out.println(list1);  // 输出:[Apple, Banana, Orange, Grape]

10.boolean removeAll(Collection<?> c)

移除 ArrayList 中与指定集合相同的所有元素。

java 复制代码
ArrayList<String> list1 = new ArrayList<>();
list1.add("Apple");
list1.add("Banana");
list1.add("Orange");

ArrayList<String> list2 = new ArrayList<>();
list2.add("Apple");
list2.add("Orange");

list1.removeAll(list2);  // 移除list1中与list2相同的元素
System.out.println(list1);  // 输出:[Banana]

11.boolean retainAll(Collection<?> c)

保留 ArrayList 中仅包含指定集合中的元素,移除其他元素。

java 复制代码
ArrayList<String> list1 = new ArrayList<>();
list1.add("Apple");
list1.add("Banana");
list1.add("Orange");

ArrayList<String> list2 = new ArrayList<>();
list2.add("Apple");
list2.add("Grape");

list1.retainAll(list2);  // 保留list1中与list2相同的元素
System.out.println(list1);  // 输出:[Apple]

12.Iterator iterator()

返回一个 Iterator 迭代器,用于遍历 ArrayList 中的元素。

java 复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());  // 输出:Apple  Banana
}

Java 8 开始在 Collection 接口中引入

13.forEach(Consumer<? super E> action)

14.removeIf(Predicate<? super E> filter)

二、Collection 实现接口/类拓展方法

1.List 接口的其他通用方法

List 接口的实现类(如 ArrayList 和 LinkedList)也提供了许多扩展方法

以Arraylist为例

add(int index, E element)

在指定位置添加元素。

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana"));
list.add(1, "Orange");  // 在索引1的位置添加元素
System.out.println(list);  // 输出:[Apple, Orange, Banana]

remove(int index)

移除指定位置的元素。

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Orange"));
list.remove(1);  // 移除索引1的元素
System.out.println(list);  // 输出:[Apple, Orange]

set(int index, E element)

在指定位置更新元素。

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Orange"));
list.set(1, "Mango");  // 替换索引1的元素
System.out.println(list);  // 输出:[Apple, Mango, Orange]

get(int index)

获取指定索引位置的元素。

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Orange"));
System.out.println(list.get(1));  // 输出:Banana

forEach(Consumer<? super E> action)

对 List 中的每个元素执行指定的操作。

java 复制代码
ArrayList<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Orange"));
list.forEach(System.out::println);  // 输出:Apple, Banana, Orange

removeIf(Predicate<? super E> filter)

删除集合中符合条件的所有元素。

java 复制代码
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
numbers.removeIf(n -> n % 2 == 0);  // 删除所有偶数
System.out.println(numbers);  // 输出:[1, 3, 5]

2.LinkedList 类的扩展方法

LinkedList 是基于双向链表实现的 List 接口实现,它不仅可以作为 List 使用,还支持 Deque(双端队列)的一些操作。

addFirst(E e)

将元素插入到链表的头部。

java 复制代码
LinkedList<String> list = new LinkedList<>();
list.addFirst("Apple");
list.addFirst("Banana");
System.out.println(list);  // 输出:[Banana, Apple]

addLast(E e)

将元素添加到链表的尾部。

java 复制代码
LinkedList<String> list = new LinkedList<>();
list.addLast("Apple");
list.addLast("Banana");
System.out.println(list);  // 输出:[Apple, Banana]

getFirst()

返回链表头部的元素。如果链表为空,抛出 NoSuchElementException。

java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana"));
System.out.println(list.getFirst());  // 输出:Apple

getLast()

返回链表尾部的元素。如果链表为空,抛出 NoSuchElementException。

java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana"));
System.out.println(list.getLast());  // 输出:Banana

removeFirst()

移除并返回链表头部的元素。如果链表为空,抛出 NoSuchElementException。

java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana"));
System.out.println(list.removeFirst());  // 输出:Apple
System.out.println(list);  // 输出:[Banana]

removeLast()

移除并返回链表尾部的元素。如果链表为空,抛出 NoSuchElementException

java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana"));
System.out.println(list.removeLast());  // 输出:Banana
System.out.println(list);  // 输出:[Apple]

3.Set 集合forEach(),removeIf()方法

HashSet

HashSet 基于哈希表实现,集合中的元素是无序的且不允许重复。

forEach(Consumer<? super E> action)

forEach 遍历集合并执行指定操作。

java 复制代码
HashSet<String> set = new HashSet<>(Arrays.asList("Apple", "Banana"));
set.forEach(System.out::println);  // 输出:Apple, Banana(顺序不确定)

removeIf(Predicate<? super E> filter)

从 HashSet 中移除满足 Predicate 条件的元素。

java 复制代码
HashSet<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3, 4));
set.removeIf(n -> n % 2 == 0);  // 移除偶数
System.out.println(set);  // 输出:[1, 3]

LinkedHashSet

LinkedHashSet 基于哈希表实现,但它还维护了插入顺序,遍历时按照元素的插入顺序返回。

forEach(Consumer<? super E> action)

与 HashSet 类似,但因为 LinkedHashSet 维护了元素的插入顺序,所以遍历时元素的顺序是可预测的。

java 复制代码
LinkedHashSet<String> set = new LinkedHashSet<>(Arrays.asList("Apple", "Banana"));
set.forEach(System.out::println);  // 输出:Apple, Banana

removeIf(Predicate<? super E> filter)

移除符合条件的元素,操作和 HashSet 相同。

java 复制代码
LinkedHashSet<Integer> set = new LinkedHashSet<>(Arrays.asList(1, 2, 3, 4));
set.removeIf(n -> n % 2 == 0);  // 移除偶数
System.out.println(set);  // 输出:[1, 3]

TreeSet

TreeSet 是基于红黑树实现的 Set,它的元素是有序的并且不允许重复。

forEach(Consumer<? super E> action)

forEach 与其他集合类类似,遍历元素时遵循元素的自然顺序或指定的比较器顺序。

java 复制代码
TreeSet<Integer> set = new TreeSet<>(Arrays.asList(5, 1, 3, 2, 4));
set.forEach(System.out::println);  // 输出:1, 2, 3, 4, 5

removeIf(Predicate<? super E> filter)

与其他集合类类似

java 复制代码
TreeSet<Integer> set = new TreeSet<>(Arrays.asList(1, 2, 3, 4));
set.removeIf(n -> n % 2 == 0);  // 移除偶数
System.out.println(set);  // 输出:[1, 3]

4.Set 集合在自定义类中重写 equals() 和 hashCode() 方法保证元素不重复

假设我们有一个 Person 类,想要把多个 Person 对象存储到 Set 集合中,并且确保 Set 中的 Person 对象不重复。

java 复制代码
import java.util.HashSet;
import java.util.Set;
import java.util.Objects;

class Person {
    private String name;
    private int age;

    // 构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 重写 equals() 方法,确保对象的值相同才被认为相等
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    // 重写 hashCode() 方法,确保相等的对象有相同的 hashCode
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    // 重写 toString() 方法,方便输出
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

public class SetExample {
    public static void main(String[] args) {
        // 创建一个 Set 集合
        Set<Person> set = new HashSet<>();

        // 添加元素
        set.add(new Person("Alice", 25));
        set.add(new Person("Bob", 30));
        set.add(new Person("Alice", 25));  // 添加重复元素

        // 输出集合内容
        System.out.println(set);  // 输出: [Person{name='Alice', age=25}, Person{name='Bob', age=30}]
    }
}

总结

Collection 接口定义了集合类通用的方法,这些方法在不同的集合实现类中都有所体现。不同的实现类提供了不同的存储和访问方式,适合不同的业务场景,实现类的扩展方法也为 Java 集合框架提供了更强大的功能。

相关推荐
沐知全栈开发3 分钟前
Eclipse 生成 jar 包
开发语言
Dcs5 分钟前
还在用 Arrays.hashCode?Java 自己也能写出更快的版本!
java
杭州杭州杭州1 小时前
Python笔记
开发语言·笔记·python
tanyongxi662 小时前
C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
开发语言·c++
fouryears_234172 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
阿葱(聪)3 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
浮生带你学Java3 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
板板正3 小时前
SpringAI——提示词(Prompt)、提示词模板(PromptTemplate)
java·spring boot·ai·prompt
板板正3 小时前
SpringAI——对话记忆
java·spring boot·ai
期待のcode3 小时前
图片上传实现
java·前端·javascript·数据库·servlet·交互