重学java51.Collections集合工具类、泛型

"我已不在地坛,地坛在我"

                         —— 《想念地坛》 24.5.28

一、Collections集合工具类

1.概述:集合工具类

2.特点:

        a.构造私有
        b.方法都是静态的

3.使用:类名直接调用

4.方法:

        static <T> boolean addAll(collection<? super T>c,T... elements) —> 批量添加元素

        static void shuffle(List<?> list) —> 将集合中的元素顺序打乱

        static <T> void sort(List<T> list) —> 将集合中的元素按照默认规则排序
        static <T> void sort(List<T> list,comparator<? super T> c) —> 将集合中的元素按照指定规则排序

5.Comparator比较器

a.方法:

        int compare(T ol,T o2)
                o1-o2 ->升序
                o2-o1 -> 降序    

package S84Collections;

public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Demo233Collections2 {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person(18,"小明"));
        list.add(new Person(19,"小红"));
        list.add(new Person(17,"小刚"));

        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                // 按年龄排序
                return o1.getAge()-o2.getAge();
            }
        });
    }
}

compareTo提前定义好排序规则

package S84Collections;

public class Student implements Comparable<Student>{
    private String name;
    private Integer score;

    public Student() {
    }

    public Student(String name, Integer score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }

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

    public Integer getScore() {
        return score;
    }

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

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

    @Override
    public int compareTo(Student o) {
        return this.getScore()-o.getScore();
    }
}
package S84Collections;

import java.util.ArrayList;
import java.util.Collections;

public class Demo234ArraysAsList {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("小明",100));
        list.add(new Student("小红",98));
        list.add(new Student("小刚",75));
        Collections.sort(list); // Student提前决定排序规则
        System.out.println(list);   // [Student{name='小刚', score=75}, Student{name='小红', score=98}, Student{name='小明', score=100}]
    }
}

6.Arrays中的静态方法:

        static <T> List<T> asList(T...a) —> 直接指定元素,转存到list集合

        public static void main(string[] args){

                List<string> list = Arrays.asList("张三","李四”,"王五”);

                System.out.printin(list):

        }

package S84Collections;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

public class Demo235ArraysAsList {
    public static void main(String[] args) {
        // static <T> List<T> asList(T...a) —> 直接指定元素,转存到list集合中
        // public static void main(string[] args){
        //      List<string> list = Arrays.asList("张三","李四”,"王五”);
        //      System.out.printin(list):
        // }
        List<String> list = Arrays.asList("张三","李四","王五");
        System.out.println(list);
    }
}

二、泛型 E/T/V/R

1.为什么要使用泛型?

        ① 从使用层面上说:

                统一数据类型,防止将来的数据类型转换异常

        ② 从定义层面来看:

                定义带泛型的类、方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确定的类型,代码更加灵活

import java.util.ArrayList;

public class Demo236Genericity1 {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<>();
        list.add("hello");
        list.add("world");
        list.add(1);
        list.add(2.5);
        list.add(true);

        // 获取元素中为String类型的字符串长度
        for (Object o : list) {
            String s = (String) o;
            System.out.println(s.length());
        }
    }
}

2.什么时候确定类型

        new对象的时候确定类型

3.含有泛型的类

package S85Genericity;

import java.util.Arrays;

public class MyArrayList <E>{
    // 定义一个数组,充当ArrayList底层的数组,长度直接规定为10
    Object[] obj = new Object[10];
    // 定义size,代表集合元素个数
    int size;

    // 定义一个add方法,参数类型需要和泛型类型保持一致,数据类型为E,变量名随意
    public boolean add(E e){
        obj[size] = e;
        size++;
        return true;
    }

    // 定义一个get方法。根据索引获取元素
    public E get(int index){
        return (E) obj[index];
    }

    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}
package S85Genericity;

public class Demo238Test {
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
        list.add("一切都会好的");
        list.add("我一直相信");
        System.out.println(list);   // 直接输出对象名,默认调用toString
        // [一切都会好的, 我一直相信, null, null, null, null, null, null, null, null]

        System.out.println("————————————————————————");

        MyArrayList<Integer> list1 = new MyArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        System.out.println(list1);
        // [1, 2, 3, null, null, null, null, null, null, null]
        Integer ele = list1.get(1);
        System.out.println(ele);    // 2
    }
}

4.含有泛型的方法

① 格式:

        修饰符 <E> 返回值类型 方法名(E e)

② 什么时候确定类型

        调用的时候确定类型

③ 示例

import java.util.ArrayList;

public class ListUtils {
    // 定义一个静态方法addAll,添加多个集合的元素
    // 可变参数: E...e 可变参类型
    // E是声明不是返回值类型,还要另外传参数类型
    public static <E> void addAll(ArrayList<E> list,E ...e){
        // 遍历数组
        for (E element : e) {
            list.add(element);
        }
    }
}
public class Demo238Test {
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
        list.add("一切都会好的");
        list.add("我一直相信");
        System.out.println(list);   // 直接输出对象名,默认调用toString
        // [一切都会好的, 我一直相信, null, null, null, null, null, null, null, null]

