集合体系概述以及Collection集合常用API

news2024/10/7 10:23:14

一. 集合

  • 集合与数组类似,都是一种容器。
  • 集合是Java中存储对象数据的一种容器。
  • 集合也被称为对象容器。

数组的特点

 集合的特点

  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球,可大可小。
  • 集合非常适合做元素个数不能确定,且要做元素的增删操作的场景
  • 同时,集合提供的种类特别丰富,功能也是非常强大的,开发中集合用的更多。
  • 注意:集合中只能存储引用类型数据,如果要存储基本类型数据可以选用包装类。
  • 包装类:把基本数据类型变成了一个引用数据类型,不是基本数据而是对象数据。
  • 数据也可以称为元素。

 二. 集合的体系特点

集合类体系结构

 Collection集合体系

  • Collection接口是单列集合的祖宗接口。
  • Collection集合不支持索引,不能用fori来遍历。
  • List接口和Set接口都继承了Collection接口。
  • ArrayList和LinkedList实现了List接口,实现类就是一种所谓的子类。
  • ArrayList和LinkedList它们底层存储数据的结构是不一样的,在以后做增删操作的时候,它们的性能是有差别的。
  • Collection集合并没有规定什么特点,它只是代表了一个普通集合,真正分特点的是由List和Set分特点的。
  • 添加的元素有序:先加了的元素在前面,后加了的元素在后面。
  • 可重复:允许有同样的值的元素。
  • 有索引:就是说第一个元素的索引是0,第二个元素的索引是1。 
  • 添加的元素无序:先加的元素可能是跑到后面去了,后加的元素可能是跑到前面去了。
  • 不重复:就是不允许有两个同样的值在里面,它会去重复的。
  • 集合打内容,因为集合本身已经重写了toString方法了,所以它里面打的是内容。 

 泛型

泛型相当于是一个标签

 

package com.gch.d1_collection;

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

/**
   目标:明确Collection集合体系的特点
 */
public class CollectionDemo1 {
    public static void main(String[] args) {
        // List系列集合:添加的元素是有序、可重复、有索引
        // 把子类对象给到父类接口,父类引用指向子类对象,这是多态的写法
        Collection list = new ArrayList();
        list.add("Java");
        list.add("Java");
        list.add("Mybatis");
        list.add(23);
        list.add(23);
        list.add(false);
        list.add(false);
        System.out.println(list); // [Java, Java, Mybatis, 23, 23, false, false]

        // Set系列集合:添加的元素是无序、不重复、无索引
        Collection list1 = new HashSet();
        list1.add("Java");
        list1.add("Java");
        list1.add("Mybatis");
        list1.add(23);
        list1.add(23);
        list1.add(false);
        list1.add(false);
        System.out.println(list1); // [Java, false, 23, Mybatis]

        System.out.println("------------------泛型-------------------");
//        Collection<String> list2 = new ArrayList<String>();
        // 泛型相当于是一个标签
        Collection<String> list2 = new ArrayList<>(); // 从JKD7开始之后后面的泛型类型申明可以省略不写
        list2.add("Java");
//        list2.add(23); // 直接报错,添加的类型为String
        list2.add("Mybatis");

        // 集合也被称为对象容器
        // 集合和泛型不支持基本数据类型,只能支持引用数据类型
        Collection<Integer> list3 = new ArrayList<>();
        list3.add(23); // 自动装箱
        list3.add(233);
        list.add(2333);

        Collection<Double> list4 = new ArrayList<>();
        list4.add(23.4);
        list4.add(23.0);
        list4.add(233.3);
    }
}

三. Collection集合常用API 

package com.gch.d2_collection_api;

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

/**
    目标:Collection集合的常用API.
    Collection是集合的祖宗类,它的功能是全部集合都可以继承使用的,所以要学习它。
    Collection API如下:
         - public boolean add(E e):  把给定的对象添加到当前集合中 。
         - public void clear() :清空集合中所有的元素。
         - public boolean remove(E e): 把给定的对象在当前集合中删除。
         - public boolean contains(Object obj): 判断当前集合中是否包含给定的对象。
         - public boolean isEmpty(): 判断当前集合是否为空。
         - public int size(): 返回集合中元素的个数。
         - public Object[] toArray(): 把集合中的元素,存储到数组中。
    小结:
        记住以上API。
 */
