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

news2024/10/7 18:25:42

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

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

}

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

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

相关文章

【Node】nodejs版本管理切换工具

1、nvm介绍 Node Version Manager&#xff08;NVM&#xff09; 是一种用于管理多个主动节点.js版本的工具。 Node.js平台&#xff0c;Node.js工具社区和Node.js库是快速移动的目标 - 在一个Node.js版本下可能有效的方法不能保证适用于另一个版本的Node.js。因此&#xff0c;用户…

人工智能的数学基础(高数)

&#x1f31e;欢迎来到人工智能的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年5月29日&…

性能测试(基于Jmeter)

性能指标 RT&#xff08;Response Time&#xff09;响应时间&#xff1a;指的是用户从客户端发起请求开始到服务端返回结束&#xff0c;整个过程所耗费的时间 HPS&#xff08;Hits Per Second&#xff09;&#xff1a; 每秒点击次数&#xff0c;单位&#xff1a;次/秒 TPS&am…

【FISCO BCOS 3.0】一、新版本搭链介绍

目录 一、区块链种类的变化 二、搭链演示 1.单群组区块链&#xff08;Air版本&#xff09; 2.多群组区块链&#xff08;Pro版本&#xff09; 3.可扩展区块链&#xff08;Max版本&#xff09; FISCO BCOS的发展速度如日中天&#xff0c;对于稳定的2.0版本而言&#xff0c;偶…

看完这篇抖音小店选品秘籍!难道还愁不会选品吗?

大家好&#xff0c;我是喷火龙。 做抖音小店&#xff0c;没有什么花里胡哨的东西&#xff0c;核心就是我们的产品&#xff0c;把大部分精力用到选品上肯定是没错的。 选品之前一定要做好店铺的定位&#xff0c;确定好自己的主营类目&#xff0c;主营类目至少要占店铺产品的70…

Windows系统部署YOLOv5 v6.1版本的训练与推理环境保姆级教程

文章目录 一 概述二 依赖环境(prerequisites)2.1 硬件环境2.2 软件环境 三 环境安装3.1 创建并激活虚拟环境3.2 安装Pytorch与torchvision3.3 校验Pytorch安装3.4 下载 YOLOv5 v6.1 源码3.5 安装 YOLOv5 依赖3.6 下载预训练模型3.7 安装其他依赖3.8 测试环境安装3.9 测试训练流…

el-image本地图片不显示,提示加载失败

问题描述&#xff1a;el-image使用本地图片不显示&#xff0c;提示加载失败。 <el-image src"../../assets/img/value.png"></el-image> 解决方法&#xff1a;src用里面加个require&#xff0c;注意给 src 属性加: <el-image :src"require(../..…

centos7离线安装pthon3.8

centos7离线安装pthon3.8 因服务器无外网环境&#xff0c;所以事先需要把所有离线的依赖都准备好。 安装前的准备 先在有外网环境的机器上准备依赖 安装 centos-release-scl 第三方yum源 yum install centos-release-scl安装 yum 依赖下载插件 yum install yum-plugin-do…

《C语言深度解剖》(16):C语言的文件读写操作

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

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…

代码助手之-百度Comate智能体验

简介 越来越多的厂商提供了智能代码助手&#xff0c;百度也不例外。Baidu Comate&#xff08;智能代码助手&#xff09;是基于文心大模型&#xff0c;Comate取自Coding Mate&#xff0c;寓意大家的AI编码伙伴。Comate融合了百度内部多年积累的编程现场大数据和外部开源代码和知…

革新风暴来袭:报事报修系统小程序如何重塑报事报修体验?

随着数字化、智能化的发展&#xff0c;已经应用在我们日常生活和工作的方方面面。那么&#xff0c;你还在为物业报修而头疼吗&#xff1f;想象一下&#xff0c;家里的水管突然爆裂&#xff0c;你急忙联系物业&#xff0c;时常面临物业电话忙音、接听后才进行登记繁琐的报修单、…

UC浏览器,居然这么牛?

你有一个10GB的文件&#xff0c;你想把它发送给你的好友&#xff0c;你会选择什么方式&#xff1f; A&#xff1a;某打败5G的网盘 B&#xff1a;聊天软件 C&#xff1a;文件传输助手 D&#xff1a;买一个U盘快递过去 E&#xff1a;钝角 我的答案是&#xff1a;文件传输助手&a…

图解Java数组的内存分布

我们知道&#xff0c;访问数组元素要通过数组索引&#xff0c;如&#xff1a; arr[0]如果直接访问数组&#xff0c;比如&#xff1a; int[] arr1 {1}; System.out.println(arr1);会发生什么呢&#xff1f; 打印的是一串奇怪的字符串&#xff1a;[I16b98e56。 这个字符串是J…

4-Django项目--资产管理

目录 项目结构 asset_data.html asset_data/add_modify.html views/asset_data.py ------资产管理-------- 资产信息展示 views/asset_data.py 添加资产信息 添加和编辑的html可参考学员信息添加修改html views/asset_data.py 修改信息资产 views/asset_data.py 项…

MySQL注入 — Dns 注入

DNS注入原理 通过子查询&#xff0c;将内容拼接到域名内&#xff0c;让load_file()去访问共享文件&#xff0c;访问的域名被记录此时变为显错注入,将盲注变显错注入,读取远程共享文件&#xff0c;通过拼接出函数做查询,拼接到域名中&#xff0c;访问时将访问服务器&#xff0c;…

聊聊最近很火的混合专家模型(MoE)

前段时间&#xff0c;在2024年NVIDIA GTC大会上&#xff0c;英伟达不小心透露了GPT-4采用了MoE架构&#xff0c;模型有1.8万亿参数&#xff0c;由8个220B模型组成&#xff0c;与此前的GPT-4泄露的信息一致。 近半年多以来&#xff0c;各类MoE大模型更是层出不穷。在海外&#…

【Tlias智能学习辅助系统】01 准备工作

Tlias智能学习辅助系统 01 创建员工、部门表创建springboot工程&#xff0c;引入对应的起步依赖(web、mybatis、mysql驱动、lombok)准备 Mapper、Service、Controller 等基础结构MapperServiceControllerpojo封装类application.properties 接口开发规范 创建员工、部门表 -- 创…

MyBatis的坑(动态SQL会把0和空串比较相等为true)

文章目录 前言一、场景如下二、原因分析1. 源码分析2. 写代码验证 三、解决办法代码及执行结果如下 总结 前言 在开发过程中遇到MyBatis的动态SQL的if条件不生效的情况&#xff0c;但经过debuger发现并不是参数问题&#xff0c;已经拿到了参数并传给了MyBatis&#xff0c;且从表…

第十九节:带你梳理Vue2: 父组件向子组件传参(props传参)

1. 组件嵌套 1.1 组件的嵌套使用 之前有说过,Vue组件跟Vue实例是一样的,因此在Vue中一个组件中也可以定义并使用自己的局部组件,这就是组件的嵌套使用 例如:示例代码如下: <div id"app"><!-- 3. 使用组件 --><my-component></my-component&…