重学java 52.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;}@Overridepublic 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>() {@Overridepublic 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}@Overridepublic 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底层的数组,长度直接规定为10Object[] 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];}@Overridepublic 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底层的数组,长度直接规定为10Object[] 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];}@Overridepublic 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 ——> objectString ——> 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.mzph.cn/web/21319.shtml

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

相关文章

Spring Bean的Session作用域:深度剖析与实战应用

1. 引言 理解Spring框架中Bean的作用域至关重要。其中&#xff0c;Session作用域在Web应用程序中尤为关键&#xff0c;因为它确保了用户会话期间Bean实例的共享和一致性。 2. Session作用域的基本概念 Session作用域意味着在一个HTTP Session的生命周期内&#xff0c;Spring容…

YOLOv10(1):初探,训练自己的数据

目录 1. 写在前面 2. 值得关注的点 3. 训练自己的数据集 4. 阅读代码的小建议 1. 写在前面 很多人YOLOv9还没有完全研究透&#xff0c;YOLOv10出来了。 惊不惊喜&#xff0c;意不意外&#xff01; 据论文里提到&#xff0c;YOLOv10就是为了加速推理&#xff0c;在保证精度的…

深入分析 Android BroadcastReceiver (二)

文章目录 深入分析 Android BroadcastReceiver (二)1. 深入理解 BroadcastReceiver 的高级使用和优化2. 有序广播&#xff08;Ordered Broadcasts&#xff09;2.1 实现有序广播 3. 粘性广播&#xff08;Sticky Broadcasts&#xff09;3.1 使用粘性广播 4. 本地广播&#xff08;…

如何在SpringBoot中定义一个自定义的Starter?

在 Spring Boot 中创建一个自定义的 Starter 涉及到创建一个自动配置模块&#xff0c;包括了一组预选的依赖定义和自动配置类。以下是定义一个自定义 Starter 的步骤&#xff1a; 1. 创建自定义 Starter 项目 首先&#xff0c;创建一个新的 Maven 或 Gradle 项目作为自定义 S…

VSCode插件Sort Lines

Sort Lines是一款VSCode中的扩展&#xff0c;可以帮助你对所选文本或整个文件中的行进行排序。可以给你按字母大小排序&#xff08;升序、降序&#xff09;&#xff0c;也可以进行排序去重。而且还能将所有文本打乱顺序。做短文本分类的训练&#xff0c;清洗数据集的时候&#…

《论个人成功与多种因素的关联》

《论个人成功与多种因素的关联》 基因与成长环境共同塑造出了努力向上的个体。通常看来&#xff0c;个人的成功源自自身努力&#xff0c;毕竟所有回报皆由努力及加倍付出换取。但从微观层面深入剖析&#xff0c;为何有人努力奋进&#xff0c;而有人却选择躺平&#xff1f;即便同…

Response

一、响应对象概述 1、什么是响应对象 响应&#xff0c;它表示了服务器端收到请求&#xff0c;同时也已经处理完成&#xff0c;把处理的结果告知用户。简单来说&#xff0c;指的就是服务器把请求的处理结果告知客户端。在B/S架构中&#xff0c;响应就是把结果带回浏览器。响应对…

汽车IVI中控开发入门及进阶(二十五):CVBS视频流

前言: AHD和CVBS是两种视频格式,在车载摄像头中,有支持传统CVBS模拟视频的摄像头,也有支持新的高分辨率AHD格式的摄像头。 CVBS视频是经典的模拟视频格式,在视频经常显示在小型监视器上的车辆上仍然最受欢迎。如果想要车辆的最大分辨率,可选择AHD格式,即高分辨率模拟视…

VRRP联动BFD的相关配置

今天就与大家分享VRRP联动BFD的相关配置&#xff0c;同时也会演示一下没有BFD的情况下&#xff0c;又是如何呢&#xff1f;前后做个对比&#xff0c;只要把情况了解清楚了&#xff0c;初学者才能更加深刻地掌握它。 一、实验拓扑图 二、配置思路 我们在做任何事情&#xff0c…

