Collection中常用方法

1.前言

前文中提及Collection接口,故该文来讨论Collection接口中常用的方法.

复制代码
public interface Collection<E> extends Iterable<E>

int size();

boolean isEmpty();

boolean contains(Object o);

Iterator<E> iterator();

Object[] toArray();

<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);

boolean equals(Object o);

int hashCode();

2.添加

(1). add(Object obj) : 添加元素对象至当前集合.

(2). addAll(Collection other) 将other集合中的其他所有元素对象添加至当前集合.

例1 : add方法

复制代码
Collection c = new ArrayList();
        c.add(12);
        c.add("hexua");
        c.add(new Object());
        c.add(new Person("hexua", 20));
        System.out.println(c);

控制台
[12, hexua, java.lang.Object@3b07d329, Person{name='hexua', age=20}]

此处是Person类的代码.

复制代码
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @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);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

说明 :

(1). 由于Collection是接口,不能构造实例,new其实现类的对象,即接口的引用指向实现类的对象(体现多态).

(2). 第一次调用add(Object obj)方法时,因为形参是引用类型,而传入的是12基本数据类型为什么并没有报错呢?

自动装箱.类型为包装类Integer.

(3). 由于集合的元素对象都是引用数据类型,打印集合对象,其中显示的是Object对象的地址,而Person类重写了toString方法,所以将显示如上.

(4). 打印集合对象c,默认调用c.toString方法.

例2 : addAll方法

复制代码
Collection o = new ArrayList();
        o.add("AA");
        o.addAll(c);
        System.out.println(o);

控制台
[AA, 12, hexua, java.lang.Object@3b07d329, Person{name='hexua', age=20}]

说明 :

(1). 先调用add()方法,"AA"对象被加入到集合中,接着调用addAll方法,将c中所有元素对象依次加入到o集合中.

3.判断

(1). boolean isEmpty(Collection c) : 判断集合元素个数是否为0.

(2). int size() : 返回当前集合元素个数.

(3). boolean contains(Object obj) : 判断当前集合中是否有该obj对象.

(4). boolean containsAll(Collection other) : 判断当前集合中的元素是否包含了other集合中的所有元素.如果other集合是当前集合的子集,返回true,否则返回false.

例1 : 集合c与o与上文同.

复制代码
System.out.println(c.size());
System.out.println(c.isEmpty());
System.out.println(c.contains(new String("hexua"));
System.out.println(c.contains(new Person("hexua", 20)));
System.out.println(o.containsAll(c));

控制台
4
false
true
true
true

说明 :

(1). 集合c有四个元素对象,故输出size()方法,将输出4.

(2). 集合显然有元素对象,所以siEmpty()方法返回false.

(3). 判断集合c中是否包含了字符串hexua,底层使用for循环结构,并调用equals方法依次判断集合中是否有与"hexua"相等的元素对象.String类中重写了equals方法.比较的是内容是否相等,而非引用.所以返回true.

(4). contains括号内new了一个Person类的对象,显然其与集合中的Persob类的对象的引用不等.但由于Person类中重写了equals方法,所以返回的是true.

4.删除

(1). void clear() : 清空集合中的所有元素.

(2). boolean remove(Object obj) : 从当前集合中删除与obj相同的元素对象.

(3). boolean removeAll(Collection other) : 从当前集合中删除所有与other集合元素中相同的元素.

(4). boolean retainAll(Collection other) : 删除两个集合中不同的元素,使得当前集合只保留与other集合中相同的元素.

复制代码
c.remove(12);
        System.out.println(c);
        Collection o = new ArrayList();
        o.add("hexua");
        c.removeAll(o);
        System.out.println(c);
        c.clear();
        System.out.println(c.isEmpty());

控制台
[hexua, java.lang.Object@3b07d329, Person{name='hexua', age=20}]
[java.lang.Object@3b07d329, Person{name='hexua', age=20}]
true

说明 :

(1). clear清空了集合的元素,isEmpty()判定true.

ArrayList类中clear()源码.

复制代码
public void clear() {
        modCount++;
        final Object[] es = elementData;
        for (int to = size, i = size = 0; i < to; i++)
            es[i] = null;
    }

5.其他

(1). Object\[\] toArray() : 返回包含当前集合中所有元素的数组.

(2). hashCode() : 返回当前集合对象的哈希值.

(3). iterator() : 返回迭代器对象,用于遍历集合对象.

复制代码
Object[] arr = c.toArray();
        for (Object element : arr) {
            System.out.println(element);
        }
        System.out.println(c.hashCode());

控制台
12
hexua
java.lang.Object@3b07d329
Person{name='hexua', age=20}
234414305

说明 :

(1). 当前集合调用toArray方法返回一个Object数组,并运用foreach循环结构打印数组元素.

(2). 调用hashcode()方法返回哈希值.

6.杂谈

(1). 既然有可以让集合转换为数组的方法(如toArray),那么有没有让数组转换为集合的方法呢?

是有的.如Arrays中的静态方法(Arrays.asList(Object... objexts))

复制代码
String[] s = new String[]{"AA", "BB", "CC"};
        Collection o = Arrays.asList(s);
        System.out.println(o);

控制台
[AA, BB, CC]

(2).

对第一种情况,asList的形参是可变参数Object...,传入arr相当于传入三个Integer对象.(感觉这个过程有点像Python中的解包)所以集合的元素对象有3个.

对第二种情况,因为形参是引用类型,所以传入arr相当于传入一个int\[\]类型的数组,所以集合的元素对象有1个.

复制代码
Integer[] arr1 = new Integer[]{1, 2,3};
        Collection c1 = Arrays.asList(arr1);
        System.out.println(c1.size());

        int[] arr2 = new int[]{1,2,3};
        Collection c2 = Arrays.asList(arr2);
        System.out.println(c2.size());

控制台
3
1

7.迭代器

(1). iterator()

Collection coll =new ArrayList();

//创建迭代器

//Iterator是接口类型

Iterator iter =coll.iterator();

(2). 方法

复制代码
//判断下一个元素是否存在
        while(iter.hasNext()) {
            //如果存在,就将指针下移,将下移以后的集合元素返回
            System.out.println(iter.next());

        }
相关推荐
Scott9999HH39 分钟前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔1 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨3 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区5 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai6 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说6 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json