        System.out.println("————————————————————————");

        MyArrayList<Integer> list1 = new MyArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        System.out.println(list1);
        // [1, 2, 3, null, null, null, null, null, null, null]
        Integer ele = list1.get(1);
        System.out.println(ele);    // 2
    }
}

5.含有泛型的接口

① 格式:

        public interface 接口名<E>{

        

        }

② 什么时候确定类型:

        a.在实现类的时候还没有确定类型,只能在new实现类的时候确定类型了 —> ArrayList

        b.在实现类的时候百接确定类型了 —> 比如Scanner

③ 示例

        接口

package S85Genericity;

public interface MyList <E>{
    public boolean add(E e);
}
package S85Genericity;

import java.util.Arrays;

public class MyArrayList1<E> implements MyList<E>{
    // 定义一个数组,充当ArrayList底层的数组,长度直接规定为10
    Object[] obj = new Object[10];
    // 定义size,代表集合元素个数
    int size;

    // 定义一个add方法,参数类型需要和泛型类型保持一致,数据类型为E,变量名随意
    public boolean add(E e){
        obj[size] = e;
        size++;
        return true;
    }

    // 定义一个get方法。根据索引获取元素
    public E get(int index){
        return (E) obj[index];
    }

    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}
package S85Genericity;

public class Demo239MyListTest {
    public static void main(String[] args) {
        MyArrayList<String> list1 = new MyArrayList<>();
        list1.add("nov 新的");
        list1.add("port 站点");
        list1.add("trans 转变");
        list1.add("fer 拿");
        list1.add("cover 覆盖 表面");
        list1.add("fess 说 讲");
        list1.add("view 看作 视作");
        list1.add("mean 意思 包含");
        list1.add("con 一起");
        list1.add("age 年龄 年代 作名词");
        System.out.println(list1);
        System.out.println(list1.get(0));
    }
}

6.泛型的上限下限

        1.作用:可以规定泛型的范围

        2.上限:

                a.格式:<? extends 类型>
                b.含义:?只能接收extends后面的本类类型以及子类类型

        3.下限:

                a.格式:<? super 类型>
                b.含义:?只能接收super后面的本类类型以及父类类型

7.应用场景:

        1.如果我们在定义类,方法,接口的时候,如果类型不确定,我们可以考虑定义含有泛型的类、方法、接口

        2.如果类型不确定,但是能知道以后只能传递某个类的继承体系中的子类或者父类,就可以使用泛型的通配符

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ABAP MD04增强排除MRP元素

场景 MD04跑出来很多MRP元素&#xff0c;用户想手工控制某些MRP元素不参与运算 分析 增强点还蛮好找的&#xff0c;控制MRP元素是否参与运算用下面的se19三代增强点就可以&#xff0c;打个断点看下MD04进的哪个增强点就行 旧版本的用这个&#xff1a;MD_CHANGE_MRP_DATA 新…

【Linux】Socket中的心跳机制(心跳包)

Socket中的心跳机制(心跳包) 1. 什么是心跳机制&#xff1f;(心跳包) 在客户端和服务端长时间没有相互发送数据的情况下&#xff0c;我们需要一种机制来判断连接是否依然存在。直接发送任何数据包可以实现这一点&#xff0c;但为了效率和简洁&#xff0c;通常发送一个空包&am…

数据结构 | 详解二叉树——堆与堆排序

&#x1f95d;堆 堆总是一棵完全二叉树。 大堆&#xff1a;父节点总是大于子节点。 小堆&#xff1a;父节点总是小于子节点。 注意&#xff1a;1.同一个节点下的两个子节点并无要求先后顺序。 2.堆可以是无序的。 &#x1f349;堆的实现 &#x1f334;深度剖析 1.父节点和子…

【传知代码】自监督高效图像去噪(论文复现)

前言&#xff1a;在数字化时代&#xff0c;图像已成为我们生活、工作和学习的重要组成部分。然而&#xff0c;随着图像获取方式的多样化&#xff0c;图像质量问题也逐渐凸显出来。噪声&#xff0c;作为影响图像质量的关键因素之一&#xff0c;不仅会降低图像的视觉效果&#xf…

python基础知识总结(第一节)

一、python简介&#xff1a; Python是一种解释型&#xff0c;面向对象的高级语言。 Pyhton的语法和动态类型&#xff0c;以及解释性语言的本质&#xff0c;使它一跃成为多数平台上写脚本和快速开发应用的编程语言。 python语言百度百科介绍 二、Python基础语法&#xff1a;…

【busybox记录】【shell指令】mkfifo

目录 内容来源&#xff1a; 【GUN】【mkfifo】指令介绍 【busybox】【mkfifo】指令介绍 【linux】【mkfifo】指令介绍 使用示例&#xff1a; 创建管道文件 - 创建的时候同时指定文件权限 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来…