public class CollectionDemo {
    public static void main(String[] args) {
        // HashSet:添加的元素是无序,不重复,无索引。

        Collection<String> c = new ArrayList<>();
        // List集合允许元素重复,基本上添加元素不会失败
        // 1.添加元素, 添加成功返回true。
        c.add("Java");
        c.add("HTML");
        System.out.println(c.add("HTML"));
        c.add("MySQL");
        c.add("Java");
        System.out.println(c.add("黑马"));
        System.out.println(c); // [Java, HTML, HTML, MySQL, Java, 黑马]

        // 2.清空集合的元素。
        // c.clear(); // 直接清空集合的元素
        // System.out.println(c); // []

        // 3.判断集合是否为空 是空返回true,反之。
        // System.out.println(c.isEmpty());

        // 4.获取集合的大小。
        System.out.println(c.size());

        // 5.判断集合中是否包含某个元素。 精准匹配的
        System.out.println(c.contains("Java"));  // true
        System.out.println(c.contains("java")); // false
        System.out.println(c.contains("黑马")); // true

        // 6.删除某个元素:如果有多个重复元素默认删除前面的第一个!
        // 只能通过元素值来删,不能通过索引删,因为这个集合是Collection类型的一个集合。
        System.out.println(c.remove("java")); // false
        System.out.println(c);
        System.out.println(c.remove("Java")); // true
        System.out.println(c);

        // 7.把集合转换成数组  [HTML, HTML, MySQL, Java, 黑马]
        Object[] arrs = c.toArray(); // 数组:[HTML, HTML, MySQL, Java, 黑马]
        System.out.println("数组:" + Arrays.toString(arrs));

        System.out.println("----------------------拓展----------------------");
        Collection<String> c1 = new ArrayList<>();
        c1.add("java1");
        c1.add("java2");
        Collection<String> c2 = new ArrayList<>();
        c2.add("赵敏");
        c2.add("殷素素");
        // addAll把c2集合的元素全部倒入到c1中去。c2里面的数据还是在的
        c1.addAll(c2);
        System.out.println(c1); // [java1, java2, 赵敏, 殷素素]
        System.out.println(c2); // [赵敏, 殷素素]
    }
}

 四. Collection集合的遍历方式

  • 方式一:迭代器
  • 方式二:foreach/增强for循环
  • 方式三:lambda表达式

方式一:迭代器      迭代器是不能遍历数组的

package com.gch.d3_collection_traversal;

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

/**
    a.迭代器遍历集合。
        --流程:
            1.先获取当前集合的迭代器
                Iterator<String> it = lists.iterator();
            2.定义一个while循环,问一次取一次。
              通过it.hasNext()询问是否有下一个元素,有就通过
              it.next()取出下一个元素。
    小结:
        记住代码。
 */
public class CollectionDemo01 {
    public static void main(String[] args) {
        ArrayList<String> lists = new ArrayList<>();
        lists.add("赵敏");
        lists.add("小昭");
        lists.add("素素");
        lists.add("灭绝");
        System.out.println(lists); // [赵敏, 小昭, 素素, 灭绝]
        // [赵敏, 小昭, 素素, 灭绝]
        //   it

        System.out.println("--------------1.迭代器遍历--------------");
        // public interface Iterator<E>  Iterator是一个泛型接口
        // 1、得到当前集合的迭代器对象。 这个迭代器就是遍历器的意思
        Iterator<String> it = lists.iterator();

//        // next是先取元素再移位的
//        String ele = it.next();
//        System.out.println(ele); // 赵敏
//        System.out.println(it.next()); // 小昭
//        System.out.println(it.next()); // 素素
//        System.out.println(it.next()); // 灭绝
        // 访问越界了,运行报错
//        System.out.println(it.next()); // NoSuchElementException 出现没有/无此元素异常的错误

        // boolean hasNext():询问当前位置是否有元素存在,存在返回true,不存在返回false
        // E next():获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。

        // 2、定义while循环(问一次取一次)
        while (it.hasNext()){ // while循环一旦条件是false,循环结束
            String ele = it.next();
            System.out.println(ele);
        }
        // 迭代器的默认位置是在集合元素的第一个位置,也就是索引为0的位置
    }
}

 方式二:foreach/增强for循环

