第十三章 集合

news2024/12/27 2:54:30

一、集合的概念

集合:将若干用途、性质相同或相近的“数据”组合而成的一个整体

Java集合中只能保存引用类型的数据,不能保存基本类型数据

数组的缺点:长度不可变

Java中常用集合:

1.Set(集):集合中的对象不按特定方式排序,并且没有重复对象

2.List(列表):集合中的对象按照索引位置排序,可以有重复对象,允许按索引位置索引对象

3.Map(映射):集合中的每个元素包含一个键对象和值对象,集合中没有重复的键对象,值对象可以重复

二、Collection接口

public class CollectionTest {
    public static void main(String[] args) {
        //Collection是接口,需要用实现类创建对象
        Collection c = new ArrayList();
        //集合中保存多少长度
        System.out.println("获取集合的长度"+c.size());
        //如果没有数据返回true,有数据返回false
        System.out.println("判断集合是否为空"+c.isEmpty());
        //往集合中添加数据用add方法
        c.add("张三");
        //集合中是不能保存基本数据类型的,只能保存对象类型
        //而基本数据类型可以保存的原因是jdk1.5之后基本数据类型会跟包装类类型进行默认转换
        c.add(123);
        c.add(true);
        c.add('a');
        c.add(99.5);
        //集合重写了Object的toString方法,所以打印显示的内容不是地址
        System.out.println(c);
        System.out.println(c.size());
        //删除集合中的数组
        c.remove(123);
        System.out.println(c);
        //删除数据之后集合的长度会发生改变,但是数组的长度不会
        System.out.println(c.size());
        //将集合转换为数组的方法
        Object []objects = c.toArray();
        for(Object o :objects){
            System.out.println(o + " ");
        }
    }
}

三、Iterator接口

Iterator接口的作用:遍历容器中的元素

Iterator接口的方法:

boolean hasNext()

Object next()

void remove()

public class IteratorTest {
    public static void main(String[] args) {
        //Collection是接口,需要用实现类创建对象
        Collection c = new ArrayList();
        c.add(123);
        c.add(true);
        c.add('a');
        c.add(99.5);
        //使用迭代器遍历集合
        Iterator it = c.iterator();
        //hasNext方法用于判断后面是否还有数据,如果有则返回true,如果没有数组则返回false
        while(it.hasNext()){
            //next方法用于获取集合中的数据
            System.out.println(it.next());
        }
    }
}

四、Set

1.Set接口未提供额外的方法

2.Set的实现类:HashSet、TreeSet

3.HashSet类:按照哈希算法存取集合中的对象

(1)哈希算法判断集合中的元素是否重复,先判断对象的hashcode,然后使用equals()方法

(2)为了使HashSet正常工作,类重写equals()方法时必须重写hashcode()方法,以保证两个引用同一对象的两个变量的hashcode也一致

4.TreeSet:能够对集合中的对象进行自动排序

(1)集合中的对象必须可以比较

(2)自然排序:集合中的对象进行比较,然后进行升序排列

                集合中对象的类必须实现java.lang.Comparable接口,使用compareTo()方法进行比较

                Java类库中实现Comparable接口的常用类

(3)自定义排序

如果希望TreeSet类的对象按着自定义方式排序,需要让集合中对象的类实现java.util.Comparator接口

5.set集合不可以重复的不仅仅是同一个对象不能保存进set集合,不同对象,内容相同的也不能保存进集合中说到比较首先想到的是equals但是set集合为了提交比较效率会先进行hash比较,hash值是对象的内容经过一系列hash计算,得到的一个整数。如果两个对象的hash值不同,则表示不是同一个对象,如果hash值相同,则证明这两个对象可能是同一个对象,要进行equals比较,方法出现hash值相同,但是内容不同的情况偶然发生。

