java集合进阶篇-《Collection集合》

个人主页→VON

收录专栏→java从入门到起飞

目录

一、前言

二、Collection集合简要概述

Collection的主要实现

Collection的方法

迭代器(Iterator)

三、单列集合顶层接口Collection

CollectionDemo01

CollectionDemo02

CollectionDemo03

CollectionDemo04

CollectionDemo05


一、前言

java中的集合也是一个重点,同样也是难点,涉及到的东西较多较杂,希望大家能够和我一起来学习java集合进阶方面的知识。预计一周的时间将java集合进阶部分拿下,加油。

二、Collection集合简要概述

在Java中,java.util.Collection 是一个接口,它是所有Java集合框架的根。它定义了集合类必须实现的基本操作,如添加元素、删除元素、迭代等。所有的集合类(如 List, Set, Queue 等)都是 Collection 接口的直接或间接实现。

Collection的主要实现

  1. List:这是一个有序的集合,可以包含重复的元素,并且可以通过索引访问元素。主要的实现包括:

    • ArrayList:实现了基于动态数组的数据结构。
    • LinkedList:实现了基于双向链表的数据结构。
    • Vector:与 ArrayList 类似,但是线程安全的。
  2. Set:这是一个不允许有重复元素的集合。主要的实现包括:

    • HashSet:提供了一个平均性能较高的实现,不保证元素的顺序。
    • TreeSet:提供了排序功能,元素按自然顺序或由 Comparator 指定的顺序进行排序。
    • LinkedHashSet:结合了 HashSetLinkedHashMap 的特性,维护了插入顺序。
  3. Queue:用于按照特定顺序保持元素的集合,主要用于FIFO(先进先出)情况。主要的实现包括:

    • LinkedList:实现 Queue 接口,并提供队列操作。
    • PriorityQueue:按照优先级顺序对元素进行排序。

Collection的方法

Collection 接口定义了一些常用的方法,比如:

  • boolean add(E e):向集合中添加一个元素。
  • boolean remove(Object o):从集合中移除指定的元素。
  • void clear():移除集合中的所有元素。
  • boolean contains(Object o):如果此集合包含指定元素,则返回 true
  • Iterator<E> iterator():返回集合的迭代器。
  • int size():返回集合中的元素数量。
  • boolean isEmpty():如果集合不包含任何元素,则返回 true

迭代器(Iterator)

Iterator 接口是 Collection 中的一个内部接口,用于遍历集合中的元素。它提供了 hasNext() 方法来检查集合中是否还有更多的元素,以及 next() 方法来获取集合中的下一个元素。

三、单列集合顶层接口Collection

CollectionDemo01

关于Collection的一些常见函数的使用

java 复制代码
package ArrayDemo.CollectionDemo;

import java.util.ArrayList;
import java.util.Collection;

public class A01_CollectionDemo01 {
    public static void main(String[] args) {
        // 注:
        // Collection是一个接口,不能够直接创建他的对象
        // 只能创建他实现类的对象
        Collection<String> coll = new ArrayList<>();

        // 集合中常见方法
        // 1.添加元素
        // List系列的允许元素重复
        // Set系列的不允许元素重复
        coll.add("a");
        coll.add("b");
        coll.add("c");
        System.out.println(coll);// [a, b, c]

        // 2.清空
        /*coll.clear();
        System.out.println(coll);*/ // []

        // 3.删除
        // 注:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除
        System.out.println(coll.remove("a"));// true

        // 如果删除成功返回true,删除失败返回False
        System.out.println(coll.remove("d"));// false
        System.out.println(coll);// [b, c]

        // 4.判断元素是否包含
        // 底层是依赖equals方法进行判断是否存在的
        // 所以,如果集合中储存的是自定义对象,也想通过contains方法来判断是否包含,那么在javabean中,一定要重写equals方法
        System.out.println(coll.contains("a"));// false
        System.out.println(coll.contains("b"));// true
        System.out.println(coll.contains("c"));// true

        // 5.判断集合是否为空
        boolean result = coll.isEmpty();
        System.out.println(result);// false

        // 6.获取集合的长度
        int size = coll.size();
        System.out.println(size);// 2

    }
}

CollectionDemo02

思考一下为什么结果为false?

java 复制代码
package ArrayDemo.CollectionDemo;

import java.util.ArrayList;
import java.util.Collection;