增强for循环

  • 增强for循环:既可以遍历集合也可以遍历数组。
  • 它是JDK5之后出现的,其内部原理是一个iterator迭代器,遍历集合相当于是迭代器的简化写法。
  • 实现iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了iterable接口。
  • 格式:

package com.gch.d3_collection_traversal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**
     目标:Collection集合的遍历方式。

     什么是遍历? 为什么开发中要遍历?
     遍历就是一个一个的把容器中的元素访问一遍。
     开发中经常要统计元素的总和,找最值,找出某个数据然后干掉等等业务都需要遍历。

     Collection集合的遍历方式是全部集合都可以直接使用的,所以我们学习它。
     Collection集合的遍历方式有三种:
         (1)迭代器。
         (2)foreach(增强for循环)。
         (3)JDK 1.8开始之后的新技术Lambda表达式。

     b.foreach(增强for循环)遍历集合。
         foreach是一种遍历形式,可以遍历集合或者数组。
         foreach遍历集合实际上是迭代器遍历集合的简化写法。
         foreach遍历的关键是记住格式:
            for(被遍历集合或者数组中元素的类型 变量名称 : 被遍历集合或者数组){

            }
 */
public class CollectionDemo02 {
    public static void main(String[] args) {
        System.out.println("-------------------2.foreach遍历/增强for循环------------------------");
        Collection<String> lists = new ArrayList<>();
        lists.add("赵敏");
        lists.add("小昭");
        lists.add("殷素素");
        lists.add("周芷若");
        System.out.println(lists);
        // [赵敏, 小昭, 殷素素, 周芷若]
        //  ele
        System.out.println("------------------foreach遍历/增强for循环遍历集合----------------------");
        // foreach只是个技术名称,真正用到的还是for关键字
        for (String ele : lists) {
            System.out.println(ele);
        }

        System.out.println("--------------------foreach遍历数组/增强for循环遍历数组---------------------------");
        double[] scores = {100, 99.5 , 59.5};
        for (double score : scores) {
            System.out.println(score);
        }

        for (double score : scores) {
            System.out.println(score);
            if(score == 59.5){
                score = 100.0; // foreach遍历修改变量无意义,不会影响数组的元素值。
            }
        }
        System.out.println(Arrays.toString(scores)); // [100.0, 99.5, 59.5]
    }
}

  方式三:Lambda表达式

package com.gch.d3_collection_traversal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;

/**
     目标:Collection集合的遍历方式。
     Collection集合的遍历方式有三种:
         (1)迭代器。
         (2)foreach(增强for循环)。
         (3)JDK 1.8开始之后的新技术Lambda表达式。
     c.JDK 1.8开始之后的新技术Lambda表达式。
 */
public class CollectionDemo03 {
    public static void main(String[] args) {
        Collection<String> lists = new ArrayList<>();
        lists.add("赵敏");
        lists.add("小昭");
        lists.add("殷素素");
        lists.add("周芷若");
        System.out.println(lists); // [赵敏, 小昭, 殷素素, 周芷若]
        System.out.println("--------------3.Lambda表达式遍历-------------");
        // [赵敏, 小昭, 殷素素, 周芷若]
        //  s
        lists.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

//        lists.forEach(s -> {
//                System.out.println(s);
//        });

        // lists.forEach(s ->  System.out.println(s) );

        lists.forEach(System.out::println);
    }
}

 五. Collection集合存储自定义类型的对象

  • 结论:集合中存储的是元素对象的地址。

package com.gch.d4_collection_object;

public class Movie {
    private String name;
    private double score;
    private String actor;

    public Movie() {
    }

    public Movie(String name, double score, String actor) {
        this.name = name;
        this.score = score;
        this.actor = actor;
    }

    public String getName() {
        return name;
    }

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

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    @Override
    public String toString() {
        return "Movie{" +
                "name='" + name + '\'' +
                ", score=" + score +
                ", actor='" + actor + '\'' +
                '}';
    }
}
package com.gch.d4_collection_object;

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