public class SetTest {
    public static void main(String[] args) {
        //set集合特点,无序(指添加到集合中的顺序和显示集合的顺序不一致+)不可以重复
        Set set = new HashSet();
        set.add(123);
        set.add(true);
        set.add('a');
        set.add(99.5);
        //set集合无序不可以重复,不仅仅是同一个对象不能重复,不同对象内容重复也不能保存到set集合里
        String s1 = "world";
        String s2 = new String("world");
        set.add(s1);
        set.add(s2);
        System.out.println(set);
    }
}
public class Test {
    public static void main(String[] args) {
        Set set = new HashSet();
        Student s1 = new Student(1001,'l',18);
        Student s2 = new Student(1001,'l',18);
        Student s3 = new Student(1001,'s',20);
        set.add(s1);
        set.add(s2);
        set.add(s3);
        System.out.println(set);
    }
}
class Student{
    int no;
    char name;
    int age;
    public Student (int no,char name,int age){
        this.age = age;
        this.name = name;
        this.no = no;}
    //要想让自己写的类在set集合中正常保存,就需要重写equals的同时重写hashCode方法
    //正常保存指的是同一个对象不能保存进集合中,不同对象内容相同也不能保存进集合中
    @Override
    public boolean equals(Object o) {
        if(this == o ){
            return true;
        }//判断o对象是不是有Student创建的
        if(o instanceof Student){
            Student s = (Student)o;
            //在逐一比较每个属性的值是否相同
            if (age == s.age&&name ==s.name&&no==s.no){
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        return age*5+name*5+no*5;
    }
}

五、List

1.List元素都对应一个整数类型的序号记录其在集合中的位置,可以根据序号存取集合中的元素

2.List的实现类:ArrayList、LinkedList等

3.Arrays补充方法:List asList(数组类型 a)

4.ArrayList:

(1)代表长度可变的数组

(2)查询速度较快、增删改速度较慢

5.LinkedList:

 (1)采用链表数据结构,对顺序访问进行优化

 (2)增删改速度较快,查询速度较慢

注意:一定要实际问题实际分析,规律可能会发生变化

public class ListTest {
    public static void main(String[] args) {
        //list集合有序可以重复,可以通过索引获取对应位置的数据
        List list = new LinkedList();
        list.add(123);
        list.add("hello");
        list.add(false);
        list.add(true);
        list.add(98.2);
        list.add('l');
        System.out.println(list);
        //get方法,通过索引获取对应位置的数据
        System.out.println("获取索引为2,第三个位置的数据"+list.get(2));
        //set方法,修改指定位置的数据的值
        list.set(1,"hello world");
        System.out.println(list);
        //在指定索引位置添加数据
        list.add(1,"hello");
        System.out.println(list);
        //删除指定索引位置的数据
        list.remove(1);
        System.out.println(list);
        //将数组转换为集合,那么数组保存数据类型必须是对象类型,基本数据类型要使用包装类
        Integer[] a = {1,2,3,4,5,6,7,8,9};
        List list1 = Arrays.asList(a);
        System.out.println(list1);
        //List集合的便利形式
        //第一种转换数组在遍历
        Object[] object = list1.toArray();
        for (Object o: object){
            System.out.print(o + " ");
        }
        System.out.println();
        //第二中使用迭代器遍历
        Iterator it = list1.iterator();
        while (it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();
        //第三种,直接遍历使用get方法获取数据
        for (int i=0;i<list1.size();i++){
            System.out.print(list1.get(i)+" ");
        }
        System.out.println();
        //第四种使用foreach循环遍历
        for(Object o:list1){
            System.out.print(o + " ");
        }
    }


}

六、Map

1.Map中存储的元素通常都是由key来表示,所以同一Map中key值不能重复,value值无要求

2.Map的实现类:HashMap、TreeMap

3.Map接口的属性:Entry——映射项(键-值对)

public class MapTest {
    public static void main(String[] args) {
        Map map = new HashMap();
        //Map集合以键值对的形式保存数据,键不能重复,值可以重复
        //put方法往Map集合中保存数据
        map.put("a","123");
        map.put(1,false);
        map.put('a',95.5);
        map.put(true,100);
        System.out.println(map);
        //map集合保存数据要求key不能重复,但是如果重复了也不会报错
        //会用心地value值将之前的数据覆盖掉
        map.put(true,200);
        System.out.println(map);
        //get方法,根据key值获取对应的value值
        System.out.println(map.get(true));
        //根据key值删除map集合中的数据
        map.remove('a');
        //当要删除的key不存在的时候,代码书写执行不会报错,就是没有删除而已
        map.remove(false);
        System.out.println(map);
        System.out.println("获取map集合中的元素个数" + map.size());
        //clear清空集合
        //map.clear()
        //遍历map集合
        //1.通用遍历形式 最通用
        Set set = map.entrySet();
        Iterator it = set.iterator();
        while (it.hasNext()){
            Map.Entry entry = (Map.Entry) it.next();
            System.out.println("保存数据时候的key值" + entry.getKey());
            System.out.println("保存数据时候的value值" + entry.getValue());
            System.out.println();
        }
        //2.特殊形式的遍历

        Map map1 = new HashMap();
        //当key值都是有规律的,且不同的是一段连续的数字,那么就可以通过get方法来获取
        //数据,从而遍历集合
        map1.put("item0","123");
        map1.put("item1","true");
        map1.put("item2",'k');
        map1.put("item3","k");
        map1.put("item4",1000);
        for (int i = 0;i<map1.size();i++){
            System.out.println(map1.get("item"+i));
        }
    }}

七、Collections类

java.util.Collections类:提供一系列的基于集合操作的常用静态方法

public class CollectionsTest {
    //Collection类是专门操作集合的类
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("hello");
        list.add("zhangsan");
        list.add("zhao");
        list.add("wangwu");
        list.add("liuxuiang");
        list.add("zhaoliu");
        //排序
        Collections.sort(list);
        System.out.println(list);
        //倒序
        Collections.reverse(list);
        System.out.println(list);
        //乱序
        Collections.shuffle(list);
        System.out.println(list);
    }
}
public class Demo {
    public static void main(String[] args) {
        List list = new ArrayList();
        Teacher t1 = new Teacher(1001,"张三",18);
        Teacher t2 = new Teacher(1002,"张四",19);
        Teacher t3 = new Teacher(1003,"张五",20);
        list.add(t1);
        list.add(t2);
        list.add(t3);
        Collections.sort(list);
        System.out.println(list);
    }
}
class Teacher implements Comparable{
    int no;
    String name;
    int age;
    public Teacher (int no,String name,int age){
        this.no = no;
        this.name = name;
        this.age = age;
    }

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

    @Override
    public int compareTo(Object o) {
        if (o instanceof Teacher){
            Teacher t = (Teacher) o;
            //this 表示的是前一个数, o表示的是数组中的后一个数·
            //-1表示不需要交换,正数表示需要交换返回正数就行
            if (t.age>this.age){
                return -1;
            } else if(t.age<this.age){
                return 1;
            }
        }
        return 0;
    }
}

八、泛型

1.为何使用泛型?

进入集合的对象都当作Object类型,从而失去了自己的类型;取出后也是Object类型,使用前通常要进行强制转换容易出现ClassCastException异常

2.原因:装入集合的时候无法指定装入的元素是何种类型

3.泛型:

(1)装入集合的时候指定元素的具体的类型

(2)增强程序的稳定性与可读性

4.集合中使用泛型

5.定义泛型类

(1)使用<T>用来声明一个型态持有者名称T(可以替换其它标示符)

(2)在定义泛型类时,可以声明多个泛型类型

              一般形式:class 类名称 <T1,T2> 

(3)声明及配置对象时不一定指定型态,默认会使用Object型态,编译时编译程序会提出警告

(4)可以使用泛型机制来声明一个数组(可以用数组代理T)

(5)不可以使用泛型来建立数组的实例(不能new T[])

6.限制泛型的可用类型

一般形式:class 类名称 <T extends anyClass>

anyClass为类或接口,此类中的泛型必须是实现或继承了anyClass

7.使用类型通配符

一般形式:泛型名称<? extends anyClass>(设定上限)

一般形式:泛型名称<? super anyClass>(设定下限)

public class GenericTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("123");
        list.add("hello");
        //添加泛型之后,在想往集合中和保存其它类型的数据就会报错
        //list.add(123)
        System.out.println(list);
        //泛型不会让保存到集合中的数据丢失自己本身的类型,所以取值的时候就不需要进行类型转换了
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
        //集合中只能保存对象类型,所以在写泛型的时候只能写包装类型不能写基本数据类型
        Map<String,Integer> map = new HashMap();
        map.put("a",5);
    }

}

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

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