CTF中的命令执行绕过方式

引言 不论在CTF还是实战中&#xff0c;命令执行的场景五花八门&#xff0c;那么往往在一些小型比赛中&#xff0c;会以那种PING接口进行getflag操作。 0x01&#xff1a;管道符 在用linux命令时候,我们可以一行执行多条命令或者有条件的执行下一条命令&#xff0c;下面我们讲解…

24.6.2(动态开点线段树)

星期一&#xff1a; cf edu round 36 E cf传送门 题意&#xff1a;1到n天初始全为工作日&#xff0c;有两种操作&#xff0c;将 l-r 区间变为 工作日/休息日&#xff0c;每次操作后询问剩余总工作日有多少 思路&…

【npm】创建和发布无作用域的公共包

目录 1、创建包项目 2、进入目录 3、初始化项目 4、查看当前npm镜像源 5、切换镜像源 6、查看当前登录用户 7、登录 npm 用户 8、发布 9、查看公共包页面 10、删除已发布的npm包 11、&#x1f4da;总结 1、创建包项目 # 在命令行上&#xff0c;为包创建目录 mkdir…

Redis集群方案有哪些?

今天咱们来聊聊Redis集群方案&#xff0c;想象一下Redis是个超级大的储物柜&#xff0c;里面放满了你各种各样的宝贝&#xff08;数据&#xff09;。但随着宝贝越来越多&#xff0c;一个储物柜不够用了&#xff0c;这时候我们就得想方设法扩大空间&#xff0c;还要保证找东西依…

假指纹与活体指纹检测

目录 1. 假指纹简介 2. 假指纹制作流程 3. 活体指纹检测 4. 活体指纹检测竞赛 1. 假指纹简介 随着科学技术的发展&#xff0c;指纹技术以各种各样的形式进入了我们的生活。在大多数情况下&#xff0c;指纹识别应用于移动设备和桌面设备解决方案&#xff0c;以提供安全方便的…

Eclipse语言编程:深入探索与实用技巧

Eclipse语言编程&#xff1a;深入探索与实用技巧 在编程领域&#xff0c;Eclipse以其强大的功能和灵活的扩展性赢得了众多开发者的青睐。然而&#xff0c;对于初学者来说&#xff0c;Eclipse语言编程可能是一个充满挑战和困惑的领域。本文将从四个方面、五个方面、六个方面和七…

android高效读图方式——Hardwarebuffer读图

安卓上有许许多多使用OpenGL来渲染的原因&#xff0c;比方说做特效/动画/硬解/人脸识别等等。渲染完成后如何从gpu中把数据快速读取出来也是高效图像处理中的重要的一环。 相对于glReadPixel的同步读取方式&#xff0c;安卓GLES3.0提供了更高效快速的Hardwarebuffer读图方式&a…

Hyperf 框架常见面试题

Hyperf 是一个高性能的 PHP 微服务框架&#xff0c;它基于 Swoole 提供协程支持&#xff0c;适合构建高并发的服务。在面试中&#xff0c;针对 Hyperf 的问题可能会覆盖框架的基本使用、设计理念、性能优化、微服务实践等多个方面。以下是一些可能的 Hyperf 面试题及简要回答方…

摸鱼大数据——Hive调优1-3

hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation 1、调优方式 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮助定位问题。然而实践中…

Docker 安装部署(CentOS 8)

以下所有操作都是基于 CentOS 8 系统进行操作的。安装的 Docker 版本为 25.0.5-1.el8。 1、卸载老版本 Docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine注&a…

mmdet3D中文注释

# 版权声明: 本代码版权所有 (c) OpenMMLab。 import os from collections import OrderedDict from os import path as osp from typing import List, Tuple, Unionimport mmcv import numpy as np from nuscenes.nuscenes import NuScenes from nuscenes.utils.geometry_util…