public class TestDemo {
    public static void main(String[] args) {
        // 1、定义一个电影类
        // 2、定义一个集合对象存储3部电影对象
        Collection<Movie> movies = new ArrayList<>();
        movies.add(new Movie("《你好,李焕英》", 9.5, "张小斐,贾玲,沈腾,陈赫"));
        movies.add(new Movie("《唐人街探案》", 8.5, "王宝强,刘昊然,美女"));
        movies.add(new Movie("《刺杀小说家》",8.6, "雷佳音,杨幂"));

        System.out.println(movies);

        // 3、遍历集合容器中的每个电影对象
        for (Movie movie : movies) {
            System.out.println("片名:" + movie.getName());
            System.out.println("评分:" + movie.getScore());
            System.out.println("主演:" + movie.getActor());
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python与pycharm从零安装

python&#xff08;解释器&#xff09;下载地址&#xff1a;Welcome to Python.orgpycharm&#xff08;编译器&#xff09;下载地址&#xff1a;PyCharm: the Python IDE for Professional Developers by JetBrains一、python的下载与安装到官网后根据步骤下载安装包后&#xf…

xgboost:分割查找:Weighted Quantile Sketch

Weighted Quantile Sketch 专门处理流式和分布式加权数据集的一种分桶的方法 近似算法的一个重要步骤是提出候选分裂点。通常使用特征的百分位数来使候选数据均匀分布。形式上&#xff0c;设Dk(x1k,h1)&#xff0c;(x2k,h2)⋅⋅⋅(xnk,hn)D_k {(x_{1k}, h_1)&#xff0c;(x_…

Redis持久化:RDB、AOF

Redis持久化一. RDB(1) save(2) bgsave(3) 总结二. AOF(1) 重写优化(2) RDB和AOF的区别引入&#xff1a;Redis用内存存储数据&#xff0c;有数据丢失的问题&#xff1b; 一. RDB RDB&#xff08;Redis Database Bcakup file&#xff09;即Redis数据备份文件&#xff0c;或Red…

如何用 Python采集 <豆某yin片>并作词云图分析 ?

嗨害大家好鸭&#xff01;我是小熊猫~ 总有那么一句银幕台词能打动人心 总有那么一幕名导名作念念不忘 不知道大家有多久没有放松一下了呢&#xff1f; 本次就来给大家采集一下某瓣电影并做词云分析 康康哪一部才是大家心中的经典呢&#xff1f; 最近又有哪一部可能会成为…

拉链表详解

目录 一、拉链表概念 二、拉链表对应的业务需求 三、代码实现 3.1 数据初始化&#xff1a; 3.2 创建ods层增量表&#xff1a; 3.3 创建dwd层拉链表 3.4 数据更新 &#xff0c;将数据日期为2023-3-4的日期添加到拉链表中 3.4.1 先追加数据到ods层表 3.4.2 更新dwd层表数据 …

【SpringCloud】SpringCloud详解之Ribbon实战

目录前言SpringCloud Ribbon 负载均衡一需求二.RestTemplate远程调用配置负载均衡(order服务内修改)三.Ribbon实现负载均衡的原理四.Ribbon负载均衡策略1.负载均衡种类2.配置负载均衡(order服务中配置)五.Ribbon的饥饿加载配置(在order服务配置)前言 微服务中比如用户服务部署…

sklearn使用入门

文章目录1.机器学习1.1 机器学习简介1.2 有监督学习(supervised learning)1.3 无监督学习(unsupervised learning)1.4 半监督学习2. 机器学习工具SKlearn2.1 sklearn2.2 sklearn常用模块2.2.1 分类2.2.2 回归2.2.3 聚类2.2.4 降维2.2.5 模型选择2.2.6 数据预处理2.3 sklearn使用…

Android startActivityForResult()废弃了,代替方案案例

安卓项目compileSdk为32&#xff0c;在使用startActivityForResult()方法时发现Android studio提示此方法已经废弃了。 目前的代替方案案例。 // 确保 app 的 build.gradle中已经引入了androidx.appcompat:appcompat dependencies {implementation androidx.appcompat:appcomp…

操作系统之进程管理---每天一点点(春招加油呀)--知识点回顾(自问自答版本总结)

1.什么是进程&#xff1f;什么是线程&#xff1f;进程和线程的区别&#xff1f; 进程&#xff1a;资源分配和管理的基本单位 线程&#xff1a;程序执行的最小单位。 区别&#xff1a; 地址空间&#xff1a; 同一进程的所有线程共享本进程的地址空间&#xff0c;而不同的进程之间…

仓库拣货标签电子价格标签办公电子标牌

数字货架标签尺寸&#xff1a;2.13英寸、2.9英寸、4.2英寸、7.5英寸、10.2英寸技术&#xff1a;2.4G MHz无线通信技术&#xff0c;电子墨水显示。刷新20&#xff0c;000个标签/1小时/AP。3-5年的寿命&#xff0c;电池可以快速更换。ESL管理系统工作原理&#xff1a;实时显示最新…

【Maven】P3 依赖管理

依赖管理依赖配置依赖传送依赖具有传递性直接依赖与间接依赖依赖冲突可选依赖排除依赖依赖范围依赖配置 依赖指的是当前项目所需要的jar包&#xff0c;在 pom.xml 中可以看到 <!--设置当前项目所依赖的所有jar包--> <dependencies><!--设置一个具体的依赖jar-…

【CVPR2022】Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation

论文标题&#xff1a;Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation收录&#xff1a;CVPR 2022paper: https://arxiv.org/abs/2203.00962code: https://github.com/zhaozhengChen/ReCAM解读&#xff1a;https://zhuanlan.zhihu.com/p/478133151https:…

mx-font

Abstract 短镜头字体生成(FFG)方法必须满足两个目标:生成的图像既要保留目标字符的底层全局结构,又要呈现多样化的局部参考风格。现有的FFG方法旨在通过提取通用表示样式或提取多个组件样式表示来分离内容和样式。然而,以往的方法要么无法捕捉不同的本地风格,要么无法推广到…

初识系统移植

系统移植简单来说就是将准备好的内核&#xff08;OS&#xff09;移植到一台主机或者开发板中&#xff0c;类似于器官移植&#xff0c;将准备好的器官移植到人体中。 为什么需要系统移植&#xff1f; 没有内核的情况下&#xff0c;上层如果要控制硬件只能将C语言代码先编译成二…

【C++】栈和队列(stackqueue)介绍,实现,oj

&#x1f345;一文包教会&#xff0c;不再赘述栈最基本的结构和性质&#xff08;栈的基本介绍在这里&#xff09; &#xff08;队列基本介绍和实现&#xff09;,博主主页还有很多栈和队列oj题哦~ 目录 ☃️1.stack_list &#x1f41d;1.1 介绍 &#x1f41d;1.2 stack和list实…

人工智能|HCIA-AI V3.0(一)——人工智能概览

文章目录一 AI、机器学习、深度学习的关系二 AI的三个方面的应用2.1 计算机视觉2.2 语音处理2.3 自然语言处理三、争议四、未来展望一 AI、机器学习、深度学习的关系 人工智能:是研究、开发用于模拟、延伸和扩展人的智能的理论、方法及应用系统的一- 门新的技术科学。 机器学习…

【蓝桥杯集训15】求最短路存在负权边——spaf算法(3 / 4)

——SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称 单源最短路&#xff0c;且图中没有负环就可以用spfa 目录 spaf求最短路模板 852. spfa判断负环 341. 最优贸易 - spfa 双向建图 3305. 作物杂交 - spaf求最短路模板 只有当一个点的前驱结点更新了&#xff0c;…

多线程共享数据结构的无锁释放

目录背景问题共享结构的无锁释放对比ref-cntrcuepoch-based reclamhazard pointer: 冒险指针结构原理正确性保证范例参考背景 多线程共享一个数据结构。 共享数据结构&#xff0c;可以做到节约内存。 但是多线程共享&#xff0c;可能会有问题&#xff0c;比如同步的问题。 问…

(Android-RTC-9)PeerConnectionFactory

开篇前瞎扯。很久没发技术文章了&#xff0c;此文一直放着草稿箱没有完成&#xff0c;感觉自己在家庭和工作中找到了拖延的借口&#xff0c;开始慢慢变得懒惰了&#xff0c;那是万万不行的。恰逢2023开年ChatGPT的爆火&#xff0c;更让我这些普通程序员危机感瞬间飙升&#xff…

安全规约第一章

文章目录传统密码和现代密码的区别古典密码近代密码现代密码定义模型证明现代密码学CryptographyCryptanalysisCryptosystemScheme如何定义算法步骤第一步&#xff0c;搞清楚安全服务目标第二步&#xff0c;计算过程中需要几方的参与需要几个算法描述它算法命名谁来运行哪一个算…