相关文章

FastGPT的使用

fastGPT的介绍&#xff1a; fastGPT其实和chatGPT差不多 但是好处是可以自行搭建&#xff0c;而且很方便 链接&#xff1a;https://cloud.fastgpt.cn/app/list 首先我们可以根据红框点击&#xff0c;创建一个简易的对话引导 这个机器人就非常的简易&#xff0c;只能完成一些翻…

自动驾驶系列—LDW(车道偏离预警):智能驾驶的安全守护者

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【Linux系统编程】权限

目录 1、shell命令以及运行原理 2、Linux权限的概念 3、Linux权限管理 3.1 文件访问者的分类(人) 3.2 文件类型和访问权限(事物属性) 4、目录的权限 5、粘滞位 1、shell命令以及运行原理 首先&#xff0c;我们来了解一条指令是如何跑起来的 一般操作系统是不会让用户直…

大数据开发--1.2 Linux介绍及虚拟机网络配置

目录 一. 计算机入门知识介绍 软件和硬件的概述 硬件 软件 操作系统概述 简单介绍 常见的系统操作 学习Linux系统 二. Linux系统介绍 简单介绍 发行版介绍 常用的发行版 三. Linux系统的安装和体验 Linux系统的安装 介绍 虚拟机原理 常见的虚拟机软件 体验Li…