public class A02_CollectionDemo02 {
    public static void main(String[] args) {
        // 1.创建集合对象
        Collection<Student> coll = new ArrayList<>();
        // 2.创建三个 学生对象
        Student s1 = new Student("zhang",18);
        Student s2 = new Student("li",19);
        Student s3 = new Student("wang",20);
        // 3.将学生对象添加到集合中
        coll.add(s1);
        coll.add(s2);
        coll.add(s3);
        // 4.判断集合中某一个学生对象是否包含
        Student s4 = new Student("zhang",18);
        System.out.println(coll.contains(s4));// false
    }
}

不知道你们有没有疑问,明明集合中有该对象,但是判断的时候结果却是false。

原因如下:

因为contains方法底层依赖equals方法判断对象是否一致的

如果存的是自定义对象,没有重写equals方法,那么默认使用Object类中的equals方法进行判断,而Object类中equals方法,依赖地址值进行判断。

解决方法:

在类中的javabean中重写equals方法

重写之后结果为true

CollectionDemo03

利用迭代器遍历集合中的数据

java 复制代码
package ArrayDemo.CollectionDemo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class A03_CollectionDemo03 {
    public static void main(String[] args) {
        /*
        Collection系列集合三种通用的遍历方式
        1.迭代器遍历
        2.增强for遍历
        3.lambda表达式遍历

        迭代器相关的三个方法
        1.Iterator<E>iterator():获取一个迭代器对象
        2.boolean hasNext()    :判断当前指向的位置是否有元素
        3.E next()             :获取当前指向的元素并移动指针
         */

        // 1.创建集合并添加集合元素
        Collection<String> coll = new ArrayList<>();
        coll.add("a");
        coll.add("b");
        coll.add("c");
        coll.add("d");

        // 2.获取迭代器对象
        Iterator<String> it = coll.iterator();

        // 3.利用循环去获取元素
        while(it.hasNext()){
            // 4.获取元素并移动指针
            System.out.println(it.next());
        }

    }
}

使用迭代器遍历集合的时候要注意以下几点:

// 注:

// 1.报错NoSuchElementException

// 2.迭代器遍历完毕,指针不会复位

// 3.循环中只能用一次next方法

// 4.迭代器遍历时,不能用集合的方法进行增加或者删除

// 如果想要删除元素,可以用迭代器提供的remove方法进行删除

// 如果要添加,暂时没有方法

// 报错NoSuchElementException

// System.out.println(it.next());// NoSuchElementException

// 迭代器遍历完毕,指针不会复位

// System.out.println(it.hasNext());// false

CollectionDemo04

增强for循环遍历

java 复制代码
package ArrayDemo.CollectionDemo;

import java.util.ArrayList;
import java.util.Collection;

public class A04_CollectionDemo04 {
    public static void main(String[] args) {
        // 增强for遍历
        // for(数据类型 变量名:集合/数组){
        //
        // }

        // 1.创建集合并添加集合元素
        Collection<String> coll = new ArrayList<>();
        coll.add("a");
        coll.add("b");
        coll.add("c");
        coll.add("d");

        // 2.利用增强for进行遍历
        // s就是一个第三方变量,在循环过程中依次表示集合中的每一个数据
        for (String s : coll) {
            s="s";
        }
        System.out.println(coll);// [a, b, c, d]
        // 注:
        // 修改增强for中的变量,不会改变集合原本的数据

    }
}

自我感觉最好用的一种遍历方式并且有快捷键。

快捷键:集合.for

CollectionDemo05

java 复制代码
package ArrayDemo.CollectionDemo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;

public class A05_CollectionDemo05 {
    public static void main(String[] args) {
        // 1.创建集合并添加集合元素
        Collection<String> coll = new ArrayList<>();
        coll.add("a");
        coll.add("b");
        coll.add("c");
        coll.add("d");

        // 2.利用匿名内部类的形式
        // 底层原理:
        // 将每一个元素都传递给下面的accept方法
        coll.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        // lambda表达式
        coll.forEach (s->System.out.println(s));
    }
}

这个我也不是太理解,希望各位大佬给予指导。

相关推荐
ELI_He9994 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361112 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10620 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
ProtonBase23 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
Watermelo61724 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v30 分钟前
leetCode43.字符串相乘
java·数据结构·算法
QQ同步助手30 分钟前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度
流浪的小新37 分钟前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法