【JAVA学习之路 | 进阶篇】Collection中常用方法

简介: 【JAVA学习之路 | 进阶篇】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());
 
        }
相关文章
|
4天前
|
监控 算法 Java
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,特别是垃圾回收(Garbage Collection, GC)机制。我们将从基础概念开始,逐步解析垃圾回收的工作原理、不同类型的垃圾回收器以及它们在实际项目中的应用。通过实际案例,读者将能更好地理解Java应用的性能调优技巧及最佳实践。
19 0
|
2天前
|
Java
Java——方法的引用
方法引用允许将已有方法作为函数式接口的实现。使用“::”符号,需具备函数式接口,被引用的方法须存在且参数和返回值需与抽象方法一致。其分类包括:静态方法引用(类::方法名)、成员方法引用(对象::方法名、this::方法名、super::方法名)和构造方法引用(类名::new)。方法引用提高了代码的简洁性和可读性,减少了样板代码。
22 13
Java——方法的引用
|
6天前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
34 18
|
2天前
|
Java API
Java方法的优缺点
Java 方法是编程的基本构建块,具有代码重用性、模块化、易于调试、增强可读性、支持重载和可变参数、封装性及静态与实例方法的灵活性等优点,但也存在性能开销、过度抽象、限制使用环境、参数传递开销、命名冲突和堆栈溢出等缺点。合理设计方法可确保代码高效且易维护。
|
19天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
79 6
【Java学习】多线程&JUC万字超详解
|
2天前
|
Java
Java的方法详解
在 Java 中,方法是执行特定任务的代码块,包括定义、参数传递、返回值处理及重载等功能。
|
1天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
11天前
|
Java
Java的方法详解
Java的方法是类中的重要组成部分,用于定义类的行为。方法可以接收参数、执行操作并返回结果。其基本语法包括返回类型、方法名、参数列表和方法体。方法支持重载,即同名但参数不同的多个方法;静态方法则直接通过类名调用,无需实例化。此外,Java还支持可变参数,允许方法接收不定数量的参数。通过访问修饰符如`public`、`protected`、`private`,可以控制方法的可见性。方法是实现类功能的基本单元,增强了程序的灵活性和复用性。
|
19天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
9天前
|
JavaScript 前端开发 Java
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
14 0