招联金融秋招内推2025

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

四、网络层(下)

4.9 CIDR CIDR&#xff08;Classless Inter-Domain Routing&#xff09;&#xff0c;是IPv4地址分配和路由表选择的一种灵活且高效的方法。 1992年&#xff0c;由于分类地址中的B类地址很快就被分配完了&#xff0c;且路由表中的表项也急剧增加&#xff0c;分类的IP地址并不能…

高校实训产品:教育AI人工智能实训与科研解决方案

保持前沿、提升就业、低成本的教育AI实训全场景方案 产品概述 AIGC实训云图站解决方案为高校提供了灵活、高效的人工智能实训平台。通过弹性裸金属调度技术和GPU虚拟化&#xff0c;实现高性能与低成本的兼顾&#xff0c;为学生和教师提供不受时间和空间限制的实操机会。平台涵…

Linux查看触摸坐标点的方法,触觉智能RK3562开发板,瑞芯微、全志等通用

平时遇到键盘、鼠标、触摸板等输入设备无响应等异常情况时&#xff0c;一般通过更换设备判断异常。但在遇到更换正常设备后&#xff0c;输入仍然异常的情况下&#xff0c;可以借助evtest工具查看内核的上报事件信息&#xff0c;协助定位问题所在。 本次使用的是触觉智能EVB356…

Yolo v11目标检测实战1:对象分割和人流跟踪(附源码)

一、运行效果演示 多目标跟踪 二、基本理论和核心概念 2.1 对象分割 对象分割是指将图像中的每个像素标记为属于某一特定对象或背景的过程。对于YOLO来说&#xff0c;对象分割是其功能的一个扩展&#xff0c;通过添加额外的分支来预测每个检测框内的像素级掩码&#xff0c;从…

Python画笔案例-073 绘制晃悠悠的海龟