月赚2万佣金的AI数字人,已成为新型带货神器,完整制作教程分享

大家好&#xff0c;我是设计师阿威 今天和大家分享一下用AI绘画制作数字人带货的副业创收教程&#xff0c;目前数字人类型的账号在短视频平台上&#xff0c;数字人带货能力非常强&#xff01; 今天我会分享4个爆款数字人账号案例&#xff0c;深度讲解目前数字人的最新玩法。 …

开源代码分享(31)-计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

参考文献&#xff1a; [1]孙惠娟,刘昀,彭春华,等.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度[J].电网技术,2021,45(09):3534-3545.DOI:10.13335/j.1000-3673.pst.2020.1720. 1.摘要 为了促进多能源互补及能源低碳化&#xff0c;提出了计及电转气协同的含碳捕集与垃…

三十三、openlayers官网示例Drawing Features Style——在地图上绘制图形,并修改绘制过程中的颜色

这篇讲的是使用Draw绘制图形时根据绘制形状设置不同颜色。 根据下拉框中的值在styles对象中取对应的颜色对象&#xff0c;new Draw的时候将其设置为style参数。 const styles {Point: {"circle-radius": 5,"circle-fill-color": "red",},LineS…

Web会话管理

一、会话管理的概念&#xff1a; 在人机交互时&#xff0c;会话管理是保持用户的整个会话活动的互动与计算机系统跟踪过程会话管理分类: 桌面会话管理、浏览器会话管理、Web服务器的会话管理。 二、为什么需要会话管理&#xff1f; HTTP是一种无状态协议&#xff0c;一次请…

day12

第一题 本题我们可以使用以下方法&#xff1a; 方法一&#xff1a; 使用hash表<元素&#xff0c;出现次数>来统计字符串中不同元素分别出现的次数&#xff0c;当某一个元素的次数大于1时&#xff0c;返回false&#xff0c;如果每个元素的出现次数都为1&#xff0c;则返回…

ABB 控制柜

1,主计算机:相当于电脑的主机,用于存放系统和数据,需要24V直流电才能工作。执行用户编写的程序,控制机器人进行响应的动作。主计算机有很多接口,比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴计算机板的接口、连接安全面板的接口、不同的现场总线卡接口(比…

web刷题记录(1)

[GXYCTF 2019]Ping Ping Ping 进入页面&#xff0c;发现有一个传入参数的框&#xff0c;目的就是为了让我们通过参数传入内容来执行代码。这里先传入本地ip&#xff0c;方便后面的ping命令运行 ls命令来查看&#xff0c;目录中的文件 传入后&#xff0c;发现目录下有flag.php,…

Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式

启动容器时&#xff0c;通过-p 宿主机端口:容器端口&#xff0c;就可以通过访问宿主机端口访问到容器&#xff0c;这种原理机制是啥&#xff0c;有没有其它方式可以让宿主机和容器通信&#xff0c;以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。 文章…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

攀爬二叉树,发现新的美

二叉树 什么是二叉树? 二叉树的基础概念? 性质? 问题? 文章目录 二叉树一、二叉树的概念(一)认识二叉树(二)二叉树的性质 二、遍历二叉树1.前序遍历2.中序遍历3.后序遍历4.层序遍历 三丶创建二叉树总结 一、二叉树的概念 (一)认识二叉树 二叉树是一种非线性的数据结构,…

NSSCTF-Web题目4

[SWPUCTF 2021 新生赛]hardrce 1、题目 2、知识点 rce&#xff1a;远程代码执行、url取反编码 3、解题思路 打开题目 出现一段代码&#xff0c;审计源代码 题目需要我们通过get方式输入变量wllm的值 但是变量的值被过滤了&#xff0c;不能输入字母和\t、\n等值 所以我们需…

目标检测 | R-CNN、Fast R-CNN与Faster R-CNN理论讲解

☀️教程&#xff1a;霹雳吧啦Wz ☀️链接&#xff1a;https://www.bilibili.com/video/BV1af4y1m7iL?p1&vd_sourcec7e390079ff3e10b79e23fb333bea49d 一、R-CNN R-CNN&#xff08;Region with CNN feature&#xff09;是由Ross Girshick在2014年提出的&#xff0c;在PAS…

mysql中InnoDB的统计数据

大家好。我们知道&#xff0c;mysql中存在许多的统计数据&#xff0c;比如通过SHOW TABLE STATUS 可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;今…

未在计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序和未在本地计算机上注册“microsoft.ACE.OLEDB.12.0”提供程序

程序运行出现下图的错误&#xff0c; 或者下图的错误&#xff0c; 首先看一下是不是运行的程序的位数&#xff08;32/64&#xff09;不对&#xff1b; 查看系统位数的方法如下图&#xff1b;下图显示是64位操作系统&#xff1b; 如果运行的程序的位数没有问题&#xff1b; 则需…