重学java 51.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.如果类型不确定,但是能知道以后只能传递某个类的继承体系中的子类或者父类,就可以使用泛型的通配符

package S85Genericity;

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

/*
    Integer ——> number ——> object
    String ——> Object
 */
public class Demo240Genericity4 {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        ArrayList<Number> list3 = new ArrayList<>();
        ArrayList<Object> list4 = new ArrayList<>();

         get1(list1);
        // get1(list2);  错误
         get1(list3);
        // get1(list4); wojA\

        System.out.println();
        // get2((list1)); 错误
        // get2(list2);
         get2(list3);
         get2(list4);

    }

//    上限    ? 只能接受extends后面的本类类型以及子类类型
    public static void get1(Collection<? extends Number> collection){

    }

//    下限    ? 只能接收super后面的技术类型以及父类类型
    public static void get2(Collection<? super Number> collection){

    }

//    应用场景:
//1.如果我们在定义类,方法,接口的时候,如果类型不确定,我们可以考虑定义含有泛型的类,方法,接口
// 2.如果类型不确定,但是能知道以后只能传递某个类的继承体系中的子类或者父类,就可以使用泛型的通配符

}

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

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

相关文章

.net JQ AJAX 请求 FromBody 接收格式

$.ajax({ url: “/api/banchang/EmpTble/Login2”, type: ‘Post’, data: JSON.stringify({ Emppassword: pass, EmpName: name }), contentType: ‘application/json’, beforeSend: function () { // 禁用按钮防止重复提交 /* $(“#create”).attr({ disabled: “disabled”…

同一个类中方法调用,导致@Transactional失效

1.背景 查了一下Spring文档&#xff0c;就是上面这段话所说的情况。 2.Spring官方文档有这么一段话 https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#transaction-declarative In proxy mode (which is the default), only external …

经典获奖案例 | 度小满互联网金融开源软件治理解决方案

近日&#xff0c;广东省粤港澳合作促进会金融专业委员会和粤港澳大湾区金融创新研究院在广州联合举办“2024年粤港澳大湾区数智金融峰会暨第二届金融创新优秀应用案例与解决方案技术成果授牌仪式”。《度小满互联网金融开源软件治理解决方案》从数百个申报项目中脱颖而出&#…

基于心电疾病分类的深度学习模型部署应用于OrangePi Kunpeng Pro开发板

一、开发板资源介绍 该板具有4核心64位的处理器和8TOPS的AI算力&#xff0c;让我们验证一下&#xff0c;在该板上跑深度学习模型的效果如何&#xff1f; 二、配网及远程SSH登录访问系统 在通过microusb连接串口进入开发板调试&#xff0c;在命令行终端执行以下命令 1&#…

Docker安装MySQL的详细教程

1. 拉取MySQL镜像 拉取MySQL镜像。您可以指定版本号&#xff0c;例如5.7或8.0&#xff0c;如果不指定&#xff0c;默认会拉取最新稳定版。 docker pull mysql:5.7或者&#xff0c;使用最新版本&#xff1a; docker pull mysql:latest2. 运行MySQL容器 拉取镜像完成后&#…

C++ 进阶(3)虚函数表解析

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 请多多指教&#xff01; 目录 一、虚函数表 二、单继承&#xff08;无虚函数覆盖&#xff09; 继承关系表&#xff1a; 对于实例&#xff1a;derive d 的虚函数表&#xff1a; 对于实例&#xff1a;b…

《C语言深度解剖》(15):动态内存管理和柔性数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…

后端企业级开发之yaml数据序列化格式文件详解2024

yaml格式 数据格式 yaml 是一种数据序列化的格式 容易阅读 容易与脚本语言交互 以数据为核心 重数据轻格式 我们要知道他怎么书写 大小写敏感 属性层级关系使用多行描述 每行结尾使用冒号结束 使用缩进表示层级关系 同层级左侧对其 只运行使用空格 属性前面添加空格 #表…

JAVA 大鱼吃小鱼小游戏

java实现大鱼吃小鱼&#xff0c;支持身份证防沉迷、账号密码、选择难度 放沉迷 登录 选择难度 游戏界面

【Unity Shader入门精要 第9章】更复杂的光照(四)

1. 透明度测试物体的阴影 对于物体有片元丢弃的情况&#xff0c;比如透明度测试或者后边会讲到的消融效果&#xff0c;使用默认的 ShadowCaster Pass 会产生问题&#xff0c;这是因为该Pass在生成阴影映射纹理时&#xff0c;没有考虑被丢弃的片元&#xff0c;而是使用完整的模…

Java类加载过程

类加载三个阶段任务&#xff1a; 加载和连接阶段是JVM虚拟机完成的&#xff0c;无法进行控制。 初始化阶段是程序员可以控制的&#xff0c;例如在代码块中对静态成员初始化等。 1、加载阶段&#xff1a; JVM在该阶段主要目的是 将字节码从不同的数据源(class文件&#xff0c;ja…

k8s部署calico遇到的问题

kubernetes安装calico calico官网 环境&#xff1a;centos7.9&#xff0c;calico 3.23&#xff0c;kuberadm 1.26 问题1&#xff1a;执行kubectl create -f calico.yml后报错如下 error: resource mapping not found for name: “tigera-operator” namespace: “” from “…

网络故障与排除(一)

一、Router-ID冲突导致OSPF路由环路 路由器收到相同Router-ID的两台设备发送的LSA&#xff0c;所以查看路由表看到的OSPF缺省路由信息就会不断变动。而当C1的缺省路由从C2中学到&#xff0c;C2的缺省路由又从C1中学到时&#xff0c;就形成了路由环路&#xff0c;因此出现路由不…

【AREngine BUG 解决方法】无法获取有效的相机图像尺寸

近期拿了一台 华为mate20 Pro的手机&#xff0c;在运行AR示例的过程中出现了黑屏。 问题排查 SDK版本&#xff1a;com.huawei.hms:arenginesdk:3.7.0.3 定位 经排查&#xff0c;发现(ARCamera对象的相机内参) getImageDimensions()返回的图像尺寸的width和height都为0。 这…

接口自动化测试之pytest 运行方式及前置后置封装

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、Pytest 优点认知 1.可以结合所有的自动化测试工具 2.跳过失败用例以及失败重跑 3.结合allur…

tinymce富文本编辑器使用

安卓富文本编辑器&#xff1a;npm i tinymce/tinymce-vue 当前项目中富文本是放在一个dialog中&#xff0c;因此部分样式会有层叠问题&#xff0c;该组件样式部分不添加scope。这里图片上传只是前端静态数据展示收集。 <template><div class"desc-editor"…

电脑突然提示:“failed to load steamui.dll”是什么情况?分享几种解决steamui.dll丢失的方法

相信有一些用户正在面临一个叫做“failed to load steamui.dll”的问题&#xff0c;这种情况多半发生在试图运行某个程序时&#xff0c;系统会提示一条错误消息&#xff1a;“failed to load steamui.dll”。那么&#xff0c;为何steamui.dll文件会丢失&#xff0c;又应该如何解…

【数据结构与算法 | 队列篇】力扣102, 107

1. 力扣102 : 二叉树的层序遍历 (1). 题 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3]…

从GPT-3.5到GPT-4O:探索AI的进化之旅,哪一版更懂你?

如何评价GPT-4o? 最新的GPT-4O&#xff0c;被誉为GPT-4的增强版。它在保持前代产品优秀性能的基础上&#xff0c;大幅降低了使用成本&#xff0c;使得更多的普通用户也能享受到顶尖AI的服务。GPT-4O在非英语语言处理上的强化&#xff0c;更是让其在全球范围内的适用性大大提高…

K8s集群之 存储卷 PV PVC

默写 1 如何将pod创建在指定的Node节点上 node亲和、pod亲和、pod反亲和: 调度策略 匹配标签 操作符 nodeAffinity 主机 In,NotIn,Exists,DoesNotExist&#xff0c;Gt&#xff0c;Lt podAffinity …