1、绘制晃悠悠的海龟 通过 python 的turtle 库绘制 晃悠悠的海龟,如下图: 2、实现代码 绘制晃悠悠的海龟,以下为实现代码: """晃悠悠的海龟.py """ import time # 导入时间模块 import math # 导…

TypeScript 算法手册 【计数排序】

文章目录 1. 计数排序简介1.1 计数排序定义1.2 计数排序特点 2. 计数排序步骤过程拆解2.1 找出数组中的最大值2.2 创建计数数组2.3 统计每个数字出现的次数2.4 重建排序后的数组 3. 计数排序的优化3.1 处理负数3.2 对象数组排序案例代码和动态图 4. 计数排序的优点5. 计数排序的…

[VULFOCUS刷题]tomcat-pass-getshell 弱口令

tomcat-pass-getshell 弱口令 启动容器&#xff0c;打开网站 点开manageapp&#xff0c;输入弱口令 tomcat/tomcat 之后在下面上传jsp大马&#xff0c;首先生成一个jsp马 这里我直接使用github别人生成好的 tennc/webshell: This is a webshell open source project (github.…

Image-Text Co-Decomposition for Text-Supervised Semantic Segmentation

highlighted region-word pair contrastive loss (L h c l _{hcl} hcl​) 辅助信息 mmcv环境不好满足&#xff0c;不建议复现

理解无监督学习、无监督图像分割

系列文章目录 文章目录 系列文章目录一、无监督学习如何学习 能不能举一个非常具体的例子&#xff0c;带着运算过程的例子总结 二、在图像分割中呢&#xff0c;具体怎样实现无监督示例&#xff1a;使用自编码器和k-means进行无监督图像分割1. **数据准备**2. **构建自编码器**3…

小练--盲打学成在线

免责声明&#xff1a;本文仅做分享&#xff01; 学成在线 (olin-yi.github.io) 目录 目录构造 基础公共样式 base.css index.html 版心居中 网页制作思路 CSS 实现思路 头部整体布局 logo 导航制作技巧&#xff08;nav&#xff09; 搜索区域&#xff08;search&am…

Leetcode 2300. 咒语和药水的成功对数

1.题目基本信息 1.1.题目描述 给你两个正整数数组 spells 和 potions &#xff0c;长度分别为 n 和 m &#xff0c;其中 spells[i] 表示第 i 个咒语的能量强度&#xff0c;potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药水的能量强度 相乘…

进程的环境

进程环境 main 函数 当内核执行 C 程序时&#xff0c;在调用 main 函数之前先调用一个特殊的启动例程。可执行文件会将此启动例程指定为程序的起始地址 —— 这是由连接编辑器设置&#xff0c;而连接编辑器是由 C 编译器调用。启动例程从内核取得命令行参数和环境变量值&…

Nodejs多版本切换工具NVM

1 nvm介绍 NVM&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具&#xff0c;它允许用户在同一台计算机上安装和切换不同版本的Node.js。这对于开发者来说非常有用&#xff0c;因为不同的项目可能需要不同版本的Node.js环境。 NVM功能特性&a…

【Spring】Spring Boot项目创建和目录介绍

1 Spring Boot 介绍 Spring 让 Java 程序更加快速、简单和安全&#xff0c;Spring 对于速度、简单性和生产力的关注使其成为世界上最流行的 Java 框架 Spring 官方提供了很多开源的项目&#xff0c;覆盖范围从 Web 开发到大数据&#xff0c;Spring 发展到了今天&#xff0c;已…

使用Mac高频重复输入时别再傻傻的复制粘贴了,让快捷短语解放你的双手

你在使用Mac的时候&#xff0c;常用的句子、词语、代码都还在自己手动输入吗&#xff0c;当你需要高频的输入同样的内容&#xff0c;手动输入效率太低了&#xff0c;我发现一款实用的工具帮你解决这个问题&#xff0c;快捷短语-高频输入神器&#xff0c;更支持iCloud云备份。 快…